Ape Curtis Testnet

Contract

0x9B11bac9ADFEA4A048987E83b6DB0b5034d5A7d1

Overview

APE Balance

Ape Curtis LogoApe Curtis LogoApe Curtis Logo291.666666666666666685 APE

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Deposit164158302025-03-07 22:45:3445 hrs ago1741387534IN
0x9B11bac9...034d5A7d1
1 APE0.00000090.01
Withdraw164158142025-03-07 22:44:0745 hrs ago1741387447IN
0x9B11bac9...034d5A7d1
0 APE0.00000060.01
Claim Batch Self164157252025-03-07 22:34:3245 hrs ago1741386872IN
0x9B11bac9...034d5A7d1
0 APE0.000001310.01
Withdraw164157222025-03-07 22:34:1545 hrs ago1741386855IN
0x9B11bac9...034d5A7d1
0 APE0.00000060.01
Claim Batch Self164157182025-03-07 22:33:4945 hrs ago1741386829IN
0x9B11bac9...034d5A7d1
0 APE0.000001480.01
Claim Batch Self164157112025-03-07 22:33:0545 hrs ago1741386785IN
0x9B11bac9...034d5A7d1
0 APE0.000001010.01
Update Pool164154732025-03-07 22:07:4345 hrs ago1741385263IN
0x9B11bac9...034d5A7d1
0 APE0.000000390.01
Update Pool164154702025-03-07 22:07:3445 hrs ago1741385254IN
0x9B11bac9...034d5A7d1
0 APE0.000000390.01
Update Pool164154672025-03-07 22:07:2245 hrs ago1741385242IN
0x9B11bac9...034d5A7d1
0 APE0.000000390.01
Deposit164152822025-03-07 21:50:4345 hrs ago1741384243IN
0x9B11bac9...034d5A7d1
3 APE0.00000090.01
Deposit164152742025-03-07 21:50:0445 hrs ago1741384204IN
0x9B11bac9...034d5A7d1
5 APE0.000000480.01
Withdraw164152372025-03-07 21:46:4346 hrs ago1741384003IN
0x9B11bac9...034d5A7d1
0 APE0.000000620.01
Deposit164151592025-03-07 21:39:1346 hrs ago1741383553IN
0x9B11bac9...034d5A7d1
1.5 APE0.00000090.01
Deposit164151432025-03-07 21:38:3046 hrs ago1741383510IN
0x9B11bac9...034d5A7d1
1 APE0.000000710.01
Deposit164151252025-03-07 21:36:4446 hrs ago1741383404IN
0x9B11bac9...034d5A7d1
1 wei0.000000230.01
Deposit164151102025-03-07 21:35:1446 hrs ago1741383314IN
0x9B11bac9...034d5A7d1
1 wei0.000000230.01
Deposit164150122025-03-07 21:22:4246 hrs ago1741382562IN
0x9B11bac9...034d5A7d1
1 APE0.00000090.01
Deposit164150072025-03-07 21:22:2446 hrs ago1741382544IN
0x9B11bac9...034d5A7d1
1 APE0.000000960.01
Deposit164150032025-03-07 21:22:0246 hrs ago1741382522IN
0x9B11bac9...034d5A7d1
1 APE0.00000090.01
Deposit164150002025-03-07 21:21:4546 hrs ago1741382505IN
0x9B11bac9...034d5A7d1
2 APE0.00000090.01
Deposit164149942025-03-07 21:21:0946 hrs ago1741382469IN
0x9B11bac9...034d5A7d1
1 APE0.00000090.01
Claim164149822025-03-07 21:20:0546 hrs ago1741382405IN
0x9B11bac9...034d5A7d1
0 APE0.000000880.01
Deposit164146992025-03-07 20:52:5546 hrs ago1741380775IN
0x9B11bac9...034d5A7d1
1 APE0.000000880.01
Deposit164146472025-03-07 20:47:2547 hrs ago1741380445IN
0x9B11bac9...034d5A7d1
1 APE0.000000880.01
Deposit163995632025-03-07 1:30:302 days ago1741311030IN
0x9B11bac9...034d5A7d1
1 APE0.000000880.01
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
164158302025-03-07 22:45:3445 hrs ago1741387534
0x9B11bac9...034d5A7d1
0 APE
164158142025-03-07 22:44:0745 hrs ago1741387447
0x9B11bac9...034d5A7d1
1 APE
164158142025-03-07 22:44:0745 hrs ago1741387447
0x9B11bac9...034d5A7d1
0 APE
164158142025-03-07 22:44:0745 hrs ago1741387447
0x9B11bac9...034d5A7d1
0 APE
164157252025-03-07 22:34:3245 hrs ago1741386872
0x9B11bac9...034d5A7d1
0.16666666 APE
164157252025-03-07 22:34:3245 hrs ago1741386872
0x9B11bac9...034d5A7d1
0 APE
164157252025-03-07 22:34:3245 hrs ago1741386872
0x9B11bac9...034d5A7d1
0.16666666 APE
164157252025-03-07 22:34:3245 hrs ago1741386872
0x9B11bac9...034d5A7d1
0 APE
164157252025-03-07 22:34:3245 hrs ago1741386872
0x9B11bac9...034d5A7d1
0.16666666 APE
164157252025-03-07 22:34:3245 hrs ago1741386872
0x9B11bac9...034d5A7d1
0 APE
164157252025-03-07 22:34:3245 hrs ago1741386872
0x9B11bac9...034d5A7d1
0.33333333 APE
164157252025-03-07 22:34:3245 hrs ago1741386872
0x9B11bac9...034d5A7d1
0 APE
164157252025-03-07 22:34:3245 hrs ago1741386872
0x9B11bac9...034d5A7d1
0 APE
164157252025-03-07 22:34:3245 hrs ago1741386872
0x9B11bac9...034d5A7d1
0 APE
164157252025-03-07 22:34:3245 hrs ago1741386872
0x9B11bac9...034d5A7d1
0 APE
164157252025-03-07 22:34:3245 hrs ago1741386872
0x9B11bac9...034d5A7d1
0 APE
164157222025-03-07 22:34:1545 hrs ago1741386855
0x9B11bac9...034d5A7d1
6 APE
164157222025-03-07 22:34:1545 hrs ago1741386855
0x9B11bac9...034d5A7d1
0 APE
164157222025-03-07 22:34:1545 hrs ago1741386855
0x9B11bac9...034d5A7d1
0 APE
164157182025-03-07 22:33:4945 hrs ago1741386829
0x9B11bac9...034d5A7d1
0.07575757 APE
164157182025-03-07 22:33:4945 hrs ago1741386829
0x9B11bac9...034d5A7d1
0 APE
164157182025-03-07 22:33:4945 hrs ago1741386829
0x9B11bac9...034d5A7d1
0.22727272 APE
164157182025-03-07 22:33:4945 hrs ago1741386829
0x9B11bac9...034d5A7d1
0 APE
164157182025-03-07 22:33:4945 hrs ago1741386829
0x9B11bac9...034d5A7d1
0.45454545 APE
164157182025-03-07 22:33:4945 hrs ago1741386829
0x9B11bac9...034d5A7d1
0 APE
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ApeCoinStaking

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion, MIT license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 5 : ApeCoinStaking.sol
//SPDX-License-Identifier: MIT

/*
ApeStake Smart Contract Disclaimer

The ApeStake smart contract (the “Smart Contract”) was developed at the direction of the ApeCoin DAO community pursuant
to a grant by the Ape Foundation.  The grant instructs the development of the Smart Contract and the developer’s user
interface to enable a non-exclusive, user friendly means of access to the rewards program offered to the APE community
by the Ape Foundation pursuant to the specifications set forth in AIPs 21/22. The Smart Contract is made up of free,
public, open-source or source-available software deployed on the Ethereum Blockchain.

Use Disclaimer.
Your use of the Smart Contract involves various risks, including, but not limited to, losses while digital
assets are being supplied and/or removed from the Smart Contract, losses due to the volatility of token price,
risks in connection with your personal wallet access, system failures, opportunity loss while participating in the
Smart Contract, loss of tokens in connection with non-fungible token transfers, risk of cyber attack and/or security
breach, risk of legal uncertainty and/or changes in legal environment, and additional risks which may be based upon
utilization of any third party other than the Smart Contract developer who provides you with access to the Smart
Contract. Before using the Smart Contract, you should review the relevant documentation to make sure you understand
how the Smart Contract works. Additionally, because you may be able to access the Smart Contract through other web or
mobile interfaces than the Smart Contract developer’s user interface provided pursuant to the Ape Foundation grant,
you are responsible for doing your own diligence on those interfaces to understand the fees and risks they present.

THE SMART CONTRACT IS PROVIDED "AS IS", AT YOUR OWN RISK, AND WITHOUT WARRANTIES OF ANY KIND.
The developer was contracted by APE Foundation to develop the initial code to implement AIP 21/22.
The developer does not own or control the staking rewards program, which is run on the Smart Contracts deployed on
the Ethereum blockchain.  Upgrades and modifications will be managed in a community-driven way by holders of the APE
governance token and may be undertaken and/or implemented with no involvement of the developer.

No liability.
No developer or entity involved in creating the Smart Contract or “platform as a service” will be liable for any
claims or damages whatsoever associated with your use, inability to use, or your interaction with the Smart Contract
or the developer’s user interface provided pursuant to the Ape Foundation grant, including any direct, indirect,
incidental, special, exemplary, punitive or consequential damages, or loss of profits, cryptocurrencies, tokens,
or anything else of value.

Access to Third Parties.
Any party who uses or provides access to the Smart Contract to third parties must (a) not provide such access in
violation of any applicable law or regulation, (b) inform such third parties of any and all risks, and (c) is solely
responsible to such third parties for any and all liability, claims or damages relating to such party’s provision of
access to the Smart Contract.
*/
pragma solidity 0.8.28;

import {SafeCastLib} from "solady/utils/SafeCastLib.sol";
import {LibMap} from "solady/utils/LibMap.sol";
import {Ownable} from "solady/auth/Ownable.sol";
import {IShadowCallbackReceiver} from "./interfaces/IShadowCallbackReceiver.sol";

interface INFTShadow {
    function ownerOf(uint256 tokenId) external view returns (address);
    function readWithCallback(uint256[] calldata tokenIds, uint32[] calldata eids, uint128 callbackGasLimit)
        external
        payable
        returns (bytes32);

    function locked(uint256 tokenId) external view returns (bool);
}

interface IBeacon {
    function quoteRead(
        address baseCollectionAddress,
        uint256[] calldata tokenIds,
        uint32[] calldata dstEids,
        uint128 supplementalGasLimit
    ) external view returns (uint256 nativeFee, uint256 lzTokenFee);
}

/**
 * @title ApeCoin Staking Contract
 * @notice Stake ApeCoin across four different pools that release hourly rewards
 * @author HorizenLabs
 */
contract ApeCoinStaking is IShadowCallbackReceiver, Ownable {
    using SafeCastLib for uint256;
    using SafeCastLib for int256;

    using LibMap for LibMap.Uint16Map;
    using LibMap for LibMap.Uint128Map;

    struct PendingClaim {
        uint8 poolId;
        uint8 requestType;
        address caller;
        address recipient;
        uint96 numNfts;
        LibMap.Uint16Map tokenIds;
        LibMap.Uint128Map amounts;
    }

    /// @notice State for BAYC, MAYC, and BAKC Pools
    struct Pool {
        uint48 lastRewardedTimestampHour;
        uint16 lastRewardsRangeIndex;
        uint96 stakedAmount;
        uint96 accumulatedRewardsPerShare;
        TimeRange[] timeRanges;
    }

    /// @notice Pool rules valid for a given duration of time.
    /// @dev All TimeRange timestamp values must represent whole hours
    struct TimeRange {
        uint48 startTimestampHour;
        uint48 endTimestampHour;
        uint96 rewardsPerHour;
        uint96 capPerPosition;
    }

    /// @dev Convenience struct for front-end applications
    struct PoolUI {
        uint256 poolId;
        uint256 stakedAmount;
        TimeRange currentTimeRange;
    }

    /// @dev Per address amount and reward tracking
    struct Position {
        uint256 stakedAmount;
        int256 rewardsDebt;
    }

    mapping(bytes32 guid => PendingClaim claim) internal _pendingClaims;

    // @dev UI focused payload
    struct DashboardStake {
        uint256 poolId;
        uint256 tokenId;
        uint256 deposited;
        uint256 unclaimed;
        uint256 rewards24hr;
    }

    uint256 private constant _APE_COIN_PRECISION = 1e18;
    uint256 private constant _MIN_DEPOSIT = 1 * _APE_COIN_PRECISION;
    uint256 private constant _SECONDS_PER_HOUR = 3600;
    uint256 private constant _SECONDS_PER_MINUTE = 60;
    uint128 private constant _BASE_CALLBACK_GAS_LIMIT = 60_000;
    uint128 private constant _INCREMENTAL_CALLBACK_GAS_LIMIT = 15_000;

    uint256 private constant _BAYC_POOL_ID = 1;
    uint256 private constant _MAYC_POOL_ID = 2;
    uint256 private constant _BAKC_POOL_ID = 3;

    uint8 private constant _CLAIM_TYPE = 0;
    uint8 private constant _WITHDRAW_TYPE = 1;

    // leave pools[0] null and revert if trying to access it
    Pool[4] public pools;

    IBeacon private _beacon;

    uint32[] private _eids;

    /// @dev NFT contract mapping per pool
    mapping(uint256 => INFTShadow) public nftContracts;
    /// @dev poolId => tokenId => nft position
    mapping(uint256 => mapping(uint256 => Position)) public nftPosition;

    /**
     * Custom Events
     */
    event TimeRangeAdded(
        uint256 indexed poolId,
        uint256 index,
        uint256 startTimestamp,
        uint256 endTimestamp,
        uint256 rewardsPerHour,
        uint256 capPerPosition
    );
    event UpdatePool(
        uint256 indexed poolId, uint256 lastRewardedBlock, uint256 stakedAmount, uint256 accumulatedRewardsPerShare
    );
    event Deposit(address indexed user, uint256 indexed poolId, uint256 amount, uint256 tokenId);
    event Withdraw(address indexed user, uint256 indexed poolId, uint256 amount, address recipient, uint256 tokenId);
    event Claim(address indexed user, uint256 indexed poolId, uint256 amount, uint256 tokenId);
    event RequestSubmitted(
        bytes32 guid, uint8 poolId, uint8 requestType, uint256[] nfts, address recipient, address caller
    );
    event CallbackExecuted(bytes32 guid);

    error RefundFailed();
    error InvalidAmount();
    error InvalidPoolId();
    error WithdrawFailed();
    error CallerNotOwner();
    error TransferFailed();
    error ZeroArrayLength();
    error EndNotWholeHour();
    error InsufficientFee();
    error InvalidRecipient();
    error DistributionEnded();
    error StartNotWholeHour();
    error ExceededCapAmount();
    error MismatchArrayLength();
    error ExceededStakedAmount();
    error DepositMoreThanOneAPE();
    error StartMustEqualLastEnd();
    error StartGreaterThanEnd();

    /**
     * @notice Construct a new ApeCoinStaking instance
     * @param _baycContractAddress The BAYC NFT contract address
     * @param _maycContractAddress The MAYC NFT contract address
     * @param _bakcContractAddress The BAKC NFT contract address
     */
    constructor(
        address beacon,
        address _baycContractAddress,
        address _maycContractAddress,
        address _bakcContractAddress
    ) {
        nftContracts[_BAYC_POOL_ID] = INFTShadow(_baycContractAddress);
        nftContracts[_MAYC_POOL_ID] = INFTShadow(_maycContractAddress);
        nftContracts[_BAKC_POOL_ID] = INFTShadow(_bakcContractAddress);
        _beacon = IBeacon(beacon);

        _initializeOwner(tx.origin);
    }

    modifier validPool(uint256 poolId) {
        if (poolId > _BAKC_POOL_ID || poolId < _BAYC_POOL_ID) {
            revert InvalidPoolId();
        }
        _;
    }

    // Refunds from LZ or other native currency transactions are forwarded to the owner
    receive() external payable {
        (bool success,) = owner().call{value: msg.value}("");
        if (!success) revert RefundFailed();
    }

    // Deposit/Commit Methods
    /**
     * @notice Deposit ApeCoin to an NFT pool
     * @param poolId The pool ID
     * @param tokenIds Array of tokenIds
     * @param amounts Array of amounts
     * @dev Commits 1 or more NFTs, each with an ApeCoin amount to the NFT pool.\
     * Each NFT committed must attach an ApeCoin amount >= 1 ApeCoin and <= the NFT pool cap amount.
     */
    function deposit(uint256 poolId, uint256[] calldata tokenIds, uint256[] calldata amounts)
        external
        payable
        validPool(poolId)
    {
        if (tokenIds.length == 0) revert ZeroArrayLength();
        if (tokenIds.length != amounts.length) revert MismatchArrayLength();

        uint256 totalDeposit = 0;
        for (uint256 i = 0; i < tokenIds.length; ++i) {
            totalDeposit += amounts[i];
        }
        if (msg.value != totalDeposit) revert InvalidAmount();

        _depositNft(poolId, tokenIds, amounts);
    }

    // Claim Rewards Methods
    /**
     * @notice Claim rewards for an NFT pool and send to recipient
     * @param poolId The pool ID
     * @param tokenIds Array of tokenIds
     * @param recipient Address to send claim reward to
     */
    function claim(uint256 poolId, uint256[] calldata tokenIds, address recipient) external payable validPool(poolId) {
        if (tokenIds.length == 0) revert ZeroArrayLength();
        if (recipient == address(0)) revert InvalidRecipient();

        uint256 valueForFees = msg.value;
        valueForFees -= _requestClaim(poolId, tokenIds, recipient, valueForFees);

        _refundIfOver(valueForFees);
    }

    function claimSelf(uint256 poolId, uint256[] calldata tokenIds) external payable validPool(poolId) {
        if (tokenIds.length == 0) revert ZeroArrayLength();

        uint256 valueForFees = msg.value;
        valueForFees -= _requestClaim(poolId, tokenIds, msg.sender, valueForFees);

        _refundIfOver(valueForFees);
    }

    // Uncommit/Withdraw Methods
    /**
     * @notice Withdraw staked ApeCoin from the BAYC pool.  If withdraw is total staked amount, performs an automatic claim.
     * @param tokenIds Array of tokenIds
     * @param amounts Array of amounts
     * @param recipient Address to send withdraw amount and claim to
     */
    function withdraw(uint256 poolId, uint256[] calldata tokenIds, uint256[] calldata amounts, address recipient)
        external
        payable
        validPool(poolId)
    {
        if (tokenIds.length == 0) revert ZeroArrayLength();
        if (tokenIds.length != amounts.length) revert MismatchArrayLength();
        if (recipient == address(0)) revert InvalidRecipient();

        uint256 valueForFees = msg.value;
        valueForFees -= _requestWithdraw(poolId, tokenIds, amounts, recipient, valueForFees);

        _refundIfOver(valueForFees);
    }

    /**
     * @notice Withdraw staked ApeCoin from the BAYC pool.  If withdraw is total staked amount, performs an automatic claim.
     * @param tokenIds Array of tokenIds
     * @param amounts Array of amounts
     */
    function withdrawSelf(uint256 poolId, uint256[] calldata tokenIds, uint256[] calldata amounts)
        external
        payable
        validPool(poolId)
    {
        if (tokenIds.length == 0) revert ZeroArrayLength();
        if (tokenIds.length != amounts.length) revert MismatchArrayLength();

        uint256 valueForFees = msg.value;
        valueForFees -= _requestWithdraw(poolId, tokenIds, amounts, msg.sender, valueForFees);

        _refundIfOver(valueForFees);
    }

    /**
     * @notice Deposit ApeCoin to BAYC, MAYC, and BAKC pools
     * @param baycTokenIds Array of BAYC token IDs
     * @param maycTokenIds Array of MAYC token IDs
     * @param bakcTokenIds Array of BAKC token IDs
     * @param baycAmounts Array of BAYC staked amounts
     * @param maycAmounts Array of MAYC staked amounts
     * @param bakcAmounts Array of BAKC staked amounts
     */
    function depositBatch(
        uint256[] calldata baycTokenIds,
        uint256[] calldata maycTokenIds,
        uint256[] calldata bakcTokenIds,
        uint256[] calldata baycAmounts,
        uint256[] calldata maycAmounts,
        uint256[] calldata bakcAmounts
    ) external payable {
        if (baycTokenIds.length == 0 && maycTokenIds.length == 0 && bakcTokenIds.length == 0) revert ZeroArrayLength();
        if (
            baycTokenIds.length != baycAmounts.length || maycTokenIds.length != maycAmounts.length
                || bakcTokenIds.length != bakcAmounts.length
        ) revert MismatchArrayLength();

        uint256 totalDeposit = 0;
        for (uint256 i = 0; i < baycTokenIds.length; ++i) {
            totalDeposit += baycAmounts[i];
        }
        for (uint256 i = 0; i < maycTokenIds.length; ++i) {
            totalDeposit += maycAmounts[i];
        }
        for (uint256 i = 0; i < bakcTokenIds.length; ++i) {
            totalDeposit += bakcAmounts[i];
        }
        if (msg.value != totalDeposit) revert InvalidAmount();

        if (baycTokenIds.length > 0) _depositNft(_BAYC_POOL_ID, baycTokenIds, baycAmounts);
        if (maycTokenIds.length > 0) _depositNft(_MAYC_POOL_ID, maycTokenIds, maycAmounts);
        if (bakcTokenIds.length > 0) _depositNft(_BAKC_POOL_ID, bakcTokenIds, bakcAmounts);
    }

    /**
     * @notice Claim rewards for array of BAYC, MAYC, and BAKC and send to recipient
     * @param baycTokenIds Array of BAYC token IDs
     * @param maycTokenIds Array of MAYC token IDs
     * @param bakcTokenIds Array of BAKC token IDs
     * @param recipient Address to send claim reward to
     */
    function claimBatch(
        uint256[] calldata baycTokenIds,
        uint256[] calldata maycTokenIds,
        uint256[] calldata bakcTokenIds,
        address recipient
    ) external payable {
        if (baycTokenIds.length == 0 && maycTokenIds.length == 0 && bakcTokenIds.length == 0) revert ZeroArrayLength();
        if (recipient == address(0)) revert InvalidRecipient();
        uint256 valueForFees = msg.value;
        if (baycTokenIds.length > 0) {
            valueForFees -= _requestClaim(_BAYC_POOL_ID, baycTokenIds, recipient, valueForFees);
        }
        if (maycTokenIds.length > 0) {
            valueForFees -= _requestClaim(_MAYC_POOL_ID, maycTokenIds, recipient, valueForFees);
        }
        if (bakcTokenIds.length > 0) {
            valueForFees -= _requestClaim(_BAKC_POOL_ID, bakcTokenIds, recipient, valueForFees);
        }

        _refundIfOver(valueForFees);
    }

    /**
     * @notice Claim rewards for array of BAYC, MAYC, and BAKC
     * @param baycTokenIds Array of BAYC token IDs
     * @param maycTokenIds Array of MAYC token IDs
     * @param bakcTokenIds Array of BAKC token IDs
     */
    function claimBatchSelf(
        uint256[] calldata baycTokenIds,
        uint256[] calldata maycTokenIds,
        uint256[] calldata bakcTokenIds
    ) external payable {
        if (baycTokenIds.length == 0 && maycTokenIds.length == 0 && bakcTokenIds.length == 0) revert ZeroArrayLength();

        uint256 valueForFees = msg.value;
        if (baycTokenIds.length > 0) {
            valueForFees -= _requestClaim(_BAYC_POOL_ID, baycTokenIds, msg.sender, valueForFees);
        }
        if (maycTokenIds.length > 0) {
            valueForFees -= _requestClaim(_MAYC_POOL_ID, maycTokenIds, msg.sender, valueForFees);
        }
        if (bakcTokenIds.length > 0) {
            valueForFees -= _requestClaim(_BAKC_POOL_ID, bakcTokenIds, msg.sender, valueForFees);
        }

        _refundIfOver(valueForFees);
    }

    /**
     * @notice Withdraw staked ApeCoin from the BAYC, MAYC, and BAKC pools.
     * @param baycTokenIds Array of BAYC token IDs
     * @param maycTokenIds Array of MAYC token IDs
     * @param bakcTokenIds Array of BAKC token IDs
     * @param baycAmounts Array of BAYC staked amounts
     * @param maycAmounts Array of MAYC staked amounts
     * @param bakcAmounts Array of BAKC staked amounts
     * @param recipient Address to send withdraw amount and claim to
     */
    function withdrawBatch(
        uint256[] calldata baycTokenIds,
        uint256[] calldata maycTokenIds,
        uint256[] calldata bakcTokenIds,
        uint256[] calldata baycAmounts,
        uint256[] calldata maycAmounts,
        uint256[] calldata bakcAmounts,
        address recipient
    ) external payable {
        if (baycTokenIds.length == 0 && maycTokenIds.length == 0 && bakcTokenIds.length == 0) revert ZeroArrayLength();
        if (
            baycTokenIds.length != baycAmounts.length || maycTokenIds.length != maycAmounts.length
                || bakcTokenIds.length != bakcAmounts.length
        ) revert MismatchArrayLength();
        if (recipient == address(0)) revert InvalidRecipient();

        uint256 valueForFees = msg.value;
        if (baycTokenIds.length > 0) {
            valueForFees -= _requestWithdraw(_BAYC_POOL_ID, baycTokenIds, baycAmounts, recipient, valueForFees);
        }
        if (maycTokenIds.length > 0) {
            valueForFees -= _requestWithdraw(_MAYC_POOL_ID, maycTokenIds, maycAmounts, recipient, valueForFees);
        }
        if (bakcTokenIds.length > 0) {
            valueForFees -= _requestWithdraw(_BAKC_POOL_ID, bakcTokenIds, bakcAmounts, recipient, valueForFees);
        }

        _refundIfOver(valueForFees);
    }

    /**
     * @notice Withdraw staked ApeCoin from the BAYC, MAYC, and BAKC pools.
     * @param baycTokenIds Array of BAYC token IDs
     * @param maycTokenIds Array of MAYC token IDs
     * @param bakcTokenIds Array of BAKC token IDs
     * @param baycAmounts Array of BAYC staked amounts
     * @param maycAmounts Array of MAYC staked amounts
     * @param bakcAmounts Array of BAKC staked amounts
     */
    function withdrawBatchSelf(
        uint256[] calldata baycTokenIds,
        uint256[] calldata maycTokenIds,
        uint256[] calldata bakcTokenIds,
        uint256[] calldata baycAmounts,
        uint256[] calldata maycAmounts,
        uint256[] calldata bakcAmounts
    ) external payable {
        if (baycTokenIds.length == 0 && maycTokenIds.length == 0 && bakcTokenIds.length == 0) revert ZeroArrayLength();
        if (
            baycTokenIds.length != baycAmounts.length || maycTokenIds.length != maycAmounts.length
                || bakcTokenIds.length != bakcAmounts.length
        ) revert MismatchArrayLength();

        uint256 valueForFees = msg.value;
        if (baycTokenIds.length > 0) {
            valueForFees -= _requestWithdraw(_BAYC_POOL_ID, baycTokenIds, baycAmounts, msg.sender, valueForFees);
        }
        if (maycTokenIds.length > 0) {
            valueForFees -= _requestWithdraw(_MAYC_POOL_ID, maycTokenIds, maycAmounts, msg.sender, valueForFees);
        }
        if (bakcTokenIds.length > 0) {
            valueForFees -= _requestWithdraw(_BAKC_POOL_ID, bakcTokenIds, bakcAmounts, msg.sender, valueForFees);
        }

        _refundIfOver(valueForFees);
    }

    // Time Range Methods
    /**
     * @notice Add single time range with a given rewards per hour for a given pool
     * @dev In practice one Time Range will represent one quarter (defined by `_startTimestamp`and `_endTimeStamp` as whole hours)
     * where the rewards per hour is constant for a given pool.
     * @param _poolId Available pool values 1-3
     * @param _amount Total amount of ApeCoin to be distributed over the range
     * @param _startTimestamp Whole hour timestamp representation
     * @param _endTimeStamp Whole hour timestamp representation
     * @param _capPerPosition Per position cap amount determined by poolId
     */
    function addTimeRange(
        uint256 _poolId,
        uint256 _amount,
        uint256 _startTimestamp,
        uint256 _endTimeStamp,
        uint256 _capPerPosition
    ) external payable validPool(_poolId) onlyOwner {
        if (msg.value != _amount) revert InvalidAmount();
        if (_startTimestamp >= _endTimeStamp) revert StartGreaterThanEnd();
        if (getMinute(_startTimestamp) > 0 || getSecond(_startTimestamp) > 0) revert StartNotWholeHour();
        if (getMinute(_endTimeStamp) > 0 || getSecond(_endTimeStamp) > 0) revert EndNotWholeHour();

        Pool storage pool = pools[_poolId];
        uint256 length = pool.timeRanges.length;
        if (length > 0) {
            if (_startTimestamp != pool.timeRanges[length - 1].endTimestampHour) revert StartMustEqualLastEnd();
        }

        uint256 hoursInSeconds = _endTimeStamp - _startTimestamp;
        uint256 rewardsPerHour = _amount * _SECONDS_PER_HOUR / hoursInSeconds;

        TimeRange memory next = TimeRange(
            _startTimestamp.toUint48(), _endTimeStamp.toUint48(), rewardsPerHour.toUint96(), _capPerPosition.toUint96()
        );
        pool.timeRanges.push(next);

        emit TimeRangeAdded(
            _poolId, pool.timeRanges.length - 1, _startTimestamp, _endTimeStamp, rewardsPerHour, _capPerPosition
        );
    }

    /**
     * @notice Set the EIDs for the Shadow contract
     * @param eids These EIDs should be all EIDs supported by the Beacon contract
     */
    function setEids(uint32[] calldata eids) external onlyOwner {
        _eids = eids;
    }

    /**
     * @notice Removes the last Time Range for a given pool.
     * @param _poolId Available pool values 1-3
     */
    function removeLastTimeRange(uint256 _poolId) external validPool(_poolId) onlyOwner {
        pools[_poolId].timeRanges.pop();
    }

    /**
     * @notice Execute callback for a pending claim
     * @param guid The GUID of the pending claim
     */
    function executeCallback(bytes32 guid) external {
        PendingClaim storage _claim = _pendingClaims[guid];

        uint256 poolId = _claim.poolId;
        INFTShadow nftShadow = INFTShadow(address(nftContracts[poolId]));
        if (msg.sender != address(nftShadow)) revert Unauthorized();

        // reassemble the uint16map to tokenIds
        uint256 numNfts = _claim.numNfts;
        uint256[] memory tokenIds = new uint256[](numNfts);
        for (uint256 i = 0; i < numNfts; ++i) {
            tokenIds[i] = uint256(_claim.tokenIds.get(i));
        }

        if (_claim.requestType == _CLAIM_TYPE) {
            _claimNft(poolId, tokenIds, _claim.recipient, _claim.caller);
        } else {
            uint256[] memory amounts = new uint256[](numNfts);
            for (uint256 i = 0; i < numNfts; ++i) {
                amounts[i] = uint256(_claim.amounts.get(i));
            }
            _withdraw(poolId, tokenIds, amounts, _claim.recipient, _claim.caller);
        }

        emit CallbackExecuted(guid);
    }

    /**
     * @notice Lookup method for a TimeRange struct
     * @return TimeRange A Pool's timeRanges struct by index.
     * @param _poolId Available pool values 1-3
     * @param _index Target index in a Pool's timeRanges array
     */
    function getTimeRangeBy(uint256 _poolId, uint256 _index)
        public
        view
        validPool(_poolId)
        returns (TimeRange memory)
    {
        return pools[_poolId].timeRanges[_index];
    }

    // Pool Methods
    /**
     * @notice Lookup available rewards for a pool over a given time range
     * @return uint256 The amount of ApeCoin rewards to be distributed by pool for a given time range
     * @return uint256 The amount of time ranges
     * @param _poolId Available pool values 1-3
     * @param _from Whole hour timestamp representation
     * @param _to Whole hour timestamp representation
     */
    function rewardsBy(uint256 _poolId, uint256 _from, uint256 _to)
        public
        view
        validPool(_poolId)
        returns (uint256, uint256)
    {
        Pool memory pool = pools[_poolId];

        uint256 currentIndex = pool.lastRewardsRangeIndex;
        if (_to < pool.timeRanges[0].startTimestampHour) return (0, currentIndex);

        while (
            _from > pool.timeRanges[currentIndex].endTimestampHour
                && _to > pool.timeRanges[currentIndex].endTimestampHour
        ) {
            unchecked {
                ++currentIndex;
            }
        }

        uint256 rewards;
        TimeRange memory current;
        uint256 startTimestampHour;
        uint256 endTimestampHour;
        uint256 length = pool.timeRanges.length;
        for (uint256 i = currentIndex; i < length; ++i) {
            current = pool.timeRanges[i];
            startTimestampHour = _from <= current.startTimestampHour ? current.startTimestampHour : _from;
            endTimestampHour = _to <= current.endTimestampHour ? _to : current.endTimestampHour;

            rewards = rewards + (endTimestampHour - startTimestampHour) * current.rewardsPerHour / _SECONDS_PER_HOUR;

            if (_to <= endTimestampHour) {
                return (rewards, i);
            }
        }

        return (rewards, length - 1);
    }

    /**
     * @notice Updates reward variables `lastRewardedTimestampHour`, `accumulatedRewardsPerShare` and `lastRewardsRangeIndex`
     * for a given pool.
     * @param _poolId Available pool values 1-3
     */
    function updatePool(uint256 _poolId) public validPool(_poolId) {
        Pool storage pool = pools[_poolId];
        if (pool.timeRanges.length == 0) return;

        if (block.timestamp < pool.timeRanges[0].startTimestampHour) return;
        if (block.timestamp <= pool.lastRewardedTimestampHour + _SECONDS_PER_HOUR) return;

        uint48 lastTimestampHour = pool.timeRanges[pool.timeRanges.length - 1].endTimestampHour;
        uint48 previousTimestampHour = getPreviousTimestampHour().toUint48();

        if (pool.stakedAmount == 0) {
            pool.lastRewardedTimestampHour =
                previousTimestampHour > lastTimestampHour ? lastTimestampHour : previousTimestampHour;
            return;
        }

        (uint256 rewards, uint256 index) = rewardsBy(_poolId, pool.lastRewardedTimestampHour, previousTimestampHour);
        if (pool.lastRewardsRangeIndex != index) {
            pool.lastRewardsRangeIndex = index.toUint16();
        }
        pool.accumulatedRewardsPerShare =
            (pool.accumulatedRewardsPerShare + (rewards * _APE_COIN_PRECISION) / pool.stakedAmount).toUint96();
        pool.lastRewardedTimestampHour =
            previousTimestampHour > lastTimestampHour ? lastTimestampHour : previousTimestampHour;

        emit UpdatePool(_poolId, pool.lastRewardedTimestampHour, pool.stakedAmount, pool.accumulatedRewardsPerShare);
    }

    // Read Methods

    function getCurrentTimeRangeIndex(Pool memory pool) private view returns (uint256) {
        uint256 current = pool.lastRewardsRangeIndex;

        if (block.timestamp < pool.timeRanges[current].startTimestampHour) return current;
        for (current = pool.lastRewardsRangeIndex; current < pool.timeRanges.length; ++current) {
            TimeRange memory currentTimeRange = pool.timeRanges[current];
            if (
                currentTimeRange.startTimestampHour <= block.timestamp
                    && block.timestamp <= currentTimeRange.endTimestampHour
            ) return current;
        }
        revert DistributionEnded();
    }

    /**
     * @notice Fetches a PoolUI struct (poolId, stakedAmount, currentTimeRange) for each reward pool
     * @return PoolUI for BAYC.
     * @return PoolUI for MAYC.
     * @return PoolUI for BAKC.
     */
    function getPoolsUI() external view returns (PoolUI memory, PoolUI memory, PoolUI memory) {
        Pool memory baycPool = pools[1];
        Pool memory maycPool = pools[2];
        Pool memory bakcPool = pools[3];
        uint256 current = getCurrentTimeRangeIndex(baycPool);
        return (
            PoolUI(1, baycPool.stakedAmount, baycPool.timeRanges[current]),
            PoolUI(2, maycPool.stakedAmount, maycPool.timeRanges[current]),
            PoolUI(3, bakcPool.stakedAmount, bakcPool.timeRanges[current])
        );
    }

    /**
     * @notice Fetches an address total staked amount, used by voting contract
     * @param baycTokenIds An array of BAYC token ids
     * @param maycTokenIds An array of MAYC token ids
     * @param bakcTokenIds An array of BAKC token ids
     * @return total uint256 staked amount for all pools.
     */
    function stakedTotal(uint256[] memory baycTokenIds, uint256[] memory maycTokenIds, uint256[] memory bakcTokenIds)
        external
        view
        returns (uint256 total)
    {
        total += _stakedTotal(_BAYC_POOL_ID, baycTokenIds);
        total += _stakedTotal(_MAYC_POOL_ID, maycTokenIds);
        total += _stakedTotal(_BAKC_POOL_ID, bakcTokenIds);

        return total;
    }

    function _stakedTotal(uint256 _poolId, uint256[] memory tokenIds) private view returns (uint256) {
        uint256 total = 0;
        for (uint256 i = 0; i < tokenIds.length; ++i) {
            uint256 tokenId = tokenIds[i];
            total += nftPosition[_poolId][tokenId].stakedAmount;
        }

        return total;
    }

    /**
     * @notice Fetches a DashboardStake = [poolId, tokenId, deposited, unclaimed, rewards24Hrs] \
     * for each pool, for an Ethereum address
     * @return dashboardStakes An array of DashboardStake structs
     * @param _address An Ethereum address
     */
    function getAllStakes(
        address _address,
        uint256[] calldata baycTokenIds,
        uint256[] calldata maycTokenIds,
        uint256[] calldata bakcTokenIds
    ) external view returns (DashboardStake[] memory) {
        DashboardStake[] memory baycStakes = _getStakes(_address, _BAYC_POOL_ID, baycTokenIds);
        DashboardStake[] memory maycStakes = _getStakes(_address, _MAYC_POOL_ID, maycTokenIds);
        DashboardStake[] memory bakcStakes = _getStakes(_address, _BAKC_POOL_ID, bakcTokenIds);

        uint256 count = (baycStakes.length + maycStakes.length + bakcStakes.length);
        DashboardStake[] memory allStakes = new DashboardStake[](count);

        uint256 offset;

        for (uint256 i = 0; i < baycStakes.length; ++i) {
            allStakes[offset] = baycStakes[i];
            ++offset;
        }

        for (uint256 i = 0; i < maycStakes.length; ++i) {
            allStakes[offset] = maycStakes[i];
            ++offset;
        }

        for (uint256 i = 0; i < bakcStakes.length; ++i) {
            allStakes[offset] = bakcStakes[i];
            ++offset;
        }

        return allStakes;
    }

    /**
     * @notice Fetches an array of DashboardStakes for the BAYC pool
     * @return dashboardStakes An array of DashboardStake structs
     */
    function getBaycStakes(address _address, uint256[] memory tokenIds)
        external
        view
        returns (DashboardStake[] memory)
    {
        return _getStakes(_address, _BAYC_POOL_ID, tokenIds);
    }

    /**
     * @notice Fetches an array of DashboardStakes for the MAYC pool
     * @return dashboardStakes An array of DashboardStake structs
     */
    function getMaycStakes(address _address, uint256[] memory tokenIds)
        external
        view
        returns (DashboardStake[] memory)
    {
        return _getStakes(_address, _MAYC_POOL_ID, tokenIds);
    }

    /**
     * @notice Fetches an array of DashboardStakes for the BAKC pool
     * @return dashboardStakes An array of DashboardStake structs
     */
    function getBakcStakes(address _address, uint256[] memory tokenIds)
        external
        view
        returns (DashboardStake[] memory)
    {
        return _getStakes(_address, _BAKC_POOL_ID, tokenIds);
    }

    function _getStakes(address _address, uint256 _poolId, uint256[] memory tokenIds)
        private
        view
        returns (DashboardStake[] memory)
    {
        DashboardStake[] memory dashboardStakes = new DashboardStake[](tokenIds.length);
        uint256 validStakeCount = 0;

        for (uint256 i = 0; i < tokenIds.length; ++i) {
            uint256 tokenId = tokenIds[i];
            // Verify ownership
            if (nftContracts[_poolId].ownerOf(tokenId) == _address) {
                uint256 deposited = nftPosition[_poolId][tokenId].stakedAmount;
                uint256 unclaimed = deposited > 0 ? this.pendingRewards(_poolId, tokenId) : 0;
                uint256 rewards24Hrs = deposited > 0 ? _estimate24HourRewards(_poolId, tokenId) : 0;

                if (deposited > 0 || unclaimed > 0) {
                    dashboardStakes[validStakeCount] =
                        DashboardStake(_poolId, tokenId, deposited, unclaimed, rewards24Hrs);
                    validStakeCount++;
                }
            }
        }

        // Resize array if needed
        if (validStakeCount < tokenIds.length) {
            DashboardStake[] memory resizedStakes = new DashboardStake[](validStakeCount);
            for (uint256 i = 0; i < validStakeCount; ++i) {
                resizedStakes[i] = dashboardStakes[i];
            }
            return resizedStakes;
        }

        return dashboardStakes;
    }

    function _estimate24HourRewards(uint256 _poolId, uint256 _tokenId) private view returns (uint256) {
        Pool memory pool = pools[_poolId];
        Position memory position = nftPosition[_poolId][_tokenId];

        TimeRange memory rewards = getTimeRangeBy(_poolId, pool.lastRewardsRangeIndex);
        return (position.stakedAmount * uint256(rewards.rewardsPerHour) * 24) / uint256(pool.stakedAmount);
    }

    /**
     * @notice Fetches the current amount of claimable ApeCoin rewards for a given position from a given pool.
     * @return uint256 value of pending rewards
     * @param _poolId Available pool values 1-3
     * @param _tokenId An NFT id
     */
    function pendingRewards(uint256 _poolId, uint256 _tokenId) external view returns (uint256) {
        Pool memory pool = pools[_poolId];
        Position memory position = nftPosition[_poolId][_tokenId];

        (uint256 rewardsSinceLastCalculated,) =
            rewardsBy(_poolId, pool.lastRewardedTimestampHour, getPreviousTimestampHour());
        uint256 accumulatedRewardsPerShare = pool.accumulatedRewardsPerShare;

        if (block.timestamp > pool.lastRewardedTimestampHour + _SECONDS_PER_HOUR && pool.stakedAmount != 0) {
            accumulatedRewardsPerShare =
                accumulatedRewardsPerShare + rewardsSinceLastCalculated * _APE_COIN_PRECISION / pool.stakedAmount;
        }
        return ((position.stakedAmount * accumulatedRewardsPerShare).toInt256() - position.rewardsDebt).toUint256()
            / _APE_COIN_PRECISION;
    }

    /**
     * @notice Fetches the LZ fee for a request to read a batch of NFTs from all pools.
     * @return fee uint256 fee for the request
     * @param baycTokenIds An array of BAYC token ids
     * @param maycTokenIds An array of MAYC token ids
     * @param bakcTokenIds An array of BAKC token ids
     */
    function quoteRequestBatch(
        uint256[] calldata baycTokenIds,
        uint256[] calldata maycTokenIds,
        uint256[] calldata bakcTokenIds
    ) external view returns (uint256 fee) {
        unchecked {
            fee += quoteRequest(_BAYC_POOL_ID, baycTokenIds);
            fee += quoteRequest(_MAYC_POOL_ID, maycTokenIds);
            fee += quoteRequest(_BAKC_POOL_ID, bakcTokenIds);
        }

        return fee;
    }

    /**
     * @notice Fetches a PendingClaim struct for a given guid
     * @return poolId uint8 poolId
     * @return requestType uint8 requestType
     * @return caller address caller
     * @return recipient address recipient
     * @return numNfts uint96 numNfts
     * @param guid bytes32 guid
     */
    function pendingClaims(bytes32 guid)
        external
        view
        returns (
            uint8 poolId,
            uint8 requestType,
            address caller,
            address recipient,
            uint96 numNfts
        )
    {
        return (
            _pendingClaims[guid].poolId,
            _pendingClaims[guid].requestType,
            _pendingClaims[guid].caller,
            _pendingClaims[guid].recipient,
            _pendingClaims[guid].numNfts
        );
    }

    /**
     * @notice Fetches the LZ fee for a request to read a batch of NFTs from a given pool.
     * @param poolId Available pool values 1-3
     * @param tokenIds An array of NFT ids
     * @return fee uint256 fee for the request
     */
    function quoteRequest(uint256 poolId, uint256[] calldata tokenIds) public view returns (uint256 fee) {
        if (tokenIds.length == 0) return 0;

        INFTShadow shadowContract = nftContracts[poolId];
        (uint256[] memory lockedNfts,) = _splitNfts(shadowContract, tokenIds);
        if (lockedNfts.length == 0) return 0;

        uint128 callbackGasLimit =
            _BASE_CALLBACK_GAS_LIMIT + _INCREMENTAL_CALLBACK_GAS_LIMIT * uint128(lockedNfts.length);

        // base collection address for BAYC, MAYC, BAKC are same as shadows
        (uint256 nativeFee,) = _beacon.quoteRead(address(shadowContract), tokenIds, _eids, callbackGasLimit);
        return nativeFee;
    }

    // Convenience methods for timestamp calculation
    /// @notice the minutes (0 to 59) of a timestamp
    function getMinute(uint256 timestamp) internal pure returns (uint256 minute) {
        uint256 secs = timestamp % _SECONDS_PER_HOUR;
        minute = secs / _SECONDS_PER_MINUTE;
    }

    /// @notice the seconds (0 to 59) of a timestamp
    function getSecond(uint256 timestamp) internal pure returns (uint256 second) {
        second = timestamp % _SECONDS_PER_MINUTE;
    }

    /// @notice the previous whole hour of a timestamp
    function getPreviousTimestampHour() internal view returns (uint256) {
        return block.timestamp - (getMinute(block.timestamp) * 60 + getSecond(block.timestamp));
    }

    // Private Methods - shared logic
    function _deposit(uint256 _poolId, Position storage _position, uint256 _amount) private {
        Pool storage pool = pools[_poolId];

        _position.stakedAmount += _amount;
        pool.stakedAmount += _amount.toUint96();
        _position.rewardsDebt += (_amount * pool.accumulatedRewardsPerShare).toInt256();
    }

    function _depositNft(uint256 _poolId, uint256[] calldata _tokenIds, uint256[] calldata _amounts) private {
        updatePool(_poolId);
        Position storage position;
        uint256 length = _tokenIds.length;
        for (uint256 i; i < length; ++i) {
            uint256 tokenId = _tokenIds[i];
            position = nftPosition[_poolId][tokenId];
            if (position.stakedAmount == 0) {
                if (nftContracts[_poolId].ownerOf(tokenId) != msg.sender) revert CallerNotOwner();
            }
            uint256 amount = _amounts[i];
            _depositNftGuard(_poolId, position, amount);
            emit Deposit(msg.sender, _poolId, amount, tokenId);
        }
    }

    function _depositNftGuard(uint256 _poolId, Position storage _position, uint256 _amount) private {
        if (_amount < _MIN_DEPOSIT) revert DepositMoreThanOneAPE();
        if (
            _amount + _position.stakedAmount
                > pools[_poolId].timeRanges[pools[_poolId].lastRewardsRangeIndex].capPerPosition
        ) {
            revert ExceededCapAmount();
        }

        _deposit(_poolId, _position, _amount);
    }

    function _claim(uint256 _poolId, Position storage _position, address _recipient)
        private
        returns (uint256 rewardsToBeClaimed)
    {
        Pool storage pool = pools[_poolId];

        int256 accumulatedApeCoins = (_position.stakedAmount * uint256(pool.accumulatedRewardsPerShare)).toInt256();
        rewardsToBeClaimed = (accumulatedApeCoins - _position.rewardsDebt).toUint256() / _APE_COIN_PRECISION;

        _position.rewardsDebt = accumulatedApeCoins;

        if (rewardsToBeClaimed != 0) {
            (bool success,) = _recipient.call{value: rewardsToBeClaimed}("");
            if (!success) revert TransferFailed();
        }
    }

    function _requestClaim(uint256 _poolId, uint256[] calldata _nfts, address _recipient, uint256 valueForFees)
        private
        returns (uint256 fee)
    {
        // pass _nfts a second time in place of amounts, it gets ignored in the claim context
        fee = _request(_poolId, _nfts, _nfts, _recipient, _CLAIM_TYPE, valueForFees);
    }

    function _requestWithdraw(
        uint256 _poolId,
        uint256[] calldata _tokenIds,
        uint256[] calldata _amounts,
        address _recipient,
        uint256 valueForFees
    ) private returns (uint256 fee) {
        fee = _request(_poolId, _tokenIds, _amounts, _recipient, _WITHDRAW_TYPE, valueForFees);
    }

    function _request(
        uint256 _poolId,
        uint256[] calldata _tokenIds,
        uint256[] calldata _amounts,
        address _recipient,
        uint8 _type,
        uint256 valueForFees
    ) private returns (uint256 fee) {
        INFTShadow _shadowContract = nftContracts[_poolId];

        (uint256[] memory lockedNfts, uint256[] memory unlockedNfts) = _splitNfts(_shadowContract, _tokenIds);

        uint256 lockedNftsCount = lockedNfts.length;
        if (lockedNftsCount > 0) {
            uint128 callbackGasLimit =
                _BASE_CALLBACK_GAS_LIMIT + _INCREMENTAL_CALLBACK_GAS_LIMIT * uint128(lockedNftsCount);
            (fee,) = _beacon.quoteRead(address(_shadowContract), lockedNfts, _eids, callbackGasLimit);
            if (valueForFees < fee) revert InsufficientFee();

            bytes32 guid = _shadowContract.readWithCallback{value: fee}(lockedNfts, _eids, callbackGasLimit);

            _pendingClaims[guid].poolId = uint8(_poolId);
            _pendingClaims[guid].requestType = _type;
            _pendingClaims[guid].recipient = _recipient;
            _pendingClaims[guid].numNfts = uint96(lockedNftsCount);
            _pendingClaims[guid].caller = msg.sender;

            for (uint256 i; i < lockedNftsCount; ++i) {
                _pendingClaims[guid].tokenIds.set(i, lockedNfts[i].toUint16());
                if (_type == _WITHDRAW_TYPE) {
                    _pendingClaims[guid].amounts.set(i, _amounts[i].toUint128());
                }
            }

            emit RequestSubmitted(guid, uint8(_poolId), _type, lockedNfts, _recipient, msg.sender);
        }

        if (unlockedNfts.length > 0) {
            if (_type == _CLAIM_TYPE) {
                _claimNft(_poolId, unlockedNfts, _recipient, msg.sender);
            } else if (_type == _WITHDRAW_TYPE) {
                _withdraw(_poolId, unlockedNfts, _amounts, _recipient, msg.sender);
            }
        }
    }

    function _splitNfts(INFTShadow _shadowContract, uint256[] memory _tokenIds)
        private
        view
        returns (uint256[] memory, uint256[] memory)
    {
        uint256[] memory lockedNftsRaw = new uint256[](_tokenIds.length);
        uint256[] memory unlockedNftsRaw = new uint256[](_tokenIds.length);
        uint256 lockedNftsCount = 0;
        uint256 unlockedNftsCount = 0;

        for (uint256 i; i < _tokenIds.length; ++i) {
            if (_shadowContract.locked(_tokenIds[i])) {
                lockedNftsRaw[lockedNftsCount] = _tokenIds[i];
                unchecked {
                    ++lockedNftsCount;
                }
            } else {
                unlockedNftsRaw[unlockedNftsCount] = _tokenIds[i];
                unchecked {
                    ++unlockedNftsCount;
                }
            }
        }

        // resize arrays
        uint256[] memory lockedNfts = new uint256[](lockedNftsCount);
        uint256[] memory unlockedNfts = new uint256[](unlockedNftsCount);

        for (uint256 i; i < lockedNftsCount; ++i) {
            lockedNfts[i] = lockedNftsRaw[i];
        }
        for (uint256 i; i < unlockedNftsCount; ++i) {
            unlockedNfts[i] = unlockedNftsRaw[i];
        }

        return (lockedNfts, unlockedNfts);
    }

    function _claimNft(uint256 _poolId, uint256[] memory _tokenIds, address _recipient, address _caller) private {
        updatePool(_poolId);

        INFTShadow shadowContract = nftContracts[_poolId];

        for (uint256 i; i < _tokenIds.length; ++i) {
            uint256 tokenId = _tokenIds[i];
            if (shadowContract.ownerOf(tokenId) != _caller) revert CallerNotOwner();

            Position storage position = nftPosition[_poolId][tokenId];
            uint256 rewardsToBeClaimed = _claim(_poolId, position, _recipient);

            emit Claim(_caller, _poolId, rewardsToBeClaimed, tokenId);
        }
    }

    function _withdraw(
        uint256 _poolId,
        uint256[] memory _tokenIds,
        uint256[] memory _amounts,
        address _recipient,
        address _caller
    ) private {
        updatePool(_poolId);
        uint256 tokenId;
        uint256 amount;
        uint256 length = _tokenIds.length;
        uint256 totalWithdraw;
        Position storage position;
        for (uint256 i; i < length; ++i) {
            tokenId = _tokenIds[i];
            if (nftContracts[_poolId].ownerOf(tokenId) != _caller) revert CallerNotOwner();

            amount = _amounts[i];
            position = nftPosition[_poolId][tokenId];
            if (amount == position.stakedAmount) {
                uint256 rewardsToBeClaimed = _claim(_poolId, position, _recipient);
                emit Claim(_caller, _poolId, rewardsToBeClaimed, tokenId);
            }

            if (amount > position.stakedAmount) revert ExceededStakedAmount();

            Pool storage pool = pools[_poolId];

            unchecked {
                position.stakedAmount -= amount;
                pool.stakedAmount -= amount.toUint96();
                position.rewardsDebt -= (amount * pool.accumulatedRewardsPerShare).toInt256();

                totalWithdraw += amount;
            }

            emit Withdraw(_caller, _poolId, amount, _recipient, tokenId);
        }

        if (totalWithdraw > 0) {
            (bool success,) = _recipient.call{value: totalWithdraw}("");
            if (!success) revert WithdrawFailed();
        }
    }

    function _refundIfOver(uint256 valueForFees) private {
        if (valueForFees > 0) {
            (bool success,) = msg.sender.call{value: valueForFees}("");
            if (!success) revert RefundFailed();
        }
    }
}

File 2 of 5 : SafeCastLib.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Safe integer casting library that reverts on overflow.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeCastLib.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeCast.sol)
/// @dev Optimized for runtime gas for very high number of optimizer runs (i.e. >= 1000000).
library SafeCastLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Unable to cast to the target type due to overflow.
    error Overflow();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*          UNSIGNED INTEGER SAFE CASTING OPERATIONS          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Casts `x` to a uint8. Reverts on overflow.
    function toUint8(uint256 x) internal pure returns (uint8) {
        if (x >= 1 << 8) _revertOverflow();
        return uint8(x);
    }

    /// @dev Casts `x` to a uint16. Reverts on overflow.
    function toUint16(uint256 x) internal pure returns (uint16) {
        if (x >= 1 << 16) _revertOverflow();
        return uint16(x);
    }

    /// @dev Casts `x` to a uint24. Reverts on overflow.
    function toUint24(uint256 x) internal pure returns (uint24) {
        if (x >= 1 << 24) _revertOverflow();
        return uint24(x);
    }

    /// @dev Casts `x` to a uint32. Reverts on overflow.
    function toUint32(uint256 x) internal pure returns (uint32) {
        if (x >= 1 << 32) _revertOverflow();
        return uint32(x);
    }

    /// @dev Casts `x` to a uint40. Reverts on overflow.
    function toUint40(uint256 x) internal pure returns (uint40) {
        if (x >= 1 << 40) _revertOverflow();
        return uint40(x);
    }

    /// @dev Casts `x` to a uint48. Reverts on overflow.
    function toUint48(uint256 x) internal pure returns (uint48) {
        if (x >= 1 << 48) _revertOverflow();
        return uint48(x);
    }

    /// @dev Casts `x` to a uint56. Reverts on overflow.
    function toUint56(uint256 x) internal pure returns (uint56) {
        if (x >= 1 << 56) _revertOverflow();
        return uint56(x);
    }

    /// @dev Casts `x` to a uint64. Reverts on overflow.
    function toUint64(uint256 x) internal pure returns (uint64) {
        if (x >= 1 << 64) _revertOverflow();
        return uint64(x);
    }

    /// @dev Casts `x` to a uint72. Reverts on overflow.
    function toUint72(uint256 x) internal pure returns (uint72) {
        if (x >= 1 << 72) _revertOverflow();
        return uint72(x);
    }

    /// @dev Casts `x` to a uint80. Reverts on overflow.
    function toUint80(uint256 x) internal pure returns (uint80) {
        if (x >= 1 << 80) _revertOverflow();
        return uint80(x);
    }

    /// @dev Casts `x` to a uint88. Reverts on overflow.
    function toUint88(uint256 x) internal pure returns (uint88) {
        if (x >= 1 << 88) _revertOverflow();
        return uint88(x);
    }

    /// @dev Casts `x` to a uint96. Reverts on overflow.
    function toUint96(uint256 x) internal pure returns (uint96) {
        if (x >= 1 << 96) _revertOverflow();
        return uint96(x);
    }

    /// @dev Casts `x` to a uint104. Reverts on overflow.
    function toUint104(uint256 x) internal pure returns (uint104) {
        if (x >= 1 << 104) _revertOverflow();
        return uint104(x);
    }

    /// @dev Casts `x` to a uint112. Reverts on overflow.
    function toUint112(uint256 x) internal pure returns (uint112) {
        if (x >= 1 << 112) _revertOverflow();
        return uint112(x);
    }

    /// @dev Casts `x` to a uint120. Reverts on overflow.
    function toUint120(uint256 x) internal pure returns (uint120) {
        if (x >= 1 << 120) _revertOverflow();
        return uint120(x);
    }

    /// @dev Casts `x` to a uint128. Reverts on overflow.
    function toUint128(uint256 x) internal pure returns (uint128) {
        if (x >= 1 << 128) _revertOverflow();
        return uint128(x);
    }

    /// @dev Casts `x` to a uint136. Reverts on overflow.
    function toUint136(uint256 x) internal pure returns (uint136) {
        if (x >= 1 << 136) _revertOverflow();
        return uint136(x);
    }

    /// @dev Casts `x` to a uint144. Reverts on overflow.
    function toUint144(uint256 x) internal pure returns (uint144) {
        if (x >= 1 << 144) _revertOverflow();
        return uint144(x);
    }

    /// @dev Casts `x` to a uint152. Reverts on overflow.
    function toUint152(uint256 x) internal pure returns (uint152) {
        if (x >= 1 << 152) _revertOverflow();
        return uint152(x);
    }

    /// @dev Casts `x` to a uint160. Reverts on overflow.
    function toUint160(uint256 x) internal pure returns (uint160) {
        if (x >= 1 << 160) _revertOverflow();
        return uint160(x);
    }

    /// @dev Casts `x` to a uint168. Reverts on overflow.
    function toUint168(uint256 x) internal pure returns (uint168) {
        if (x >= 1 << 168) _revertOverflow();
        return uint168(x);
    }

    /// @dev Casts `x` to a uint176. Reverts on overflow.
    function toUint176(uint256 x) internal pure returns (uint176) {
        if (x >= 1 << 176) _revertOverflow();
        return uint176(x);
    }

    /// @dev Casts `x` to a uint184. Reverts on overflow.
    function toUint184(uint256 x) internal pure returns (uint184) {
        if (x >= 1 << 184) _revertOverflow();
        return uint184(x);
    }

    /// @dev Casts `x` to a uint192. Reverts on overflow.
    function toUint192(uint256 x) internal pure returns (uint192) {
        if (x >= 1 << 192) _revertOverflow();
        return uint192(x);
    }

    /// @dev Casts `x` to a uint200. Reverts on overflow.
    function toUint200(uint256 x) internal pure returns (uint200) {
        if (x >= 1 << 200) _revertOverflow();
        return uint200(x);
    }

    /// @dev Casts `x` to a uint208. Reverts on overflow.
    function toUint208(uint256 x) internal pure returns (uint208) {
        if (x >= 1 << 208) _revertOverflow();
        return uint208(x);
    }

    /// @dev Casts `x` to a uint216. Reverts on overflow.
    function toUint216(uint256 x) internal pure returns (uint216) {
        if (x >= 1 << 216) _revertOverflow();
        return uint216(x);
    }

    /// @dev Casts `x` to a uint224. Reverts on overflow.
    function toUint224(uint256 x) internal pure returns (uint224) {
        if (x >= 1 << 224) _revertOverflow();
        return uint224(x);
    }

    /// @dev Casts `x` to a uint232. Reverts on overflow.
    function toUint232(uint256 x) internal pure returns (uint232) {
        if (x >= 1 << 232) _revertOverflow();
        return uint232(x);
    }

    /// @dev Casts `x` to a uint240. Reverts on overflow.
    function toUint240(uint256 x) internal pure returns (uint240) {
        if (x >= 1 << 240) _revertOverflow();
        return uint240(x);
    }

    /// @dev Casts `x` to a uint248. Reverts on overflow.
    function toUint248(uint256 x) internal pure returns (uint248) {
        if (x >= 1 << 248) _revertOverflow();
        return uint248(x);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*           SIGNED INTEGER SAFE CASTING OPERATIONS           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Casts `x` to a int8. Reverts on overflow.
    function toInt8(int256 x) internal pure returns (int8) {
        unchecked {
            if (((1 << 7) + uint256(x)) >> 8 == uint256(0)) return int8(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int16. Reverts on overflow.
    function toInt16(int256 x) internal pure returns (int16) {
        unchecked {
            if (((1 << 15) + uint256(x)) >> 16 == uint256(0)) return int16(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int24. Reverts on overflow.
    function toInt24(int256 x) internal pure returns (int24) {
        unchecked {
            if (((1 << 23) + uint256(x)) >> 24 == uint256(0)) return int24(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int32. Reverts on overflow.
    function toInt32(int256 x) internal pure returns (int32) {
        unchecked {
            if (((1 << 31) + uint256(x)) >> 32 == uint256(0)) return int32(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int40. Reverts on overflow.
    function toInt40(int256 x) internal pure returns (int40) {
        unchecked {
            if (((1 << 39) + uint256(x)) >> 40 == uint256(0)) return int40(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int48. Reverts on overflow.
    function toInt48(int256 x) internal pure returns (int48) {
        unchecked {
            if (((1 << 47) + uint256(x)) >> 48 == uint256(0)) return int48(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int56. Reverts on overflow.
    function toInt56(int256 x) internal pure returns (int56) {
        unchecked {
            if (((1 << 55) + uint256(x)) >> 56 == uint256(0)) return int56(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int64. Reverts on overflow.
    function toInt64(int256 x) internal pure returns (int64) {
        unchecked {
            if (((1 << 63) + uint256(x)) >> 64 == uint256(0)) return int64(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int72. Reverts on overflow.
    function toInt72(int256 x) internal pure returns (int72) {
        unchecked {
            if (((1 << 71) + uint256(x)) >> 72 == uint256(0)) return int72(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int80. Reverts on overflow.
    function toInt80(int256 x) internal pure returns (int80) {
        unchecked {
            if (((1 << 79) + uint256(x)) >> 80 == uint256(0)) return int80(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int88. Reverts on overflow.
    function toInt88(int256 x) internal pure returns (int88) {
        unchecked {
            if (((1 << 87) + uint256(x)) >> 88 == uint256(0)) return int88(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int96. Reverts on overflow.
    function toInt96(int256 x) internal pure returns (int96) {
        unchecked {
            if (((1 << 95) + uint256(x)) >> 96 == uint256(0)) return int96(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int104. Reverts on overflow.
    function toInt104(int256 x) internal pure returns (int104) {
        unchecked {
            if (((1 << 103) + uint256(x)) >> 104 == uint256(0)) return int104(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int112. Reverts on overflow.
    function toInt112(int256 x) internal pure returns (int112) {
        unchecked {
            if (((1 << 111) + uint256(x)) >> 112 == uint256(0)) return int112(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int120. Reverts on overflow.
    function toInt120(int256 x) internal pure returns (int120) {
        unchecked {
            if (((1 << 119) + uint256(x)) >> 120 == uint256(0)) return int120(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int128. Reverts on overflow.
    function toInt128(int256 x) internal pure returns (int128) {
        unchecked {
            if (((1 << 127) + uint256(x)) >> 128 == uint256(0)) return int128(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int136. Reverts on overflow.
    function toInt136(int256 x) internal pure returns (int136) {
        unchecked {
            if (((1 << 135) + uint256(x)) >> 136 == uint256(0)) return int136(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int144. Reverts on overflow.
    function toInt144(int256 x) internal pure returns (int144) {
        unchecked {
            if (((1 << 143) + uint256(x)) >> 144 == uint256(0)) return int144(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int152. Reverts on overflow.
    function toInt152(int256 x) internal pure returns (int152) {
        unchecked {
            if (((1 << 151) + uint256(x)) >> 152 == uint256(0)) return int152(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int160. Reverts on overflow.
    function toInt160(int256 x) internal pure returns (int160) {
        unchecked {
            if (((1 << 159) + uint256(x)) >> 160 == uint256(0)) return int160(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int168. Reverts on overflow.
    function toInt168(int256 x) internal pure returns (int168) {
        unchecked {
            if (((1 << 167) + uint256(x)) >> 168 == uint256(0)) return int168(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int176. Reverts on overflow.
    function toInt176(int256 x) internal pure returns (int176) {
        unchecked {
            if (((1 << 175) + uint256(x)) >> 176 == uint256(0)) return int176(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int184. Reverts on overflow.
    function toInt184(int256 x) internal pure returns (int184) {
        unchecked {
            if (((1 << 183) + uint256(x)) >> 184 == uint256(0)) return int184(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int192. Reverts on overflow.
    function toInt192(int256 x) internal pure returns (int192) {
        unchecked {
            if (((1 << 191) + uint256(x)) >> 192 == uint256(0)) return int192(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int200. Reverts on overflow.
    function toInt200(int256 x) internal pure returns (int200) {
        unchecked {
            if (((1 << 199) + uint256(x)) >> 200 == uint256(0)) return int200(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int208. Reverts on overflow.
    function toInt208(int256 x) internal pure returns (int208) {
        unchecked {
            if (((1 << 207) + uint256(x)) >> 208 == uint256(0)) return int208(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int216. Reverts on overflow.
    function toInt216(int256 x) internal pure returns (int216) {
        unchecked {
            if (((1 << 215) + uint256(x)) >> 216 == uint256(0)) return int216(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int224. Reverts on overflow.
    function toInt224(int256 x) internal pure returns (int224) {
        unchecked {
            if (((1 << 223) + uint256(x)) >> 224 == uint256(0)) return int224(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int232. Reverts on overflow.
    function toInt232(int256 x) internal pure returns (int232) {
        unchecked {
            if (((1 << 231) + uint256(x)) >> 232 == uint256(0)) return int232(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int240. Reverts on overflow.
    function toInt240(int256 x) internal pure returns (int240) {
        unchecked {
            if (((1 << 239) + uint256(x)) >> 240 == uint256(0)) return int240(x);
            _revertOverflow();
        }
    }

    /// @dev Casts `x` to a int248. Reverts on overflow.
    function toInt248(int256 x) internal pure returns (int248) {
        unchecked {
            if (((1 << 247) + uint256(x)) >> 248 == uint256(0)) return int248(x);
            _revertOverflow();
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*               OTHER SAFE CASTING OPERATIONS                */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Casts `x` to a int8. Reverts on overflow.
    function toInt8(uint256 x) internal pure returns (int8) {
        if (x >= 1 << 7) _revertOverflow();
        return int8(int256(x));
    }

    /// @dev Casts `x` to a int16. Reverts on overflow.
    function toInt16(uint256 x) internal pure returns (int16) {
        if (x >= 1 << 15) _revertOverflow();
        return int16(int256(x));
    }

    /// @dev Casts `x` to a int24. Reverts on overflow.
    function toInt24(uint256 x) internal pure returns (int24) {
        if (x >= 1 << 23) _revertOverflow();
        return int24(int256(x));
    }

    /// @dev Casts `x` to a int32. Reverts on overflow.
    function toInt32(uint256 x) internal pure returns (int32) {
        if (x >= 1 << 31) _revertOverflow();
        return int32(int256(x));
    }

    /// @dev Casts `x` to a int40. Reverts on overflow.
    function toInt40(uint256 x) internal pure returns (int40) {
        if (x >= 1 << 39) _revertOverflow();
        return int40(int256(x));
    }

    /// @dev Casts `x` to a int48. Reverts on overflow.
    function toInt48(uint256 x) internal pure returns (int48) {
        if (x >= 1 << 47) _revertOverflow();
        return int48(int256(x));
    }

    /// @dev Casts `x` to a int56. Reverts on overflow.
    function toInt56(uint256 x) internal pure returns (int56) {
        if (x >= 1 << 55) _revertOverflow();
        return int56(int256(x));
    }

    /// @dev Casts `x` to a int64. Reverts on overflow.
    function toInt64(uint256 x) internal pure returns (int64) {
        if (x >= 1 << 63) _revertOverflow();
        return int64(int256(x));
    }

    /// @dev Casts `x` to a int72. Reverts on overflow.
    function toInt72(uint256 x) internal pure returns (int72) {
        if (x >= 1 << 71) _revertOverflow();
        return int72(int256(x));
    }

    /// @dev Casts `x` to a int80. Reverts on overflow.
    function toInt80(uint256 x) internal pure returns (int80) {
        if (x >= 1 << 79) _revertOverflow();
        return int80(int256(x));
    }

    /// @dev Casts `x` to a int88. Reverts on overflow.
    function toInt88(uint256 x) internal pure returns (int88) {
        if (x >= 1 << 87) _revertOverflow();
        return int88(int256(x));
    }

    /// @dev Casts `x` to a int96. Reverts on overflow.
    function toInt96(uint256 x) internal pure returns (int96) {
        if (x >= 1 << 95) _revertOverflow();
        return int96(int256(x));
    }

    /// @dev Casts `x` to a int104. Reverts on overflow.
    function toInt104(uint256 x) internal pure returns (int104) {
        if (x >= 1 << 103) _revertOverflow();
        return int104(int256(x));
    }

    /// @dev Casts `x` to a int112. Reverts on overflow.
    function toInt112(uint256 x) internal pure returns (int112) {
        if (x >= 1 << 111) _revertOverflow();
        return int112(int256(x));
    }

    /// @dev Casts `x` to a int120. Reverts on overflow.
    function toInt120(uint256 x) internal pure returns (int120) {
        if (x >= 1 << 119) _revertOverflow();
        return int120(int256(x));
    }

    /// @dev Casts `x` to a int128. Reverts on overflow.
    function toInt128(uint256 x) internal pure returns (int128) {
        if (x >= 1 << 127) _revertOverflow();
        return int128(int256(x));
    }

    /// @dev Casts `x` to a int136. Reverts on overflow.
    function toInt136(uint256 x) internal pure returns (int136) {
        if (x >= 1 << 135) _revertOverflow();
        return int136(int256(x));
    }

    /// @dev Casts `x` to a int144. Reverts on overflow.
    function toInt144(uint256 x) internal pure returns (int144) {
        if (x >= 1 << 143) _revertOverflow();
        return int144(int256(x));
    }

    /// @dev Casts `x` to a int152. Reverts on overflow.
    function toInt152(uint256 x) internal pure returns (int152) {
        if (x >= 1 << 151) _revertOverflow();
        return int152(int256(x));
    }

    /// @dev Casts `x` to a int160. Reverts on overflow.
    function toInt160(uint256 x) internal pure returns (int160) {
        if (x >= 1 << 159) _revertOverflow();
        return int160(int256(x));
    }

    /// @dev Casts `x` to a int168. Reverts on overflow.
    function toInt168(uint256 x) internal pure returns (int168) {
        if (x >= 1 << 167) _revertOverflow();
        return int168(int256(x));
    }

    /// @dev Casts `x` to a int176. Reverts on overflow.
    function toInt176(uint256 x) internal pure returns (int176) {
        if (x >= 1 << 175) _revertOverflow();
        return int176(int256(x));
    }

    /// @dev Casts `x` to a int184. Reverts on overflow.
    function toInt184(uint256 x) internal pure returns (int184) {
        if (x >= 1 << 183) _revertOverflow();
        return int184(int256(x));
    }

    /// @dev Casts `x` to a int192. Reverts on overflow.
    function toInt192(uint256 x) internal pure returns (int192) {
        if (x >= 1 << 191) _revertOverflow();
        return int192(int256(x));
    }

    /// @dev Casts `x` to a int200. Reverts on overflow.
    function toInt200(uint256 x) internal pure returns (int200) {
        if (x >= 1 << 199) _revertOverflow();
        return int200(int256(x));
    }

    /// @dev Casts `x` to a int208. Reverts on overflow.
    function toInt208(uint256 x) internal pure returns (int208) {
        if (x >= 1 << 207) _revertOverflow();
        return int208(int256(x));
    }

    /// @dev Casts `x` to a int216. Reverts on overflow.
    function toInt216(uint256 x) internal pure returns (int216) {
        if (x >= 1 << 215) _revertOverflow();
        return int216(int256(x));
    }

    /// @dev Casts `x` to a int224. Reverts on overflow.
    function toInt224(uint256 x) internal pure returns (int224) {
        if (x >= 1 << 223) _revertOverflow();
        return int224(int256(x));
    }

    /// @dev Casts `x` to a int232. Reverts on overflow.
    function toInt232(uint256 x) internal pure returns (int232) {
        if (x >= 1 << 231) _revertOverflow();
        return int232(int256(x));
    }

    /// @dev Casts `x` to a int240. Reverts on overflow.
    function toInt240(uint256 x) internal pure returns (int240) {
        if (x >= 1 << 239) _revertOverflow();
        return int240(int256(x));
    }

    /// @dev Casts `x` to a int248. Reverts on overflow.
    function toInt248(uint256 x) internal pure returns (int248) {
        if (x >= 1 << 247) _revertOverflow();
        return int248(int256(x));
    }

    /// @dev Casts `x` to a int256. Reverts on overflow.
    function toInt256(uint256 x) internal pure returns (int256) {
        if (int256(x) >= 0) return int256(x);
        _revertOverflow();
    }

    /// @dev Casts `x` to a uint256. Reverts on overflow.
    function toUint256(int256 x) internal pure returns (uint256) {
        if (x >= 0) return uint256(x);
        _revertOverflow();
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                      PRIVATE HELPERS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    function _revertOverflow() private pure {
        /// @solidity memory-safe-assembly
        assembly {
            // Store the function selector of `Overflow()`.
            mstore(0x00, 0x35278d12)
            // Revert with (offset, size).
            revert(0x1c, 0x04)
        }
    }
}

File 3 of 5 : LibMap.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Library for storage of packed unsigned integers.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibMap.sol)
library LibMap {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STRUCTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev A uint8 map in storage.
    struct Uint8Map {
        mapping(uint256 => uint256) map;
    }

    /// @dev A uint16 map in storage.
    struct Uint16Map {
        mapping(uint256 => uint256) map;
    }

    /// @dev A uint32 map in storage.
    struct Uint32Map {
        mapping(uint256 => uint256) map;
    }

    /// @dev A uint40 map in storage. Useful for storing timestamps up to 34841 A.D.
    struct Uint40Map {
        mapping(uint256 => uint256) map;
    }

    /// @dev A uint64 map in storage.
    struct Uint64Map {
        mapping(uint256 => uint256) map;
    }

    /// @dev A uint128 map in storage.
    struct Uint128Map {
        mapping(uint256 => uint256) map;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     GETTERS / SETTERS                      */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the uint8 value at `index` in `map`.
    function get(Uint8Map storage map, uint256 index) internal view returns (uint8 result) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, map.slot)
            mstore(0x00, shr(5, index))
            result := byte(and(31, not(index)), sload(keccak256(0x00, 0x40)))
        }
    }

    /// @dev Updates the uint8 value at `index` in `map`.
    function set(Uint8Map storage map, uint256 index, uint8 value) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, map.slot)
            mstore(0x00, shr(5, index))
            let s := keccak256(0x00, 0x40) // Storage slot.
            mstore(0x00, sload(s))
            mstore8(and(31, not(index)), value)
            sstore(s, mload(0x00))
        }
    }

    /// @dev Returns the uint16 value at `index` in `map`.
    function get(Uint16Map storage map, uint256 index) internal view returns (uint16 result) {
        result = uint16(map.map[index >> 4] >> ((index & 15) << 4));
    }

    /// @dev Updates the uint16 value at `index` in `map`.
    function set(Uint16Map storage map, uint256 index, uint16 value) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, map.slot)
            mstore(0x00, shr(4, index))
            let s := keccak256(0x00, 0x40) // Storage slot.
            let o := shl(4, and(index, 15)) // Storage slot offset (bits).
            let v := sload(s) // Storage slot value.
            let m := 0xffff // Value mask.
            sstore(s, xor(v, shl(o, and(m, xor(shr(o, v), value)))))
        }
    }

    /// @dev Returns the uint32 value at `index` in `map`.
    function get(Uint32Map storage map, uint256 index) internal view returns (uint32 result) {
        result = uint32(map.map[index >> 3] >> ((index & 7) << 5));
    }

    /// @dev Updates the uint32 value at `index` in `map`.
    function set(Uint32Map storage map, uint256 index, uint32 value) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, map.slot)
            mstore(0x00, shr(3, index))
            let s := keccak256(0x00, 0x40) // Storage slot.
            let o := shl(5, and(index, 7)) // Storage slot offset (bits).
            let v := sload(s) // Storage slot value.
            let m := 0xffffffff // Value mask.
            sstore(s, xor(v, shl(o, and(m, xor(shr(o, v), value)))))
        }
    }

    /// @dev Returns the uint40 value at `index` in `map`.
    function get(Uint40Map storage map, uint256 index) internal view returns (uint40 result) {
        unchecked {
            result = uint40(map.map[index / 6] >> ((index % 6) * 40));
        }
    }

    /// @dev Updates the uint40 value at `index` in `map`.
    function set(Uint40Map storage map, uint256 index, uint40 value) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, map.slot)
            mstore(0x00, div(index, 6))
            let s := keccak256(0x00, 0x40) // Storage slot.
            let o := mul(40, mod(index, 6)) // Storage slot offset (bits).
            let v := sload(s) // Storage slot value.
            let m := 0xffffffffff // Value mask.
            sstore(s, xor(v, shl(o, and(m, xor(shr(o, v), value)))))
        }
    }

    /// @dev Returns the uint64 value at `index` in `map`.
    function get(Uint64Map storage map, uint256 index) internal view returns (uint64 result) {
        result = uint64(map.map[index >> 2] >> ((index & 3) << 6));
    }

    /// @dev Updates the uint64 value at `index` in `map`.
    function set(Uint64Map storage map, uint256 index, uint64 value) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, map.slot)
            mstore(0x00, shr(2, index))
            let s := keccak256(0x00, 0x40) // Storage slot.
            let o := shl(6, and(index, 3)) // Storage slot offset (bits).
            let v := sload(s) // Storage slot value.
            let m := 0xffffffffffffffff // Value mask.
            sstore(s, xor(v, shl(o, and(m, xor(shr(o, v), value)))))
        }
    }

    /// @dev Returns the uint128 value at `index` in `map`.
    function get(Uint128Map storage map, uint256 index) internal view returns (uint128 result) {
        result = uint128(map.map[index >> 1] >> ((index & 1) << 7));
    }

    /// @dev Updates the uint128 value at `index` in `map`.
    function set(Uint128Map storage map, uint256 index, uint128 value) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, map.slot)
            mstore(0x00, shr(1, index))
            let s := keccak256(0x00, 0x40) // Storage slot.
            let o := shl(7, and(index, 1)) // Storage slot offset (bits).
            let v := sload(s) // Storage slot value.
            let m := 0xffffffffffffffffffffffffffffffff // Value mask.
            sstore(s, xor(v, shl(o, and(m, xor(shr(o, v), value)))))
        }
    }

    /// @dev Returns the value at `index` in `map`.
    function get(mapping(uint256 => uint256) storage map, uint256 index, uint256 bitWidth)
        internal
        view
        returns (uint256 result)
    {
        unchecked {
            uint256 d = _rawDiv(256, bitWidth); // Bucket size.
            uint256 m = (1 << bitWidth) - 1; // Value mask.
            result = (map[_rawDiv(index, d)] >> (_rawMod(index, d) * bitWidth)) & m;
        }
    }

    /// @dev Updates the value at `index` in `map`.
    function set(
        mapping(uint256 => uint256) storage map,
        uint256 index,
        uint256 value,
        uint256 bitWidth
    ) internal {
        unchecked {
            uint256 d = _rawDiv(256, bitWidth); // Bucket size.
            uint256 m = (1 << bitWidth) - 1; // Value mask.
            uint256 o = _rawMod(index, d) * bitWidth; // Storage slot offset (bits).
            map[_rawDiv(index, d)] ^= (((map[_rawDiv(index, d)] >> o) ^ value) & m) << o;
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       BINARY SEARCH                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    // The following functions search in the range of [`start`, `end`)
    // (i.e. `start <= index < end`).
    // The range must be sorted in ascending order.
    // `index` precedence: equal to > nearest before > nearest after.
    // An invalid search range will simply return `(found = false, index = start)`.

    /// @dev Returns whether `map` contains `needle`, and the index of `needle`.
    function searchSorted(Uint8Map storage map, uint8 needle, uint256 start, uint256 end)
        internal
        view
        returns (bool found, uint256 index)
    {
        return searchSorted(map.map, needle, start, end, 8);
    }

    /// @dev Returns whether `map` contains `needle`, and the index of `needle`.
    function searchSorted(Uint16Map storage map, uint16 needle, uint256 start, uint256 end)
        internal
        view
        returns (bool found, uint256 index)
    {
        return searchSorted(map.map, needle, start, end, 16);
    }

    /// @dev Returns whether `map` contains `needle`, and the index of `needle`.
    function searchSorted(Uint32Map storage map, uint32 needle, uint256 start, uint256 end)
        internal
        view
        returns (bool found, uint256 index)
    {
        return searchSorted(map.map, needle, start, end, 32);
    }

    /// @dev Returns whether `map` contains `needle`, and the index of `needle`.
    function searchSorted(Uint40Map storage map, uint40 needle, uint256 start, uint256 end)
        internal
        view
        returns (bool found, uint256 index)
    {
        return searchSorted(map.map, needle, start, end, 40);
    }

    /// @dev Returns whether `map` contains `needle`, and the index of `needle`.
    function searchSorted(Uint64Map storage map, uint64 needle, uint256 start, uint256 end)
        internal
        view
        returns (bool found, uint256 index)
    {
        return searchSorted(map.map, needle, start, end, 64);
    }

    /// @dev Returns whether `map` contains `needle`, and the index of `needle`.
    function searchSorted(Uint128Map storage map, uint128 needle, uint256 start, uint256 end)
        internal
        view
        returns (bool found, uint256 index)
    {
        return searchSorted(map.map, needle, start, end, 128);
    }

    /// @dev Returns whether `map` contains `needle`, and the index of `needle`.
    function searchSorted(
        mapping(uint256 => uint256) storage map,
        uint256 needle,
        uint256 start,
        uint256 end,
        uint256 bitWidth
    ) internal view returns (bool found, uint256 index) {
        unchecked {
            if (start >= end) end = start;
            uint256 t;
            uint256 o = start - 1; // Offset to derive the actual index.
            uint256 l = 1; // Low.
            uint256 d = _rawDiv(256, bitWidth); // Bucket size.
            uint256 m = (1 << bitWidth) - 1; // Value mask.
            uint256 h = end - start; // High.
            while (true) {
                index = (l & h) + ((l ^ h) >> 1);
                if (l > h) break;
                t = (map[_rawDiv(index + o, d)] >> (_rawMod(index + o, d) * bitWidth)) & m;
                if (t == needle) break;
                if (needle <= t) h = index - 1;
                else l = index + 1;
            }
            /// @solidity memory-safe-assembly
            assembly {
                m := or(iszero(index), iszero(bitWidth))
                found := iszero(or(xor(t, needle), m))
                index := add(o, xor(index, mul(xor(index, 1), m)))
            }
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                      PRIVATE HELPERS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns `x / y`, returning 0 if `y` is zero.
    function _rawDiv(uint256 x, uint256 y) private pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            z := div(x, y)
        }
    }

    /// @dev Returns `x % y`, returning 0 if `y` is zero.
    function _rawMod(uint256 x, uint256 y) private pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            z := mod(x, y)
        }
    }
}

File 4 of 5 : Ownable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Simple single owner authorization mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)
///
/// @dev Note:
/// This implementation does NOT auto-initialize the owner to `msg.sender`.
/// You MUST call the `_initializeOwner` in the constructor / initializer.
///
/// While the ownable portion follows
/// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,
/// the nomenclature for the 2-step ownership handover may be unique to this codebase.
abstract contract Ownable {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The caller is not authorized to call the function.
    error Unauthorized();

    /// @dev The `newOwner` cannot be the zero address.
    error NewOwnerIsZeroAddress();

    /// @dev The `pendingOwner` does not have a valid handover request.
    error NoHandoverRequest();

    /// @dev Cannot double-initialize.
    error AlreadyInitialized();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           EVENTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The ownership is transferred from `oldOwner` to `newOwner`.
    /// This event is intentionally kept the same as OpenZeppelin's Ownable to be
    /// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173),
    /// despite it not being as lightweight as a single argument event.
    event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);

    /// @dev An ownership handover to `pendingOwner` has been requested.
    event OwnershipHandoverRequested(address indexed pendingOwner);

    /// @dev The ownership handover to `pendingOwner` has been canceled.
    event OwnershipHandoverCanceled(address indexed pendingOwner);

    /// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`.
    uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
        0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;

    /// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
        0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;

    /// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
        0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The owner slot is given by:
    /// `bytes32(~uint256(uint32(bytes4(keccak256("_OWNER_SLOT_NOT")))))`.
    /// It is intentionally chosen to be a high value
    /// to avoid collision with lower slots.
    /// The choice of manual storage layout is to enable compatibility
    /// with both regular and upgradeable contracts.
    bytes32 internal constant _OWNER_SLOT =
        0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927;

    /// The ownership handover slot of `newOwner` is given by:
    /// ```
    ///     mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED))
    ///     let handoverSlot := keccak256(0x00, 0x20)
    /// ```
    /// It stores the expiry timestamp of the two-step ownership handover.
    uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     INTERNAL FUNCTIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Override to return true to make `_initializeOwner` prevent double-initialization.
    function _guardInitializeOwner() internal pure virtual returns (bool guard) {}

    /// @dev Initializes the owner directly without authorization guard.
    /// This function must be called upon initialization,
    /// regardless of whether the contract is upgradeable or not.
    /// This is to enable generalization to both regular and upgradeable contracts,
    /// and to save gas in case the initial owner is not the caller.
    /// For performance reasons, this function will not check if there
    /// is an existing owner.
    function _initializeOwner(address newOwner) internal virtual {
        if (_guardInitializeOwner()) {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                if sload(ownerSlot) {
                    mstore(0x00, 0x0dc149f0) // `AlreadyInitialized()`.
                    revert(0x1c, 0x04)
                }
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Store the new value.
                sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Store the new value.
                sstore(_OWNER_SLOT, newOwner)
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
            }
        }
    }

    /// @dev Sets the owner directly without authorization guard.
    function _setOwner(address newOwner) internal virtual {
        if (_guardInitializeOwner()) {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
                // Store the new value.
                sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
                // Store the new value.
                sstore(ownerSlot, newOwner)
            }
        }
    }

    /// @dev Throws if the sender is not the owner.
    function _checkOwner() internal view virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // If the caller is not the stored owner, revert.
            if iszero(eq(caller(), sload(_OWNER_SLOT))) {
                mstore(0x00, 0x82b42900) // `Unauthorized()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Returns how long a two-step ownership handover is valid for in seconds.
    /// Override to return a different value if needed.
    /// Made internal to conserve bytecode. Wrap it in a public function if needed.
    function _ownershipHandoverValidFor() internal view virtual returns (uint64) {
        return 48 * 3600;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  PUBLIC UPDATE FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Allows the owner to transfer the ownership to `newOwner`.
    function transferOwnership(address newOwner) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            if iszero(shl(96, newOwner)) {
                mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`.
                revert(0x1c, 0x04)
            }
        }
        _setOwner(newOwner);
    }

    /// @dev Allows the owner to renounce their ownership.
    function renounceOwnership() public payable virtual onlyOwner {
        _setOwner(address(0));
    }

    /// @dev Request a two-step ownership handover to the caller.
    /// The request will automatically expire in 48 hours (172800 seconds) by default.
    function requestOwnershipHandover() public payable virtual {
        unchecked {
            uint256 expires = block.timestamp + _ownershipHandoverValidFor();
            /// @solidity memory-safe-assembly
            assembly {
                // Compute and set the handover slot to `expires`.
                mstore(0x0c, _HANDOVER_SLOT_SEED)
                mstore(0x00, caller())
                sstore(keccak256(0x0c, 0x20), expires)
                // Emit the {OwnershipHandoverRequested} event.
                log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
            }
        }
    }

    /// @dev Cancels the two-step ownership handover to the caller, if any.
    function cancelOwnershipHandover() public payable virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, caller())
            sstore(keccak256(0x0c, 0x20), 0)
            // Emit the {OwnershipHandoverCanceled} event.
            log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
        }
    }

    /// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`.
    /// Reverts if there is no existing ownership handover requested by `pendingOwner`.
    function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            let handoverSlot := keccak256(0x0c, 0x20)
            // If the handover does not exist, or has expired.
            if gt(timestamp(), sload(handoverSlot)) {
                mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`.
                revert(0x1c, 0x04)
            }
            // Set the handover slot to 0.
            sstore(handoverSlot, 0)
        }
        _setOwner(pendingOwner);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   PUBLIC READ FUNCTIONS                    */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the owner of the contract.
    function owner() public view virtual returns (address result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := sload(_OWNER_SLOT)
        }
    }

    /// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.
    function ownershipHandoverExpiresAt(address pendingOwner)
        public
        view
        virtual
        returns (uint256 result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the handover slot.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            // Load the handover slot.
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         MODIFIERS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Marks a function as only callable by the owner.
    modifier onlyOwner() virtual {
        _checkOwner();
        _;
    }
}

File 5 of 5 : IShadowCallbackReceiver.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.28;

interface IShadowCallbackReceiver {
    function executeCallback(bytes32 guid) external;
}

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

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"beacon","type":"address"},{"internalType":"address","name":"_baycContractAddress","type":"address"},{"internalType":"address","name":"_maycContractAddress","type":"address"},{"internalType":"address","name":"_bakcContractAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"CallerNotOwner","type":"error"},{"inputs":[],"name":"DepositMoreThanOneAPE","type":"error"},{"inputs":[],"name":"DistributionEnded","type":"error"},{"inputs":[],"name":"EndNotWholeHour","type":"error"},{"inputs":[],"name":"ExceededCapAmount","type":"error"},{"inputs":[],"name":"ExceededStakedAmount","type":"error"},{"inputs":[],"name":"InsufficientFee","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidPoolId","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"MismatchArrayLength","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"RefundFailed","type":"error"},{"inputs":[],"name":"StartGreaterThanEnd","type":"error"},{"inputs":[],"name":"StartMustEqualLastEnd","type":"error"},{"inputs":[],"name":"StartNotWholeHour","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"inputs":[],"name":"ZeroArrayLength","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"guid","type":"bytes32"}],"name":"CallbackExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint8","name":"poolId","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"requestType","type":"uint8"},{"indexed":false,"internalType":"uint256[]","name":"nfts","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"RequestSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardsPerHour","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"capPerPosition","type":"uint256"}],"name":"TimeRangeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardedBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accumulatedRewardsPerShare","type":"uint256"}],"name":"UpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimeStamp","type":"uint256"},{"internalType":"uint256","name":"_capPerPosition","type":"uint256"}],"name":"addTimeRange","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"baycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"maycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"bakcTokenIds","type":"uint256[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"claimBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"baycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"maycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"bakcTokenIds","type":"uint256[]"}],"name":"claimBatchSelf","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimSelf","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"baycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"maycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"bakcTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"baycAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"maycAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"bakcAmounts","type":"uint256[]"}],"name":"depositBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"guid","type":"bytes32"}],"name":"executeCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256[]","name":"baycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"maycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"bakcTokenIds","type":"uint256[]"}],"name":"getAllStakes","outputs":[{"components":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"deposited","type":"uint256"},{"internalType":"uint256","name":"unclaimed","type":"uint256"},{"internalType":"uint256","name":"rewards24hr","type":"uint256"}],"internalType":"struct ApeCoinStaking.DashboardStake[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getBakcStakes","outputs":[{"components":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"deposited","type":"uint256"},{"internalType":"uint256","name":"unclaimed","type":"uint256"},{"internalType":"uint256","name":"rewards24hr","type":"uint256"}],"internalType":"struct ApeCoinStaking.DashboardStake[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getBaycStakes","outputs":[{"components":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"deposited","type":"uint256"},{"internalType":"uint256","name":"unclaimed","type":"uint256"},{"internalType":"uint256","name":"rewards24hr","type":"uint256"}],"internalType":"struct ApeCoinStaking.DashboardStake[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getMaycStakes","outputs":[{"components":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"deposited","type":"uint256"},{"internalType":"uint256","name":"unclaimed","type":"uint256"},{"internalType":"uint256","name":"rewards24hr","type":"uint256"}],"internalType":"struct ApeCoinStaking.DashboardStake[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPoolsUI","outputs":[{"components":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"components":[{"internalType":"uint48","name":"startTimestampHour","type":"uint48"},{"internalType":"uint48","name":"endTimestampHour","type":"uint48"},{"internalType":"uint96","name":"rewardsPerHour","type":"uint96"},{"internalType":"uint96","name":"capPerPosition","type":"uint96"}],"internalType":"struct ApeCoinStaking.TimeRange","name":"currentTimeRange","type":"tuple"}],"internalType":"struct ApeCoinStaking.PoolUI","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"components":[{"internalType":"uint48","name":"startTimestampHour","type":"uint48"},{"internalType":"uint48","name":"endTimestampHour","type":"uint48"},{"internalType":"uint96","name":"rewardsPerHour","type":"uint96"},{"internalType":"uint96","name":"capPerPosition","type":"uint96"}],"internalType":"struct ApeCoinStaking.TimeRange","name":"currentTimeRange","type":"tuple"}],"internalType":"struct ApeCoinStaking.PoolUI","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"components":[{"internalType":"uint48","name":"startTimestampHour","type":"uint48"},{"internalType":"uint48","name":"endTimestampHour","type":"uint48"},{"internalType":"uint96","name":"rewardsPerHour","type":"uint96"},{"internalType":"uint96","name":"capPerPosition","type":"uint96"}],"internalType":"struct ApeCoinStaking.TimeRange","name":"currentTimeRange","type":"tuple"}],"internalType":"struct ApeCoinStaking.PoolUI","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTimeRangeBy","outputs":[{"components":[{"internalType":"uint48","name":"startTimestampHour","type":"uint48"},{"internalType":"uint48","name":"endTimestampHour","type":"uint48"},{"internalType":"uint96","name":"rewardsPerHour","type":"uint96"},{"internalType":"uint96","name":"capPerPosition","type":"uint96"}],"internalType":"struct ApeCoinStaking.TimeRange","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftContracts","outputs":[{"internalType":"contract INFTShadow","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftPosition","outputs":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"int256","name":"rewardsDebt","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"guid","type":"bytes32"}],"name":"pendingClaims","outputs":[{"internalType":"uint8","name":"poolId","type":"uint8"},{"internalType":"uint8","name":"requestType","type":"uint8"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint96","name":"numNfts","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"uint48","name":"lastRewardedTimestampHour","type":"uint48"},{"internalType":"uint16","name":"lastRewardsRangeIndex","type":"uint16"},{"internalType":"uint96","name":"stakedAmount","type":"uint96"},{"internalType":"uint96","name":"accumulatedRewardsPerShare","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"quoteRequest","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"baycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"maycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"bakcTokenIds","type":"uint256[]"}],"name":"quoteRequestBatch","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"removeLastTimeRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"rewardsBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"eids","type":"uint32[]"}],"name":"setEids","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"baycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"maycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"bakcTokenIds","type":"uint256[]"}],"name":"stakedTotal","outputs":[{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"baycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"maycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"bakcTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"baycAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"maycAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"bakcAmounts","type":"uint256[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"baycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"maycTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"bakcTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"baycAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"maycAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"bakcAmounts","type":"uint256[]"}],"name":"withdrawBatchSelf","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"withdrawSelf","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60803461016457601f615dba38819003918201601f19168301916001600160401b0383118484101761016857808492608094604052833981010312610164576100478161017c565b906100546020820161017c565b9061006d60606100666040840161017c565b920161017c565b600b6020527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf80546001600160a01b03199081166001600160a01b03958616179091557fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba91634805482169385169390931790925560035f9081527f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e805484169285169290921790915560098054909216939092169290921790915532638b78c6d819819055907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3604051615c2990816101918239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101645756fe60806040526004361015610046575b3615610018575f80fd5b5f808080638b78c6d8195434905af161002f613524565b501561003757005b633c31275160e21b5f5260045ffd5b5f5f3560e01c806301eb88e8146125ce578063036c79551461235e57806309e833c6146122f75780630bb4d82a146122c5578063171c8d9d1461228a5780631d01f62d146120af578063256929621461206657806325fd806d14611fbd578063345202c714611e4457806351eb05a614611e0c57806354d1f13d14611dc85780635773e3f114611db45780635e86f50614611d495780635ef819ce14611bae57806360bf629c14611487578063715018a61461143c578063770dade5146111185780638da5cb5b146110eb578063904042121461109257806398ada4a21461105a578063a44b09d014610f1b578063ac4afa3814610eba578063b1dae61814610d15578063b773e21214610cf3578063b99e555614610cd8578063bb628f20146109d2578063bc1786fe14610972578063bf0517841461094b578063d363dc1714610894578063d42a6eeb146106e9578063d7464ee91461068e578063db56c42d14610472578063f04e283e14610424578063f226406d1461031a578063f2fde38b146102de578063fe377e8d1461021d5763fee81cf4146101e8575061000e565b3461021a57602036600319011261021a576102016126c5565b9063389a75e1600c5252602080600c2054604051908152f35b80fd5b50606036600319011261021a576004356024356001600160401b0381116102da5761024c90369060040161267f565b604435916001600160a01b0383168084036102d6576003851180156102cc575b6102bd5782156102ae571561029f57926102979282856102919461029c973495614f8e565b34612aa2565b613562565b80f35b634e46966960e11b8552600485fd5b63a763b50160e01b8652600486fd5b63015f4fdd60e31b8652600486fd5b506001851061026c565b8580fd5b8280fd5b50602036600319011261021a576102f36126c5565b6102fb6135a1565b8060601b1561030d5761029c90613eca565b637448fbae82526004601cfd5b5061032436612944565b97919398949b9a8a91979a15998a809b61041c575b80610414575b610405578083148015906103fb575b80156103f1575b6103e25761029c9c9d349b156103c2575b50505050806103a3575b5050505080610382575b868685613562565b9361039492849261039a963393615825565b90612aa2565b805f808061037a565b92610394928894926103b8969993339361552d565b925f808080610370565b6103d8949b50906102919392913493339361522c565b965f808080610366565b636ad4b36b60e11b8d5260048dfd5b5089881415610355565b508584141561034e565b63a763b50160e01b8d5260048dfd5b50871561033f565b508315610339565b50602036600319011261021a576104396126c5565b6104416135a1565b63389a75e1600c528082526020600c208054421161046557908261029c9255613eca565b636f5e881883526004601cfd5b5060e036600319011261021a576004356001600160401b03811161068a5761049e90369060040161267f565b91906024356001600160401b0381116102da576104bf90369060040161267f565b9390916044356001600160401b038111610686576104e190369060040161267f565b6064356001600160401b0381116106825761050090369060040161267f565b9290956084356001600160401b03811161067e5761052290369060040161267f565b99909160a4356001600160401b03811161067a5761054490369060040161267f565b60c4359a90989197906001600160a01b038c168c03610676578a159a8b8061066e575b80610666575b610657578e8382149081159161064c575b508015610642575b610633576001600160a01b038d1615610624579161029c9d9e9593918d979593349d15610605575b50505050816105e6575b5050505050816105cb575b878786613562565b9284926105dc969261039495615825565b805f8080806105c3565b92899491926105fa969a936103949561552d565b93855f8080806105b8565b61061a949d509188916102919493349461522c565b985f8080806105ae565b634e46966960e11b8e5260048efd5b636ad4b36b60e11b8e5260048efd5b508a891415610586565b90508614158f61057e565b63a763b50160e01b8e5260048efd5b50881561056d565b508515610567565b8c80fd5b8a80fd5b8880fd5b8680fd5b8480fd5b5080fd5b503461021a57606036600319011261021a57600435906003821180156106df575b6106d05760406106c4604435602435856133b9565b82519182526020820152f35b63015f4fdd60e31b8152600490fd5b50600182106106af565b503461021a57608036600319011261021a576107036126c5565b6024356001600160401b0381116102da5761072290369060040161267f565b6044356001600160401b0381116106865761074190369060040161267f565b939091606435906001600160401b0382116106825761079561078f6107a39561078761078161077761079d97369060040161267f565b9a90963691612836565b87613be8565b983691612836565b8461391a565b943691612836565b90613640565b916107c46107bf6107b78351855190612abf565b855190612abf565b61333e565b93809281935b8351851015610807576107ff6001916107e38787612ef5565b516107ee828b612ef5565b526107f9818a612ef5565b506133ab565b9401936107ca565b8692918683925b82518410156108455761083d6001916108278686612ef5565b51610832828a612ef5565b526107f98189612ef5565b93019261080e565b85925084905b82518210156108825761087a6001916108648486612ef5565b5161086f8288612ef5565b526107f98187612ef5565b91019061084b565b6040518061089086826128df565b0390f35b503461021a57602036600319011261021a57600435600381118015610941575b610932576108c06135a1565b600481101561091e5760011b6002018054801561090a575f1901906108e58282612b2c565b6108f6576001818580935501555580f35b634e487b7160e01b84526004849052602484fd5b634e487b7160e01b83526031600452602483fd5b634e487b7160e01b82526032600452602482fd5b63015f4fdd60e31b8252600482fd5b50600181106108b4565b503461021a57610890610966610960366128a0565b90613be8565b604051918291826128df565b5061097c36612a73565b60038392931180156109c8575b6109b95780156109aa5761029c926102979261029192349281813394614f8e565b63a763b50160e01b8452600484fd5b63015f4fdd60e31b8452600484fd5b5060018210610989565b5060a036600319011261021a57600435604435608435602435606435600385118015610cce575b6102bd57610a056135a1565b813403610cbf5780841015610cb057603c610e1085060415801590610ca4575b610c9557603c610e1082060415801590610c89575b610c7a576004851015610c665760028560011b0180549283610c2f575b610a618684612aa2565b90610e10810290808204610e101490151715610c1b5790610a8191612bb3565b92610a8b866135ef565b610a94846135ef565b610a9d86613628565b90610aa788613628565b9365ffffffffffff60405194610abc866127c8565b16845265ffffffffffff60208501921682526001600160601b0360408501931683526001600160601b036060850195168552600160401b811015610c0757806001610b0a9201875586612b2c565b939093610bf357518354915192516001600160c01b031990921665ffffffffffff919091161760309290921b6bffffffffffff000000000000169190911760609190911b6bffffffffffffffffffffffff60601b161781559051600190910180546bffffffffffffffffffffffff19166001600160601b0392909216919091179055545f19810194908511610bdf579160a093917fc451b7686cd042f5567a435a873adda88dbe6dd6a2b724be0a8e64ffb329dab195936040519485526020850152604084015260608301526080820152a280f35b634e487b7160e01b87526011600452602487fd5b634e487b7160e01b8c5260048c905260248cfd5b634e487b7160e01b8c52604160045260248cfd5b634e487b7160e01b89526011600452602489fd5b5f198401848111610c1b57610c4b65ffffffffffff9184612b2c565b505460301c168614610a5757639424dcd960e01b8852600488fd5b634e487b7160e01b86526032600452602486fd5b638b853e2560e01b8652600486fd5b50603c81061515610a3a565b63f7985df160e01b8652600486fd5b50603c84061515610a25565b633dd8bead60e11b8652600486fd5b63162908e360e11b8652600486fd5b50600185106109f9565b503461021a57610890610966610ced366128a0565b9061391a565b503461021a576020610d0d610d0736612a73565b9161330b565b604051908152f35b503461021a57602036600319011261021a5760043580825281602052604082209081549160ff831690818552600b60205260018060a01b036040862054163303610eac57600181019384548060a01c610d6d81612f09565b9260028501895b838110610e7d57505060ff8160081c16155f14610de0575050945491547ff8c5d13dee703629750249a7fc79c62dc93b2e41c6c80df2d083b1c831a9472f955060209493610dd6936001600160a01b0360109390931c831693921691906141e5565b604051908152a180f35b91959650610ded81612f09565b93600301885b828110610e4a57507ff8c5d13dee703629750249a7fc79c62dc93b2e41c6c80df2d083b1c831a9472f976020979096610e459660109590951c6001600160a01b03908116969216949350909150613fa0565b610dd6565b80600191821c8b52826020526001600160801b0360408c205460808360071b161c16610e768289612ef5565b5201610df3565b8060019160041c8c528260205261ffff60408d205460f08360041b161c16610ea58289612ef5565b5201610d74565b6282b42960e81b8552600485fd5b503461021a57602036600319011261021a57600435600481101561068a576080915060011b600101546040519065ffffffffffff8116825261ffff8160301c1660208301526001600160601b038160401c16604083015260a01c6060820152f35b50608036600319011261021a576004356001600160401b03811161068a57610f4790369060040161267f565b91906024356001600160401b0381116102da57610f6890369060040161267f565b6044356001600160401b03811161068657610f8790369060040161267f565b91610f906126af565b93871595868097611052575b8061104a575b61103b576001600160a01b0386161561102c5761029c979834971561100f575b505081610ff4575b505081610fda575b505050613562565b928092828561039494610fec97614cfe565b5f8080610fd2565b8585838361100796999561039495614a6e565b925f80610fca565b611024929750908661029192349281816147de565b945f80610fc2565b634e46966960e11b8852600488fd5b63a763b50160e01b8852600488fd5b508415610fa2565b508215610f9c565b503461021a576040809161106d36612730565b908252600c602052828220908252602052206001815491015482519182526020820152f35b5061109c366126db565b9160038594951180156110e1575b6102bd5780156102ae578281036110d257926102919261029c95926102979534943394614492565b636ad4b36b60e11b8652600486fd5b50600184106110aa565b503461021a578060031936011261021a57638b78c6d819546040516001600160a01b039091168152602090f35b503461021a578060031936011261021a57611131612ecf565b5061113a612ecf565b50611143612ecf565b50604051611150816127e3565b60035465ffffffffffff8116825261ffff8160301c16602083015260408201906001600160601b038160401c16825260a01c6060830152600454916111948361281f565b926111a260405194856127fe565b80845260048552847f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b602086015b83831061141e575050505060808101928352604051906111ef826127e3565b6005549265ffffffffffff8416835261ffff8460301c16602084015260408301936001600160601b038160401c16855260a01c6060840152600654926112348461281f565b9361124260405195866127fe565b80855260068852877ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f602087015b83831061140057505050506080019283526040519361128e856127e3565b6007549265ffffffffffff8416865261ffff8460301c16602087015260408601936001600160601b038160401c16855260a01c6060870152600854956112d38761281f565b966112e160405198896127fe565b80885260088a527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee399602089015b8282106113e2575050506001600160601b0361024098979561137d6113d596836113e09a9761135861134b6113a2996080859a019d8e52613f07565b8098819551169e51612ef5565b51604080519e8f90611369826127ad565b600182526020820152015251169651612ef5565b516040519561138b876127ad565b600287526020870152604086015251169451612ef5565b51604051936113b0856127ad565b60038552602085015260408401526113cb6040518096612a18565b60c0850190612a18565b610180830190612a18565bf35b600260206001926113f28f612b45565b8152019c019101909a61130f565b6002602060019261141085612b45565b815201920192019190611270565b6002602060019261142e85612b45565b8152019201920191906111d0565b508060031936011261021a576114506135a1565b80638b78c6d819547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380638b78c6d8195580f35b5061149136612944565b9a909895979391969992948315808091611ba6575b80611b9e575b611b8f57838514801590611b85575b8015611b7b575b611b6c575f5f5b868110611b5357505f5b8a888210611b3a5750508d5f905b8d8d8310611b19575050503403611b0a5715611932575b505050508061174b575b505050508061150f578480f35b8490856102bd576115206003612bf4565b5f5b81811061152f5750508480f35b61153a818387612aaf565b359060038452600c60205260408420828552602052604084209182549485156116b2575b611569838a89612aaf565b3590670de0b6b3a764000082106116a457806115858884612abf565b9161169057506001600160601b0360016115a961ffff60075460301c166008612b2c565b5001541610611681576115bd815f97612abf565b84556115c881613628565b6001600160601b038060075460401c169116016001600160601b03811161166d57600160401b600160a01b036007549160401b1690600160401b600160a01b03191617600755600161162761162260075460a01c84612b8f565b613eb5565b94019182545f868201968712911290801582169115161761166d576001946003935560405191825260208201525f516020615b945f395f51905f5260403392a301611522565b634e487b7160e01b5f52601160045260245ffd5b633c0eb0dd60e21b5f5260045ffd5b634e487b7160e01b81526032600452602490fd5b62a1ceb560e71b8152600490fd5b60038152600b6020526024602060018060a01b03604084205416604051928380926331a9108f60e11b82528760048301525afa908115611740578291611712575b506001600160a01b0316331461155e57632e6c18c960e11b8152600490fd5b611733915060203d8111611739575b61172b81836127fe565b810190613582565b5f6116f3565b503d611721565b6040513d84823e3d90fd5b8890896119235761175c6002612bf4565b5f5b81811061176c575050611502565b611777818387612aaf565b359060028452600c60205260408420828552602052604084209182549485156118a5575b6117a6838a89612aaf565b3590670de0b6b3a764000082106116a457806117c28884612abf565b9161169057506001600160601b0360016117e661ffff60055460301c166006612b2c565b5001541610611681576117fa815f97612abf565b845561180581613628565b6001600160601b038060055460401c169116016001600160601b03811161166d57600160401b600160a01b036005549160401b1690600160401b600160a01b03191617600555600161185f61162260055460a01c84612b8f565b94019182545f868201968712911290801582169115161761166d576001946002935560405191825260208201525f516020615b945f395f51905f5260403392a30161175e565b60028152600b6020526024602060018060a01b03604084205416604051928380926331a9108f60e11b82528760048301525afa908115611740578291611905575b506001600160a01b0316331461179b57632e6c18c960e11b8152600490fd5b61191d915060203d81116117395761172b81836127fe565b5f6118e6565b63015f4fdd60e31b8a5260048afd5b9091929b505f5f9c6119446001612bf4565b5f5b8181106119545750506114f8565b61195f818387612aaf565b359060018452600c6020526040842082855260205260408420918254948515611a8c575b61198e838a89612aaf565b3590670de0b6b3a764000082106116a457806119aa8884612abf565b9161169057506001600160601b0360016119ce61ffff60035460301c166004612b2c565b5001541610611681576119e2815f97612abf565b84556119ed81613628565b6001600160601b038060035460401c169116016001600160601b03811161166d57600160401b600160a01b036003549160401b1690600160401b600160a01b031916176003556001611a4761162260035460a01c84612b8f565b94019182545f868201968712911290801582169115161761166d5760019485935560405191825260208201525f516020615b945f395f51905f5260403392a301611946565b60018152600b6020526024602060018060a01b03604084205416604051928380926331a9108f60e11b82528760048301525afa908115611740578291611aec575b506001600160a01b0316331461198357632e6c18c960e11b8152600490fd5b611b04915060203d81116117395761172b81836127fe565b5f611acd565b63162908e360e11b5f5260045ffd5b92611b2b83611b329360019596612aaf565b3590612abf565b91018e6114e1565b8192611b2b600193611b4c938d612aaf565b91016114d3565b90611b65600191611b2b848988612aaf565b91016114c9565b636ad4b36b60e11b5f5260045ffd5b508c8a14156114c2565b50888614156114bb565b63a763b50160e01b5f5260045ffd5b5089156114ac565b5085156114a6565b34611d4557611bbc36612730565b906004811015611d3157611bd58160011b600101612e17565b91815f52600c60205260405f20905f5260205260405f20600160405191611bfb83612792565b805483520154916020820192835265ffffffffffff845116611c1b6135bd565b90600383118015611d27575b611d1857611c34926133b9565b50926001600160601b036060820151169365ffffffffffff825116610e10810180911161166d57421180611d02575b611c99575b6020670de0b6b3a7640000611c9061162287611c886116228b8a51612b8f565b905190612eb7565b04604051908152f35b9092670de0b6b3a7640000820291808304670de0b6b3a7640000149015171561166d57611c88611622611c9094611cf6602098611cf0611622976001600160601b036040670de0b6b3a76400009c01511690612bb3565b90612abf565b97509450505092611c68565b506001600160601b036040830151161515611c63565b63015f4fdd60e31b5f5260045ffd5b5060018310611c27565b634e487b7160e01b5f52603260045260245ffd5b5f80fd5b34611d45576020366003190112611d45576004355f90815260208181526040918290208054600190910154835160ff8084168252600884901c16938101939093526001600160a01b0360109290921c8216938301939093528216606082015260a091821c6080820152f35b34611d455761089061096661079d366128a0565b5f366003190112611d455763389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f80a2005b34611d45576020366003190112611d4557600435600381118015611e3a575b611d1857611e3890612bf4565b005b5060018110611e2b565b34611d45576060366003190112611d45576004356001600160401b038111611d4557611e74903690600401612882565b6024356001600160401b038111611d4557611e93903690600401612882565b6044356001600160401b038111611d4557611eb2903690600401612882565b915f91825b8251841015611ef657611eee600191611ed08686612ef5565b51835f52600c60205260405f20905f5260205260405f205490612abf565b930192611eb7565b5f85815b8451831015611f4f57611f47600191611f138588612ef5565b515f9081527f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd720602052604090205490612abf565b920191611efa565b611f599084612abf565b5f805b8351821015611fb157611fa9600191611f758487612ef5565b515f9081527fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd7602052604090205490612abf565b910190611f5c565b610d0d60209184612abf565b611fc636612746565b9184939193159485809661205e575b80612056575b611b8f57611e3896349615612038575b50508061201c575b505080612002575b5050613562565b8261201593926103949233918181614cfe565b8280611ffb565b846120309395926103949233918181614a6e565b918480611ff3565b61204e92965090610291913491339181816147de565b938680611feb565b508315611fdb565b508115611fd5565b5f366003190112611d455763389a75e1600c52335f526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f80a2005b34611d45576020366003190112611d45576004356001600160401b038111611d45576120df90369060040161267f565b906120e86135a1565b6001600160401b03821161227657600160401b821161227657600a5482600a558083106121e9575b5090600a5f528060031c905f5b82811061218d5750600719811690038061213357005b915f925f5b818110612154575050505f516020615bb45f395f51905f520155005b909193602061218360019261216888612ba2565b908560021b63ffffffff809160031b9316831b921b19161790565b9501929101612138565b5f5f5b600881106121b257505f516020615bb45f395f51905f5282015560010161211d565b949060206121e06001926121c585612ba2565b908960021b63ffffffff809160031b9316831b921b19161790565b92019501612190565b600780840160031c910160031c5f516020615bb45f395f51905f520190601c8460021b168061223c575b505f516020615bb45f395f51905f52015b8181106122315750612110565b5f8155600101612224565b7fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a78201908154905f199060200360031b1c16905584612213565b634e487b7160e01b5f52604160045260245ffd5b34611d455760206122af6122bc6122b56122a336612746565b9593909791929461313b565b92613279565b01926132c2565b01604051908152f35b34611d45576020366003190112611d45576004355f52600b602052602060018060a01b0360405f205416604051908152f35b34611d4557608061231861230a36612730565b90612313612acc565b612af0565b6113e060405180926001600160601b036060809265ffffffffffff815116855265ffffffffffff6020820151166020860152826040820151166040860152015116910152565b612367366126db565b939192906003831180811591826125c4575b611d18578515611b8f57868603611b6c575f5f5b8781106125ab57503403611b0a57906125a1575b611d18576123b183949294612bf4565b5f9160048410918460011b916002836001019301945b8181106123d057005b6123db81838a612aaf565b3590875f52600c60205260405f20825f5260205260405f209182548015612518575b612408838d88612aaf565b3590670de0b6b3a7640000821061250a576124238183612abf565b8915611d31576001600160601b0360016124468d61ffff8d5460301c1690612b2c565b5001541610611681578161245991612abf565b845561246481613628565b6001600160601b0380895460401c169116016001600160601b03811161166d57875473ffffffffffffffffffffffff0000000000000000191660409190911b600160401b600160a01b031617875560016124c5611622895460a01c84612b8f565b94019182545f868201968712911290801582169115161761166d576001948b935560405191825260208201525f516020615b945f395f51905f5260403392a3016123c7565b62a1ceb560e71b5f5260045ffd5b895f52600b6020526024602060018060a01b0360405f205416604051928380926331a9108f60e11b82528760048301525afa908115612596575f91612578575b506001600160a01b031633146123fd575b632e6c18c960e11b5f5260045ffd5b612590915060203d81116117395761172b81836127fe565b8d612558565b6040513d5f823e3d90fd5b50600183106123a1565b906125bd600191611b2b848c89612aaf565b910161238d565b5060018510612379565b6080366003190112611d45576004356024356001600160401b038111611d45576125fc90369060040161267f565b906044356001600160401b038111611d455761261c90369060040161267f565b6126279491946126af565b90600383118015612675575b611d18578415611b8f57808503611b6c576001600160a01b0382161561266657611e389561029795610291953495614492565b634e46966960e11b5f5260045ffd5b5060018310612633565b9181601f84011215611d45578235916001600160401b038311611d45576020808501948460051b010111611d4557565b606435906001600160a01b0382168203611d4557565b600435906001600160a01b0382168203611d4557565b906060600319830112611d4557600435916024356001600160401b038111611d45578161270a9160040161267f565b92909291604435906001600160401b038211611d455761272c9160040161267f565b9091565b6040906003190112611d45576004359060243590565b6060600319820112611d45576004356001600160401b038111611d4557816127709160040161267f565b929092916024356001600160401b038111611d45578161270a9160040161267f565b604081019081106001600160401b0382111761227657604052565b606081019081106001600160401b0382111761227657604052565b608081019081106001600160401b0382111761227657604052565b60a081019081106001600160401b0382111761227657604052565b90601f801991011681019081106001600160401b0382111761227657604052565b6001600160401b0381116122765760051b60200190565b9291906128428161281f565b9361285060405195866127fe565b602085838152019160051b8101928311611d4557905b82821061287257505050565b8135815260209182019101612866565b9080601f83011215611d455781602061289d93359101612836565b90565b906040600319830112611d45576004356001600160a01b0381168103611d455791602435906001600160401b038211611d455761289d91600401612882565b60206040818301928281528451809452019201905f5b8181106129025750505090565b909192602060a06001926080875180518352848101518584015260408101516040840152606081015160608401520151608082015201940191019190916128f5565b60c0600319820112611d45576004356001600160401b038111611d45578161296e9160040161267f565b929092916024356001600160401b038111611d4557816129909160040161267f565b929092916044356001600160401b038111611d4557816129b29160040161267f565b929092916064356001600160401b038111611d4557816129d49160040161267f565b929092916084356001600160401b038111611d4557816129f69160040161267f565b9290929160a435906001600160401b038211611d455761272c9160040161267f565b90604080612a7193805184526020810151602085015201519101906001600160601b036060809265ffffffffffff815116855265ffffffffffff6020820151166020860152826040820151166040860152015116910152565b565b906040600319830112611d455760043591602435906001600160401b038211611d455761272c9160040161267f565b9190820391821161166d57565b9190811015611d315760051b0190565b9190820180921161166d57565b60405190612ad9826127c8565b5f6060838281528260208201528260408201520152565b50600381118015612b22575b611d18576004811015611d315761289d916002612b1c9260011b01612b2c565b50612b45565b5060018110612afc565b8054821015611d31575f5260205f209060011b01905f90565b90604051612b52816127c8565b60606001600160601b036001839582815465ffffffffffff8116875265ffffffffffff8160301c166020880152851c166040860152015416910152565b8181029291811591840414171561166d57565b3563ffffffff81168103611d455790565b8115612bbd570490565b634e487b7160e01b5f52601260045260245ffd5b80546001600160a01b031660a09290921b6001600160a01b031916919091179055565b6004811015611d31578060011b60028160010191019081548015612e1157825415611d3157825f5265ffffffffffff60205f2054164210612e115781549265ffffffffffff8416610e10810180911161166d57421115612e0a575f19820191821161166d5765ffffffffffff91612c6a91612b2c565b505460301c16906001600160601b03612c89612c846135bd565b6135ef565b9360401c1615612ddb57805465ffffffffffff841692600386118015612dd1575b611d1857612cc18465ffffffffffff8416886133b9565b8061ffff8560309694961c1603612da5575b5050825494670de0b6b3a7640000830292808404670de0b6b3a7640000149015171561166d5781606095612d5a612d54612d4f8a612d4665ffffffffffff996001600160601b037f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469e60401c1690612bb3565b9060a01c612abf565b613628565b87612bd1565b1115612d9e57505b1665ffffffffffff19825416178155546040519065ffffffffffff811682526001600160601b038160401c16602083015260a01c6040820152a2565b9050612d62565b612db767ffff00000000000091613616565b60301b169067ffff00000000000019161783555f80612cd3565b5060018610612caa565b925065ffffffffffff9181838216115f14612e0357505b1665ffffffffffff19825416179055565b9050612df2565b5050505050565b50505050565b90604051612e24816127e3565b60018193805465ffffffffffff8116845261ffff8160301c1660208501526001600160601b038160401c16604085015260a01c606084015201908154612e698161281f565b92612e7760405194856127fe565b81845260208401905f5260205f205f915b838310612e99575050505060800152565b60026020600192612ea985612b45565b815201920192019190612e88565b81810392915f13801582851316918412161761166d57565b60405190612edc826127ad565b815f81525f60208201526040612ef0612acc565b910152565b8051821015611d315760209160051b010190565b90612f138261281f565b612f2060405191826127fe565b8281528092612f31601f199161281f565b0190602036910137565b6001600160801b0316613a9802906001600160801b03821691820361166d57565b6001600160801b031661ea6001906001600160801b03821161166d57565b9190826040910312611d45576020825192015190565b600a80548083525f9182526020909201915f516020615bb45f395f51905f525b8160078401106130ba5754918181106130a3575b81811061308a575b818110613070575b818110613056575b81811061303c575b818110613022575b818110613008575b10612ffd575090565b60e01c815260200190565b92602060019163ffffffff8560c01c168152019301612ff4565b92602060019163ffffffff8560a01c168152019301612fec565b92602060019163ffffffff8560801c168152019301612fe4565b92602060019163ffffffff8560601c168152019301612fdc565b92602060019163ffffffff8560401c168152019301612fd4565b92602060019163ffffffff85831c168152019301612fcc565b92602060019163ffffffff85168152019301612fc4565b926001610100600892865463ffffffff8116825263ffffffff8160201c16602083015263ffffffff8160401c16604083015263ffffffff8160601c16606083015263ffffffff8160801c16608083015263ffffffff8160a01c1660a083015263ffffffff8160c01c1660c083015260e01c60e0820152019401920191612fb0565b81156132735760015f52600b6020527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf546001600160a01b03169161318a613184368385612836565b846142fb565b5051801561326b576131a76001600160801b036131ac9216612f3b565b612f5c565b6009546040516304bd49a560e01b81526004810195909552608060248601526084850183905290916001600160a01b03909116906001600160fb1b038111611d45578480936001600160801b0361322260a4604098859660051b8091838801378501858103820160031901604487015201612f90565b9116606483015203915afa908115612596575f9161323e575090565b613260915060403d604011613264575b61325881836127fe565b810190612f7a565b5090565b503d61324e565b505050505f90565b50505f90565b81156132735760025f52600b6020527fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba91634546001600160a01b03169161318a613184368385612836565b81156132735760035f52600b6020527f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e546001600160a01b03169161318a613184368385612836565b8215613337575f908152600b60205260409020546001600160a01b03169161318a613184368385612836565b5050505f90565b906133488261281f565b61335560405191826127fe565b8281528092613366601f199161281f565b01905f5b82811061337657505050565b602090604051613385816127e3565b5f81525f838201525f60408201525f60608201525f60808201528282850101520161336a565b5f19811461166d5760010190565b9291926004811015611d31576133d49060011b600101612e17565b92608061ffff6020860151169401908151805115611d3157602001515165ffffffffffff16811061351c57935b65ffffffffffff6020613415838551612ef5565b510151168311806134fc575b1561342e57600101613401565b935f92613439612acc565b50825151955b86811061345957505050505f19830192831161166d579190565b6134c1613467828651612ef5565b51805190969065ffffffffffff168085116134ee576134ba610e1091985b602081015165ffffffffffff168089116134da57506001600160601b0360406134b08a9c5b8d612aa2565b9201511690612b8f565b0490612abf565b948311156134d15760010161343f565b95505050509190565b60406134b06001600160601b03929c6134aa565b50610e106134ba8598613485565b5065ffffffffffff6020613511838551612ef5565b510151168511613421565b5050505f9190565b3d1561355d573d906001600160401b0382116122765760405191613552601f8201601f1916602001846127fe565b82523d5f602084013e565b606090565b8061356a5750565b5f80808093335af161357a613524565b501561003757565b90816020910312611d4557516001600160a01b0381168103611d455790565b638b78c6d8195433036135b057565b6382b429005f526004601cfd5b603c610e10420604603c810290808204603c149015171561166d576135e961289d91603c420690612abf565b42612aa2565b66010000000000008110156136095765ffffffffffff1690565b6335278d125f526004601cfd5b620100008110156136095761ffff1690565b600160601b811015613609576001600160601b031690565b919091606092613650815161333e565b935f915f5b81518110156138c4576136688183612ef5565b5160035f52600b60209081527f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e546040516331a9108f60e11b8152600481018490529190829060249082906001600160a01b03165afa908115612596575f916138a6575b506001600160a01b038781169116146136e9575b50600101613655565b5f8181527fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd7602052604090205480158015918161389f57604051632f7c0ce760e11b81526003600482015260248101859052602081604481305afa908115612596575f9161386e575b50915b8315613867576137656007612e17565b5f8681527fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd760205260409081902090516137dc916001906137a583612792565b80548352015460208201526001600160601b0360406137d061ffff6020870151166003612313612acc565b92519201511690612b8f565b60188102908082046018149015171561166d576001600160601b0360406138069301511690612bb3565b935b9061385e575b61381b575b5050506136e0565b916138549391600195989360405193613833856127e3565b60038552602085015260408401528783015260808201526107ee828b612ef5565b93905f8080613813565b5081151561380e565b5f93613808565b90506020813d8211613897575b81613888602093836127fe565b81010312611d4557515f613752565b3d915061387b565b5f91613755565b6138be915060203d81116117395761172b81836127fe565b5f6136cc565b50919250509291925181106138d7575090565b6138e08161333e565b915f5b8281106138f05750505090565b806138fd60019284612ef5565b516139088287612ef5565b526139138186612ef5565b50016138e3565b91909160609261392a815161333e565b935f915f5b8151811015613b92576139428183612ef5565b5160025f52600b60209081527fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba91634546040516331a9108f60e11b8152600481018490529190829060249082906001600160a01b03165afa908115612596575f91613b74575b506001600160a01b038781169116146139c3575b5060010161392f565b5f8181527f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd7206020526040902054801580159181613b6d57604051632f7c0ce760e11b81526002600482015260248101859052602081604481305afa908115612596575f91613b3c575b50915b8315613b3557613a3f6005612e17565b5f8681527f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd7206020526040908190209051613aaa91600190613a7f83612792565b80548352015460208201526001600160601b0360406137d061ffff6020870151166002612313612acc565b60188102908082046018149015171561166d576001600160601b036040613ad49301511690612bb3565b935b90613b2c575b613ae9575b5050506139ba565b91613b229391600195989360405193613b01856127e3565b60028552602085015260408401528783015260808201526107ee828b612ef5565b93905f8080613ae1565b50811515613adc565b5f93613ad6565b90506020813d8211613b65575b81613b56602093836127fe565b81010312611d4557515f613a2c565b3d9150613b49565b5f91613a2f565b613b8c915060203d81116117395761172b81836127fe565b5f6139a6565b5091925050929192518110613ba5575090565b613bae8161333e565b915f5b828110613bbe5750505090565b80613bcb60019284612ef5565b51613bd68287612ef5565b52613be18186612ef5565b5001613bb1565b919091606092613bf8815161333e565b935f915f5b8151811015613e5f57613c108183612ef5565b5160015f52600b60209081527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf546040516331a9108f60e11b8152600481018490529190829060249082906001600160a01b03165afa908115612596575f91613e41575b506001600160a01b03878116911614613c91575b50600101613bfd565b5f8181527fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c6020526040902054801580159181613e3a57604051632f7c0ce760e11b81526001600482015260248101859052602081604481305afa908115612596575f91613e09575b50915b8315613e0257613d0d6003612e17565b5f8681527fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c6020526040908190209051613d7891600190613d4d83612792565b80548352015460208201526001600160601b0360406137d061ffff6020870151166001612313612acc565b60188102908082046018149015171561166d576001600160601b036040613da29301511690612bb3565b935b90613df9575b613db7575b505050613c88565b91613def9391600195989360405193613dcf856127e3565b878552602085015260408401528783015260808201526107ee828b612ef5565b93905f8080613daf565b50811515613daa565b5f93613da4565b90506020813d8211613e32575b81613e23602093836127fe565b81010312611d4557515f613cfa565b3d9150613e16565b5f91613cfd565b613e59915060203d81116117395761172b81836127fe565b5f613c74565b5091925050929192518110613e72575090565b613e7b8161333e565b915f5b828110613e8b5750505090565b80613e9860019284612ef5565b51613ea38287612ef5565b52613eae8186612ef5565b5001613e7e565b5f81121561289d576335278d125f526004601cfd5b60018060a01b031680638b78c6d819547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3638b78c6d81955565b60208101608061ffff82511692019165ffffffffffff613f28828551612ef5565b5151164210613f9a57505161ffff165b81518051821015613f8b5781613f4d91612ef5565b514265ffffffffffff82511611159081613f74575b50613f6f57600101613f38565b905090565b65ffffffffffff915060200151164211155f613f62565b639856227d60e01b5f5260045ffd5b91505090565b90936003821180156141db575b611d185790613fbe81959395612bf4565b8251915f955f945b8486106140035750505050505081613fdc575050565b5f80809381935af1613fec613524565b5015613ff457565b631d42c86760e21b5f5260045ffd5b9091929394966140138883612ef5565b5197855f52600b60205260018060a01b0360405f2054169160208a6024604051809681936331a9108f60e11b835260048301525afa928315612596575f936141bb575b506001600160a01b038681169316839003612569576140758286612ef5565b5192875f52600c60205260405f208b5f5260205260405f209188828d8d86548914614177575b505050508254928386116141685760048a1015611d315785807f67c680c232fa9400adef6a1ad234c1d6d15a44170b85fddb60ceed23e31c322093606093600161413a8f99829c8b841b84019103845561412f6001600160601b036140ff88613628565b81845460401c1603168290600160401b600160a01b0382549160401b1690600160401b600160a01b031916179055565b5460a01c8502613eb5565b9101908154039055019d6040519182528d888060a01b031660208301526040820152a3019493929190613fc6565b639acaefc760e01b5f5260045ffd5b7f45c072aa05b9853b5a993de7a28bc332ee01404a628cec1a23ce0f659f842ef1916141a66040928987615b1d565b9082519182526020820152a388828d8d61409b565b6141d491935060203d81116117395761172b81836127fe565b915f614056565b5060018210613fad565b9193926003831180156142f1575b611d185761420083612bf4565b5f838152600b60205260408120546001600160a01b031692905b81518110156142e85761422d8183612ef5565b516040516331a9108f60e11b8152600481018290529190602083602481895afa928315612596575f936142c8575b506001600160a01b038581169316839003612569576001927f45c072aa05b9853b5a993de7a28bc332ee01404a628cec1a23ce0f659f842ef160408993845f52600c602052815f20815f526020526142b68d835f2087615b1d565b9082519182526020820152a30161421a565b6142e191935060203d81116117395761172b81836127fe565b915f61425b565b50505050509050565b50600183106141f3565b91906143078151612f09565b6143118251612f09565b915f925f955f945b83518610156143e95761432c8685612ef5565b51604051635a2d1e0760e11b815260048101919091526020816024816001600160a01b0387165afa908115612596575f916143af575b501561438c57600180916143768887612ef5565b516143818289612ef5565b5201955b0194614319565b94966001809161439c8a87612ef5565b516143a78287612ef5565b520197614385565b90506020813d82116143e1575b816143c9602093836127fe565b81010312611d4557518015158103611d45575f614362565b3d91506143bc565b94505090509390936143fa83612f09565b9261440483612f09565b955f5b828110614440575050505f5b828110614421575050509190565b8061442e60019284612ef5565b516144398289612ef5565b5201614413565b8061444d60019284612ef5565b516144588289612ef5565b5201614407565b90602080835192838152019201905f5b81811061447c5750505090565b825184526020938401939092019160010161446f565b919096959492946144c46144be5f99855f52600b60205260018060a01b0360405f205416943691612836565b836142fb565b928151806144fe575b5050505080516144de575050505050565b6144ee6144f49533953691612836565b91613fa0565b5f80808080612e0a565b90919299506145186131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b0361457061455f608484018d61445f565b838103600319016044850152612f90565b96169586606483015203915afa938415612596575f946147bc575b5083809c106147ae576020916040518095818094633df7b26d60e21b8252606060048301526145d16145c0606484018c61445f565b838103600319016024850152612f90565b90604483015203925af1918215612596575f9261477a575b505f828152602081905260409020805461ffff191660ff8716908117610100178255600190910180546001600160a01b0319166001600160a01b03891690811782559194919290614644906001600160601b03831690612bd1565b5f848152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790558a905b8281106146d057505050906146b85f516020615bd45f395f51905f52949392604051948594855260208501526001604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f8080806144cd565b855f525f602052600260405f20016146f16146eb8387612ef5565b51613616565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b189055855f525f602052614730818c600360405f200194612aaf565b35600160801b8110156136095760019260205281831c5f5260405f209060808360071b166001600160801b038354921682821c186001600160801b0316901b189055018a90614674565b9091506020813d6020116147a6575b81614796602093836127fe565b81010312611d455751905f6145e9565b3d9150614789565b62976f7560e21b5f5260045ffd5b6147d691945060403d6040116132645761325881836127fe565b50925f61458b565b95949150915061480a6144be5f9660015f52600b60205260018060a01b0360405f205416943691612836565b9281518061482e575b505050508051614821575050565b612a7191339160016141e5565b90919296506148486131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b0361488f61455f608484018d61445f565b96169586606483015203915afa938415612596575f94614a4c575b50838099106147ae576020916040518095818094633df7b26d60e21b8252606060048301526148df6145c0606484018c61445f565b90604483015203925af1918215612596575f92614a18575b505f828152602081905260409020805461ffff1916600190811782550180546001600160a01b0319166001600160a01b03871690811782559190614945906001600160601b03831690612bd1565b5f838152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790555b8181106149ce575050905f516020615bd45f395f51905f5292916149b66040519384938452600160208501525f604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f808080614813565b600190845f525f602052600260405f20016149ec6146eb8389612ef5565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b18905501614973565b9091506020813d602011614a44575b81614a34602093836127fe565b81010312611d455751905f6148f7565b3d9150614a27565b614a6691945060403d6040116132645761325881836127fe565b50925f6148aa565b959491509150614a9a6144be5f9660025f52600b60205260018060a01b0360405f205416943691612836565b92815180614abe575b505050508051614ab1575050565b612a7191339160026141e5565b9091929650614ad86131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b03614b1f61455f608484018d61445f565b96169586606483015203915afa938415612596575f94614cdc575b50838099106147ae576020916040518095818094633df7b26d60e21b825260606004830152614b6f6145c0606484018c61445f565b90604483015203925af1918215612596575f92614ca8575b505f828152602081905260409020805461ffff1916600217815560010180546001600160a01b0319166001600160a01b03871690811782559190614bd5906001600160601b03831690612bd1565b5f838152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790555b818110614c5e575050905f516020615bd45f395f51905f529291614c466040519384938452600260208501525f604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f808080614aa3565b600190845f525f602052600260405f2001614c7c6146eb8389612ef5565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b18905501614c03565b9091506020813d602011614cd4575b81614cc4602093836127fe565b81010312611d455751905f614b87565b3d9150614cb7565b614cf691945060403d6040116132645761325881836127fe565b50925f614b3a565b959491509150614d2a6144be5f9660035f52600b60205260018060a01b0360405f205416943691612836565b92815180614d4e575b505050508051614d41575050565b612a7191339160036141e5565b9091929650614d686131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b03614daf61455f608484018d61445f565b96169586606483015203915afa938415612596575f94614f6c575b50838099106147ae576020916040518095818094633df7b26d60e21b825260606004830152614dff6145c0606484018c61445f565b90604483015203925af1918215612596575f92614f38575b505f828152602081905260409020805461ffff1916600317815560010180546001600160a01b0319166001600160a01b03871690811782559190614e65906001600160601b03831690612bd1565b5f838152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790555b818110614eee575050905f516020615bd45f395f51905f529291614ed66040519384938452600360208501525f604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f808080614d33565b600190845f525f602052600260405f2001614f0c6146eb8389612ef5565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b18905501614e93565b9091506020813d602011614f64575b81614f54602093836127fe565b81010312611d455751905f614e17565b3d9150614f47565b614f8691945060403d6040116132645761325881836127fe565b50925f614dca565b9350959490939150614fc1614fbb5f97855f52600b60205260018060a01b0360405f205416963691612836565b856142fb565b94815180614fe4575b505050508251614fd957505050565b612a719233926141e5565b9091929750614ffe6131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b0361504561455f608484018d61445f565b96169586606483015203915afa938415612596575f9461520a575b5083809a106147ae576020916040518095818094633df7b26d60e21b8252606060048301526150956145c0606484018c61445f565b90604483015203925af1918215612596575f926151d6575b505f828152602081905260409020805461ffff191660ff87169081178255600190910180546001600160a01b0319166001600160a01b03871690811782559194919290615104906001600160601b03831690612bd1565b5f848152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790555b81811061518c575050906151745f516020615bd45f395f51905f52949392604051948594855260208501525f604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f808080614fca565b600190855f525f602052600260405f20016151aa6146eb8387612ef5565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b18905501615132565b9091506020813d602011615202575b816151f2602093836127fe565b81010312611d455751905f6150ad565b3d91506151e5565b61522491945060403d6040116132645761325881836127fe565b50925f615060565b95949391936152576144be5f9860015f52600b60205260018060a01b0360405f205416943691612836565b92815180615291575b5050505080516152705750505050565b6152806152889433943691612836565b906001613fa0565b5f808080612e11565b90919298506152ab6131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b036152f261455f608484018d61445f565b96169586606483015203915afa938415612596575f9461550b575b5083809b106147ae576020916040518095818094633df7b26d60e21b8252606060048301526153426145c0606484018c61445f565b90604483015203925af1918215612596575f926154d7575b505f828152602081905260409020805461ffff191661010117815560010180546001600160a01b0387166001600160a01b03199091168117825591906153aa906001600160601b03831690612bd1565b5f838152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790555b818110615434575050905f516020615bd45f395f51905f52929161541c6040519384938452600160208501526001604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f808080615260565b835f525f602052600260405f200161544f6146eb8388612ef5565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b189055835f525f602052600360405f20019061548f818a8c612aaf565b35600160801b8110156136095760019260205281831c5f5260405f209060808360071b166001600160801b038354921682821c186001600160801b0316901b189055016153d8565b9091506020813d602011615503575b816154f3602093836127fe565b81010312611d455751905f61535a565b3d91506154e6565b61552591945060403d6040116132645761325881836127fe565b50925f61530d565b95949391936155586144be5f9860025f52600b60205260018060a01b0360405f205416943691612836565b92815180615589575b5050505080516155715750505050565b6155816152889433943691612836565b906002613fa0565b90919298506155a36131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b036155ea61455f608484018d61445f565b96169586606483015203915afa938415612596575f94615803575b5083809b106147ae576020916040518095818094633df7b26d60e21b82526060600483015261563a6145c0606484018c61445f565b90604483015203925af1918215612596575f926157cf575b505f828152602081905260409020805461ffff191661010217815560010180546001600160a01b0387166001600160a01b03199091168117825591906156a2906001600160601b03831690612bd1565b5f838152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790555b81811061572c575050905f516020615bd45f395f51905f5292916157146040519384938452600260208501526001604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f808080615561565b835f525f602052600260405f20016157476146eb8388612ef5565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b189055835f525f602052600360405f200190615787818a8c612aaf565b35600160801b8110156136095760019260205281831c5f5260405f209060808360071b166001600160801b038354921682821c186001600160801b0316901b189055016156d0565b9091506020813d6020116157fb575b816157eb602093836127fe565b81010312611d455751905f615652565b3d91506157de565b61581d91945060403d6040116132645761325881836127fe565b50925f615605565b95949391936158506144be5f9860035f52600b60205260018060a01b0360405f205416943691612836565b92815180615881575b5050505080516158695750505050565b6158796152889433943691612836565b906003613fa0565b909192985061589b6131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b036158e261455f608484018d61445f565b96169586606483015203915afa938415612596575f94615afb575b5083809b106147ae576020916040518095818094633df7b26d60e21b8252606060048301526159326145c0606484018c61445f565b90604483015203925af1918215612596575f92615ac7575b505f828152602081905260409020805461ffff191661010317815560010180546001600160a01b0387166001600160a01b031990911681178255919061599a906001600160601b03831690612bd1565b5f838152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790555b818110615a24575050905f516020615bd45f395f51905f529291615a0c6040519384938452600360208501526001604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f808080615859565b835f525f602052600260405f2001615a3f6146eb8388612ef5565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b189055835f525f602052600360405f200190615a7f818a8c612aaf565b35600160801b8110156136095760019260205281831c5f5260405f209060808360071b166001600160801b038354921682821c186001600160801b0316901b189055016159c8565b9091506020813d602011615af3575b81615ae3602093836127fe565b81010312611d455751905f61594a565b3d9150615ad6565b615b1591945060403d6040116132645761325881836127fe565b50925f6158fd565b929190926004811015611d3157615b44611622600192865490841b84015460a01c90612b8f565b930190670de0b6b3a7640000615b5e611622845487612eb7565b049384925581615b6c575050565b5f80809381935af1615b7c613524565b5015615b8457565b6312171d8360e31b5f5260045ffdfe36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1ec65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a81702a763a649a340af75b915af1e2cd8f63ae4d1702417eafcde5ae7ea6467bca264697066735822122007326f9d9ca0fb3f9b0542244228578e4cb976e55ebd4bd148f2588bea2a1df964736f6c634300081c003300000000000000000000000039c3f9ee2066a514c38f9c6ac2d814e454ceaba2000000000000000000000000d3cbba36c7a218dbe71f465831f2d04564d3b76d000000000000000000000000cd78faddf3f4d18bd70904ab110e8669be44b7c8000000000000000000000000d335a9b6b1f6210c6f5bff825e7fb44f8fb5508e

Deployed Bytecode

0x60806040526004361015610046575b3615610018575f80fd5b5f808080638b78c6d8195434905af161002f613524565b501561003757005b633c31275160e21b5f5260045ffd5b5f5f3560e01c806301eb88e8146125ce578063036c79551461235e57806309e833c6146122f75780630bb4d82a146122c5578063171c8d9d1461228a5780631d01f62d146120af578063256929621461206657806325fd806d14611fbd578063345202c714611e4457806351eb05a614611e0c57806354d1f13d14611dc85780635773e3f114611db45780635e86f50614611d495780635ef819ce14611bae57806360bf629c14611487578063715018a61461143c578063770dade5146111185780638da5cb5b146110eb578063904042121461109257806398ada4a21461105a578063a44b09d014610f1b578063ac4afa3814610eba578063b1dae61814610d15578063b773e21214610cf3578063b99e555614610cd8578063bb628f20146109d2578063bc1786fe14610972578063bf0517841461094b578063d363dc1714610894578063d42a6eeb146106e9578063d7464ee91461068e578063db56c42d14610472578063f04e283e14610424578063f226406d1461031a578063f2fde38b146102de578063fe377e8d1461021d5763fee81cf4146101e8575061000e565b3461021a57602036600319011261021a576102016126c5565b9063389a75e1600c5252602080600c2054604051908152f35b80fd5b50606036600319011261021a576004356024356001600160401b0381116102da5761024c90369060040161267f565b604435916001600160a01b0383168084036102d6576003851180156102cc575b6102bd5782156102ae571561029f57926102979282856102919461029c973495614f8e565b34612aa2565b613562565b80f35b634e46966960e11b8552600485fd5b63a763b50160e01b8652600486fd5b63015f4fdd60e31b8652600486fd5b506001851061026c565b8580fd5b8280fd5b50602036600319011261021a576102f36126c5565b6102fb6135a1565b8060601b1561030d5761029c90613eca565b637448fbae82526004601cfd5b5061032436612944565b97919398949b9a8a91979a15998a809b61041c575b80610414575b610405578083148015906103fb575b80156103f1575b6103e25761029c9c9d349b156103c2575b50505050806103a3575b5050505080610382575b868685613562565b9361039492849261039a963393615825565b90612aa2565b805f808061037a565b92610394928894926103b8969993339361552d565b925f808080610370565b6103d8949b50906102919392913493339361522c565b965f808080610366565b636ad4b36b60e11b8d5260048dfd5b5089881415610355565b508584141561034e565b63a763b50160e01b8d5260048dfd5b50871561033f565b508315610339565b50602036600319011261021a576104396126c5565b6104416135a1565b63389a75e1600c528082526020600c208054421161046557908261029c9255613eca565b636f5e881883526004601cfd5b5060e036600319011261021a576004356001600160401b03811161068a5761049e90369060040161267f565b91906024356001600160401b0381116102da576104bf90369060040161267f565b9390916044356001600160401b038111610686576104e190369060040161267f565b6064356001600160401b0381116106825761050090369060040161267f565b9290956084356001600160401b03811161067e5761052290369060040161267f565b99909160a4356001600160401b03811161067a5761054490369060040161267f565b60c4359a90989197906001600160a01b038c168c03610676578a159a8b8061066e575b80610666575b610657578e8382149081159161064c575b508015610642575b610633576001600160a01b038d1615610624579161029c9d9e9593918d979593349d15610605575b50505050816105e6575b5050505050816105cb575b878786613562565b9284926105dc969261039495615825565b805f8080806105c3565b92899491926105fa969a936103949561552d565b93855f8080806105b8565b61061a949d509188916102919493349461522c565b985f8080806105ae565b634e46966960e11b8e5260048efd5b636ad4b36b60e11b8e5260048efd5b508a891415610586565b90508614158f61057e565b63a763b50160e01b8e5260048efd5b50881561056d565b508515610567565b8c80fd5b8a80fd5b8880fd5b8680fd5b8480fd5b5080fd5b503461021a57606036600319011261021a57600435906003821180156106df575b6106d05760406106c4604435602435856133b9565b82519182526020820152f35b63015f4fdd60e31b8152600490fd5b50600182106106af565b503461021a57608036600319011261021a576107036126c5565b6024356001600160401b0381116102da5761072290369060040161267f565b6044356001600160401b0381116106865761074190369060040161267f565b939091606435906001600160401b0382116106825761079561078f6107a39561078761078161077761079d97369060040161267f565b9a90963691612836565b87613be8565b983691612836565b8461391a565b943691612836565b90613640565b916107c46107bf6107b78351855190612abf565b855190612abf565b61333e565b93809281935b8351851015610807576107ff6001916107e38787612ef5565b516107ee828b612ef5565b526107f9818a612ef5565b506133ab565b9401936107ca565b8692918683925b82518410156108455761083d6001916108278686612ef5565b51610832828a612ef5565b526107f98189612ef5565b93019261080e565b85925084905b82518210156108825761087a6001916108648486612ef5565b5161086f8288612ef5565b526107f98187612ef5565b91019061084b565b6040518061089086826128df565b0390f35b503461021a57602036600319011261021a57600435600381118015610941575b610932576108c06135a1565b600481101561091e5760011b6002018054801561090a575f1901906108e58282612b2c565b6108f6576001818580935501555580f35b634e487b7160e01b84526004849052602484fd5b634e487b7160e01b83526031600452602483fd5b634e487b7160e01b82526032600452602482fd5b63015f4fdd60e31b8252600482fd5b50600181106108b4565b503461021a57610890610966610960366128a0565b90613be8565b604051918291826128df565b5061097c36612a73565b60038392931180156109c8575b6109b95780156109aa5761029c926102979261029192349281813394614f8e565b63a763b50160e01b8452600484fd5b63015f4fdd60e31b8452600484fd5b5060018210610989565b5060a036600319011261021a57600435604435608435602435606435600385118015610cce575b6102bd57610a056135a1565b813403610cbf5780841015610cb057603c610e1085060415801590610ca4575b610c9557603c610e1082060415801590610c89575b610c7a576004851015610c665760028560011b0180549283610c2f575b610a618684612aa2565b90610e10810290808204610e101490151715610c1b5790610a8191612bb3565b92610a8b866135ef565b610a94846135ef565b610a9d86613628565b90610aa788613628565b9365ffffffffffff60405194610abc866127c8565b16845265ffffffffffff60208501921682526001600160601b0360408501931683526001600160601b036060850195168552600160401b811015610c0757806001610b0a9201875586612b2c565b939093610bf357518354915192516001600160c01b031990921665ffffffffffff919091161760309290921b6bffffffffffff000000000000169190911760609190911b6bffffffffffffffffffffffff60601b161781559051600190910180546bffffffffffffffffffffffff19166001600160601b0392909216919091179055545f19810194908511610bdf579160a093917fc451b7686cd042f5567a435a873adda88dbe6dd6a2b724be0a8e64ffb329dab195936040519485526020850152604084015260608301526080820152a280f35b634e487b7160e01b87526011600452602487fd5b634e487b7160e01b8c5260048c905260248cfd5b634e487b7160e01b8c52604160045260248cfd5b634e487b7160e01b89526011600452602489fd5b5f198401848111610c1b57610c4b65ffffffffffff9184612b2c565b505460301c168614610a5757639424dcd960e01b8852600488fd5b634e487b7160e01b86526032600452602486fd5b638b853e2560e01b8652600486fd5b50603c81061515610a3a565b63f7985df160e01b8652600486fd5b50603c84061515610a25565b633dd8bead60e11b8652600486fd5b63162908e360e11b8652600486fd5b50600185106109f9565b503461021a57610890610966610ced366128a0565b9061391a565b503461021a576020610d0d610d0736612a73565b9161330b565b604051908152f35b503461021a57602036600319011261021a5760043580825281602052604082209081549160ff831690818552600b60205260018060a01b036040862054163303610eac57600181019384548060a01c610d6d81612f09565b9260028501895b838110610e7d57505060ff8160081c16155f14610de0575050945491547ff8c5d13dee703629750249a7fc79c62dc93b2e41c6c80df2d083b1c831a9472f955060209493610dd6936001600160a01b0360109390931c831693921691906141e5565b604051908152a180f35b91959650610ded81612f09565b93600301885b828110610e4a57507ff8c5d13dee703629750249a7fc79c62dc93b2e41c6c80df2d083b1c831a9472f976020979096610e459660109590951c6001600160a01b03908116969216949350909150613fa0565b610dd6565b80600191821c8b52826020526001600160801b0360408c205460808360071b161c16610e768289612ef5565b5201610df3565b8060019160041c8c528260205261ffff60408d205460f08360041b161c16610ea58289612ef5565b5201610d74565b6282b42960e81b8552600485fd5b503461021a57602036600319011261021a57600435600481101561068a576080915060011b600101546040519065ffffffffffff8116825261ffff8160301c1660208301526001600160601b038160401c16604083015260a01c6060820152f35b50608036600319011261021a576004356001600160401b03811161068a57610f4790369060040161267f565b91906024356001600160401b0381116102da57610f6890369060040161267f565b6044356001600160401b03811161068657610f8790369060040161267f565b91610f906126af565b93871595868097611052575b8061104a575b61103b576001600160a01b0386161561102c5761029c979834971561100f575b505081610ff4575b505081610fda575b505050613562565b928092828561039494610fec97614cfe565b5f8080610fd2565b8585838361100796999561039495614a6e565b925f80610fca565b611024929750908661029192349281816147de565b945f80610fc2565b634e46966960e11b8852600488fd5b63a763b50160e01b8852600488fd5b508415610fa2565b508215610f9c565b503461021a576040809161106d36612730565b908252600c602052828220908252602052206001815491015482519182526020820152f35b5061109c366126db565b9160038594951180156110e1575b6102bd5780156102ae578281036110d257926102919261029c95926102979534943394614492565b636ad4b36b60e11b8652600486fd5b50600184106110aa565b503461021a578060031936011261021a57638b78c6d819546040516001600160a01b039091168152602090f35b503461021a578060031936011261021a57611131612ecf565b5061113a612ecf565b50611143612ecf565b50604051611150816127e3565b60035465ffffffffffff8116825261ffff8160301c16602083015260408201906001600160601b038160401c16825260a01c6060830152600454916111948361281f565b926111a260405194856127fe565b80845260048552847f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b602086015b83831061141e575050505060808101928352604051906111ef826127e3565b6005549265ffffffffffff8416835261ffff8460301c16602084015260408301936001600160601b038160401c16855260a01c6060840152600654926112348461281f565b9361124260405195866127fe565b80855260068852877ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f602087015b83831061140057505050506080019283526040519361128e856127e3565b6007549265ffffffffffff8416865261ffff8460301c16602087015260408601936001600160601b038160401c16855260a01c6060870152600854956112d38761281f565b966112e160405198896127fe565b80885260088a527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee399602089015b8282106113e2575050506001600160601b0361024098979561137d6113d596836113e09a9761135861134b6113a2996080859a019d8e52613f07565b8098819551169e51612ef5565b51604080519e8f90611369826127ad565b600182526020820152015251169651612ef5565b516040519561138b876127ad565b600287526020870152604086015251169451612ef5565b51604051936113b0856127ad565b60038552602085015260408401526113cb6040518096612a18565b60c0850190612a18565b610180830190612a18565bf35b600260206001926113f28f612b45565b8152019c019101909a61130f565b6002602060019261141085612b45565b815201920192019190611270565b6002602060019261142e85612b45565b8152019201920191906111d0565b508060031936011261021a576114506135a1565b80638b78c6d819547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380638b78c6d8195580f35b5061149136612944565b9a909895979391969992948315808091611ba6575b80611b9e575b611b8f57838514801590611b85575b8015611b7b575b611b6c575f5f5b868110611b5357505f5b8a888210611b3a5750508d5f905b8d8d8310611b19575050503403611b0a5715611932575b505050508061174b575b505050508061150f578480f35b8490856102bd576115206003612bf4565b5f5b81811061152f5750508480f35b61153a818387612aaf565b359060038452600c60205260408420828552602052604084209182549485156116b2575b611569838a89612aaf565b3590670de0b6b3a764000082106116a457806115858884612abf565b9161169057506001600160601b0360016115a961ffff60075460301c166008612b2c565b5001541610611681576115bd815f97612abf565b84556115c881613628565b6001600160601b038060075460401c169116016001600160601b03811161166d57600160401b600160a01b036007549160401b1690600160401b600160a01b03191617600755600161162761162260075460a01c84612b8f565b613eb5565b94019182545f868201968712911290801582169115161761166d576001946003935560405191825260208201525f516020615b945f395f51905f5260403392a301611522565b634e487b7160e01b5f52601160045260245ffd5b633c0eb0dd60e21b5f5260045ffd5b634e487b7160e01b81526032600452602490fd5b62a1ceb560e71b8152600490fd5b60038152600b6020526024602060018060a01b03604084205416604051928380926331a9108f60e11b82528760048301525afa908115611740578291611712575b506001600160a01b0316331461155e57632e6c18c960e11b8152600490fd5b611733915060203d8111611739575b61172b81836127fe565b810190613582565b5f6116f3565b503d611721565b6040513d84823e3d90fd5b8890896119235761175c6002612bf4565b5f5b81811061176c575050611502565b611777818387612aaf565b359060028452600c60205260408420828552602052604084209182549485156118a5575b6117a6838a89612aaf565b3590670de0b6b3a764000082106116a457806117c28884612abf565b9161169057506001600160601b0360016117e661ffff60055460301c166006612b2c565b5001541610611681576117fa815f97612abf565b845561180581613628565b6001600160601b038060055460401c169116016001600160601b03811161166d57600160401b600160a01b036005549160401b1690600160401b600160a01b03191617600555600161185f61162260055460a01c84612b8f565b94019182545f868201968712911290801582169115161761166d576001946002935560405191825260208201525f516020615b945f395f51905f5260403392a30161175e565b60028152600b6020526024602060018060a01b03604084205416604051928380926331a9108f60e11b82528760048301525afa908115611740578291611905575b506001600160a01b0316331461179b57632e6c18c960e11b8152600490fd5b61191d915060203d81116117395761172b81836127fe565b5f6118e6565b63015f4fdd60e31b8a5260048afd5b9091929b505f5f9c6119446001612bf4565b5f5b8181106119545750506114f8565b61195f818387612aaf565b359060018452600c6020526040842082855260205260408420918254948515611a8c575b61198e838a89612aaf565b3590670de0b6b3a764000082106116a457806119aa8884612abf565b9161169057506001600160601b0360016119ce61ffff60035460301c166004612b2c565b5001541610611681576119e2815f97612abf565b84556119ed81613628565b6001600160601b038060035460401c169116016001600160601b03811161166d57600160401b600160a01b036003549160401b1690600160401b600160a01b031916176003556001611a4761162260035460a01c84612b8f565b94019182545f868201968712911290801582169115161761166d5760019485935560405191825260208201525f516020615b945f395f51905f5260403392a301611946565b60018152600b6020526024602060018060a01b03604084205416604051928380926331a9108f60e11b82528760048301525afa908115611740578291611aec575b506001600160a01b0316331461198357632e6c18c960e11b8152600490fd5b611b04915060203d81116117395761172b81836127fe565b5f611acd565b63162908e360e11b5f5260045ffd5b92611b2b83611b329360019596612aaf565b3590612abf565b91018e6114e1565b8192611b2b600193611b4c938d612aaf565b91016114d3565b90611b65600191611b2b848988612aaf565b91016114c9565b636ad4b36b60e11b5f5260045ffd5b508c8a14156114c2565b50888614156114bb565b63a763b50160e01b5f5260045ffd5b5089156114ac565b5085156114a6565b34611d4557611bbc36612730565b906004811015611d3157611bd58160011b600101612e17565b91815f52600c60205260405f20905f5260205260405f20600160405191611bfb83612792565b805483520154916020820192835265ffffffffffff845116611c1b6135bd565b90600383118015611d27575b611d1857611c34926133b9565b50926001600160601b036060820151169365ffffffffffff825116610e10810180911161166d57421180611d02575b611c99575b6020670de0b6b3a7640000611c9061162287611c886116228b8a51612b8f565b905190612eb7565b04604051908152f35b9092670de0b6b3a7640000820291808304670de0b6b3a7640000149015171561166d57611c88611622611c9094611cf6602098611cf0611622976001600160601b036040670de0b6b3a76400009c01511690612bb3565b90612abf565b97509450505092611c68565b506001600160601b036040830151161515611c63565b63015f4fdd60e31b5f5260045ffd5b5060018310611c27565b634e487b7160e01b5f52603260045260245ffd5b5f80fd5b34611d45576020366003190112611d45576004355f90815260208181526040918290208054600190910154835160ff8084168252600884901c16938101939093526001600160a01b0360109290921c8216938301939093528216606082015260a091821c6080820152f35b34611d455761089061096661079d366128a0565b5f366003190112611d455763389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f80a2005b34611d45576020366003190112611d4557600435600381118015611e3a575b611d1857611e3890612bf4565b005b5060018110611e2b565b34611d45576060366003190112611d45576004356001600160401b038111611d4557611e74903690600401612882565b6024356001600160401b038111611d4557611e93903690600401612882565b6044356001600160401b038111611d4557611eb2903690600401612882565b915f91825b8251841015611ef657611eee600191611ed08686612ef5565b51835f52600c60205260405f20905f5260205260405f205490612abf565b930192611eb7565b5f85815b8451831015611f4f57611f47600191611f138588612ef5565b515f9081527f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd720602052604090205490612abf565b920191611efa565b611f599084612abf565b5f805b8351821015611fb157611fa9600191611f758487612ef5565b515f9081527fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd7602052604090205490612abf565b910190611f5c565b610d0d60209184612abf565b611fc636612746565b9184939193159485809661205e575b80612056575b611b8f57611e3896349615612038575b50508061201c575b505080612002575b5050613562565b8261201593926103949233918181614cfe565b8280611ffb565b846120309395926103949233918181614a6e565b918480611ff3565b61204e92965090610291913491339181816147de565b938680611feb565b508315611fdb565b508115611fd5565b5f366003190112611d455763389a75e1600c52335f526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f80a2005b34611d45576020366003190112611d45576004356001600160401b038111611d45576120df90369060040161267f565b906120e86135a1565b6001600160401b03821161227657600160401b821161227657600a5482600a558083106121e9575b5090600a5f528060031c905f5b82811061218d5750600719811690038061213357005b915f925f5b818110612154575050505f516020615bb45f395f51905f520155005b909193602061218360019261216888612ba2565b908560021b63ffffffff809160031b9316831b921b19161790565b9501929101612138565b5f5f5b600881106121b257505f516020615bb45f395f51905f5282015560010161211d565b949060206121e06001926121c585612ba2565b908960021b63ffffffff809160031b9316831b921b19161790565b92019501612190565b600780840160031c910160031c5f516020615bb45f395f51905f520190601c8460021b168061223c575b505f516020615bb45f395f51905f52015b8181106122315750612110565b5f8155600101612224565b7fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a78201908154905f199060200360031b1c16905584612213565b634e487b7160e01b5f52604160045260245ffd5b34611d455760206122af6122bc6122b56122a336612746565b9593909791929461313b565b92613279565b01926132c2565b01604051908152f35b34611d45576020366003190112611d45576004355f52600b602052602060018060a01b0360405f205416604051908152f35b34611d4557608061231861230a36612730565b90612313612acc565b612af0565b6113e060405180926001600160601b036060809265ffffffffffff815116855265ffffffffffff6020820151166020860152826040820151166040860152015116910152565b612367366126db565b939192906003831180811591826125c4575b611d18578515611b8f57868603611b6c575f5f5b8781106125ab57503403611b0a57906125a1575b611d18576123b183949294612bf4565b5f9160048410918460011b916002836001019301945b8181106123d057005b6123db81838a612aaf565b3590875f52600c60205260405f20825f5260205260405f209182548015612518575b612408838d88612aaf565b3590670de0b6b3a7640000821061250a576124238183612abf565b8915611d31576001600160601b0360016124468d61ffff8d5460301c1690612b2c565b5001541610611681578161245991612abf565b845561246481613628565b6001600160601b0380895460401c169116016001600160601b03811161166d57875473ffffffffffffffffffffffff0000000000000000191660409190911b600160401b600160a01b031617875560016124c5611622895460a01c84612b8f565b94019182545f868201968712911290801582169115161761166d576001948b935560405191825260208201525f516020615b945f395f51905f5260403392a3016123c7565b62a1ceb560e71b5f5260045ffd5b895f52600b6020526024602060018060a01b0360405f205416604051928380926331a9108f60e11b82528760048301525afa908115612596575f91612578575b506001600160a01b031633146123fd575b632e6c18c960e11b5f5260045ffd5b612590915060203d81116117395761172b81836127fe565b8d612558565b6040513d5f823e3d90fd5b50600183106123a1565b906125bd600191611b2b848c89612aaf565b910161238d565b5060018510612379565b6080366003190112611d45576004356024356001600160401b038111611d45576125fc90369060040161267f565b906044356001600160401b038111611d455761261c90369060040161267f565b6126279491946126af565b90600383118015612675575b611d18578415611b8f57808503611b6c576001600160a01b0382161561266657611e389561029795610291953495614492565b634e46966960e11b5f5260045ffd5b5060018310612633565b9181601f84011215611d45578235916001600160401b038311611d45576020808501948460051b010111611d4557565b606435906001600160a01b0382168203611d4557565b600435906001600160a01b0382168203611d4557565b906060600319830112611d4557600435916024356001600160401b038111611d45578161270a9160040161267f565b92909291604435906001600160401b038211611d455761272c9160040161267f565b9091565b6040906003190112611d45576004359060243590565b6060600319820112611d45576004356001600160401b038111611d4557816127709160040161267f565b929092916024356001600160401b038111611d45578161270a9160040161267f565b604081019081106001600160401b0382111761227657604052565b606081019081106001600160401b0382111761227657604052565b608081019081106001600160401b0382111761227657604052565b60a081019081106001600160401b0382111761227657604052565b90601f801991011681019081106001600160401b0382111761227657604052565b6001600160401b0381116122765760051b60200190565b9291906128428161281f565b9361285060405195866127fe565b602085838152019160051b8101928311611d4557905b82821061287257505050565b8135815260209182019101612866565b9080601f83011215611d455781602061289d93359101612836565b90565b906040600319830112611d45576004356001600160a01b0381168103611d455791602435906001600160401b038211611d455761289d91600401612882565b60206040818301928281528451809452019201905f5b8181106129025750505090565b909192602060a06001926080875180518352848101518584015260408101516040840152606081015160608401520151608082015201940191019190916128f5565b60c0600319820112611d45576004356001600160401b038111611d45578161296e9160040161267f565b929092916024356001600160401b038111611d4557816129909160040161267f565b929092916044356001600160401b038111611d4557816129b29160040161267f565b929092916064356001600160401b038111611d4557816129d49160040161267f565b929092916084356001600160401b038111611d4557816129f69160040161267f565b9290929160a435906001600160401b038211611d455761272c9160040161267f565b90604080612a7193805184526020810151602085015201519101906001600160601b036060809265ffffffffffff815116855265ffffffffffff6020820151166020860152826040820151166040860152015116910152565b565b906040600319830112611d455760043591602435906001600160401b038211611d455761272c9160040161267f565b9190820391821161166d57565b9190811015611d315760051b0190565b9190820180921161166d57565b60405190612ad9826127c8565b5f6060838281528260208201528260408201520152565b50600381118015612b22575b611d18576004811015611d315761289d916002612b1c9260011b01612b2c565b50612b45565b5060018110612afc565b8054821015611d31575f5260205f209060011b01905f90565b90604051612b52816127c8565b60606001600160601b036001839582815465ffffffffffff8116875265ffffffffffff8160301c166020880152851c166040860152015416910152565b8181029291811591840414171561166d57565b3563ffffffff81168103611d455790565b8115612bbd570490565b634e487b7160e01b5f52601260045260245ffd5b80546001600160a01b031660a09290921b6001600160a01b031916919091179055565b6004811015611d31578060011b60028160010191019081548015612e1157825415611d3157825f5265ffffffffffff60205f2054164210612e115781549265ffffffffffff8416610e10810180911161166d57421115612e0a575f19820191821161166d5765ffffffffffff91612c6a91612b2c565b505460301c16906001600160601b03612c89612c846135bd565b6135ef565b9360401c1615612ddb57805465ffffffffffff841692600386118015612dd1575b611d1857612cc18465ffffffffffff8416886133b9565b8061ffff8560309694961c1603612da5575b5050825494670de0b6b3a7640000830292808404670de0b6b3a7640000149015171561166d5781606095612d5a612d54612d4f8a612d4665ffffffffffff996001600160601b037f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469e60401c1690612bb3565b9060a01c612abf565b613628565b87612bd1565b1115612d9e57505b1665ffffffffffff19825416178155546040519065ffffffffffff811682526001600160601b038160401c16602083015260a01c6040820152a2565b9050612d62565b612db767ffff00000000000091613616565b60301b169067ffff00000000000019161783555f80612cd3565b5060018610612caa565b925065ffffffffffff9181838216115f14612e0357505b1665ffffffffffff19825416179055565b9050612df2565b5050505050565b50505050565b90604051612e24816127e3565b60018193805465ffffffffffff8116845261ffff8160301c1660208501526001600160601b038160401c16604085015260a01c606084015201908154612e698161281f565b92612e7760405194856127fe565b81845260208401905f5260205f205f915b838310612e99575050505060800152565b60026020600192612ea985612b45565b815201920192019190612e88565b81810392915f13801582851316918412161761166d57565b60405190612edc826127ad565b815f81525f60208201526040612ef0612acc565b910152565b8051821015611d315760209160051b010190565b90612f138261281f565b612f2060405191826127fe565b8281528092612f31601f199161281f565b0190602036910137565b6001600160801b0316613a9802906001600160801b03821691820361166d57565b6001600160801b031661ea6001906001600160801b03821161166d57565b9190826040910312611d45576020825192015190565b600a80548083525f9182526020909201915f516020615bb45f395f51905f525b8160078401106130ba5754918181106130a3575b81811061308a575b818110613070575b818110613056575b81811061303c575b818110613022575b818110613008575b10612ffd575090565b60e01c815260200190565b92602060019163ffffffff8560c01c168152019301612ff4565b92602060019163ffffffff8560a01c168152019301612fec565b92602060019163ffffffff8560801c168152019301612fe4565b92602060019163ffffffff8560601c168152019301612fdc565b92602060019163ffffffff8560401c168152019301612fd4565b92602060019163ffffffff85831c168152019301612fcc565b92602060019163ffffffff85168152019301612fc4565b926001610100600892865463ffffffff8116825263ffffffff8160201c16602083015263ffffffff8160401c16604083015263ffffffff8160601c16606083015263ffffffff8160801c16608083015263ffffffff8160a01c1660a083015263ffffffff8160c01c1660c083015260e01c60e0820152019401920191612fb0565b81156132735760015f52600b6020527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf546001600160a01b03169161318a613184368385612836565b846142fb565b5051801561326b576131a76001600160801b036131ac9216612f3b565b612f5c565b6009546040516304bd49a560e01b81526004810195909552608060248601526084850183905290916001600160a01b03909116906001600160fb1b038111611d45578480936001600160801b0361322260a4604098859660051b8091838801378501858103820160031901604487015201612f90565b9116606483015203915afa908115612596575f9161323e575090565b613260915060403d604011613264575b61325881836127fe565b810190612f7a565b5090565b503d61324e565b505050505f90565b50505f90565b81156132735760025f52600b6020527fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba91634546001600160a01b03169161318a613184368385612836565b81156132735760035f52600b6020527f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e546001600160a01b03169161318a613184368385612836565b8215613337575f908152600b60205260409020546001600160a01b03169161318a613184368385612836565b5050505f90565b906133488261281f565b61335560405191826127fe565b8281528092613366601f199161281f565b01905f5b82811061337657505050565b602090604051613385816127e3565b5f81525f838201525f60408201525f60608201525f60808201528282850101520161336a565b5f19811461166d5760010190565b9291926004811015611d31576133d49060011b600101612e17565b92608061ffff6020860151169401908151805115611d3157602001515165ffffffffffff16811061351c57935b65ffffffffffff6020613415838551612ef5565b510151168311806134fc575b1561342e57600101613401565b935f92613439612acc565b50825151955b86811061345957505050505f19830192831161166d579190565b6134c1613467828651612ef5565b51805190969065ffffffffffff168085116134ee576134ba610e1091985b602081015165ffffffffffff168089116134da57506001600160601b0360406134b08a9c5b8d612aa2565b9201511690612b8f565b0490612abf565b948311156134d15760010161343f565b95505050509190565b60406134b06001600160601b03929c6134aa565b50610e106134ba8598613485565b5065ffffffffffff6020613511838551612ef5565b510151168511613421565b5050505f9190565b3d1561355d573d906001600160401b0382116122765760405191613552601f8201601f1916602001846127fe565b82523d5f602084013e565b606090565b8061356a5750565b5f80808093335af161357a613524565b501561003757565b90816020910312611d4557516001600160a01b0381168103611d455790565b638b78c6d8195433036135b057565b6382b429005f526004601cfd5b603c610e10420604603c810290808204603c149015171561166d576135e961289d91603c420690612abf565b42612aa2565b66010000000000008110156136095765ffffffffffff1690565b6335278d125f526004601cfd5b620100008110156136095761ffff1690565b600160601b811015613609576001600160601b031690565b919091606092613650815161333e565b935f915f5b81518110156138c4576136688183612ef5565b5160035f52600b60209081527f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e546040516331a9108f60e11b8152600481018490529190829060249082906001600160a01b03165afa908115612596575f916138a6575b506001600160a01b038781169116146136e9575b50600101613655565b5f8181527fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd7602052604090205480158015918161389f57604051632f7c0ce760e11b81526003600482015260248101859052602081604481305afa908115612596575f9161386e575b50915b8315613867576137656007612e17565b5f8681527fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd760205260409081902090516137dc916001906137a583612792565b80548352015460208201526001600160601b0360406137d061ffff6020870151166003612313612acc565b92519201511690612b8f565b60188102908082046018149015171561166d576001600160601b0360406138069301511690612bb3565b935b9061385e575b61381b575b5050506136e0565b916138549391600195989360405193613833856127e3565b60038552602085015260408401528783015260808201526107ee828b612ef5565b93905f8080613813565b5081151561380e565b5f93613808565b90506020813d8211613897575b81613888602093836127fe565b81010312611d4557515f613752565b3d915061387b565b5f91613755565b6138be915060203d81116117395761172b81836127fe565b5f6136cc565b50919250509291925181106138d7575090565b6138e08161333e565b915f5b8281106138f05750505090565b806138fd60019284612ef5565b516139088287612ef5565b526139138186612ef5565b50016138e3565b91909160609261392a815161333e565b935f915f5b8151811015613b92576139428183612ef5565b5160025f52600b60209081527fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba91634546040516331a9108f60e11b8152600481018490529190829060249082906001600160a01b03165afa908115612596575f91613b74575b506001600160a01b038781169116146139c3575b5060010161392f565b5f8181527f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd7206020526040902054801580159181613b6d57604051632f7c0ce760e11b81526002600482015260248101859052602081604481305afa908115612596575f91613b3c575b50915b8315613b3557613a3f6005612e17565b5f8681527f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd7206020526040908190209051613aaa91600190613a7f83612792565b80548352015460208201526001600160601b0360406137d061ffff6020870151166002612313612acc565b60188102908082046018149015171561166d576001600160601b036040613ad49301511690612bb3565b935b90613b2c575b613ae9575b5050506139ba565b91613b229391600195989360405193613b01856127e3565b60028552602085015260408401528783015260808201526107ee828b612ef5565b93905f8080613ae1565b50811515613adc565b5f93613ad6565b90506020813d8211613b65575b81613b56602093836127fe565b81010312611d4557515f613a2c565b3d9150613b49565b5f91613a2f565b613b8c915060203d81116117395761172b81836127fe565b5f6139a6565b5091925050929192518110613ba5575090565b613bae8161333e565b915f5b828110613bbe5750505090565b80613bcb60019284612ef5565b51613bd68287612ef5565b52613be18186612ef5565b5001613bb1565b919091606092613bf8815161333e565b935f915f5b8151811015613e5f57613c108183612ef5565b5160015f52600b60209081527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf546040516331a9108f60e11b8152600481018490529190829060249082906001600160a01b03165afa908115612596575f91613e41575b506001600160a01b03878116911614613c91575b50600101613bfd565b5f8181527fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c6020526040902054801580159181613e3a57604051632f7c0ce760e11b81526001600482015260248101859052602081604481305afa908115612596575f91613e09575b50915b8315613e0257613d0d6003612e17565b5f8681527fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c6020526040908190209051613d7891600190613d4d83612792565b80548352015460208201526001600160601b0360406137d061ffff6020870151166001612313612acc565b60188102908082046018149015171561166d576001600160601b036040613da29301511690612bb3565b935b90613df9575b613db7575b505050613c88565b91613def9391600195989360405193613dcf856127e3565b878552602085015260408401528783015260808201526107ee828b612ef5565b93905f8080613daf565b50811515613daa565b5f93613da4565b90506020813d8211613e32575b81613e23602093836127fe565b81010312611d4557515f613cfa565b3d9150613e16565b5f91613cfd565b613e59915060203d81116117395761172b81836127fe565b5f613c74565b5091925050929192518110613e72575090565b613e7b8161333e565b915f5b828110613e8b5750505090565b80613e9860019284612ef5565b51613ea38287612ef5565b52613eae8186612ef5565b5001613e7e565b5f81121561289d576335278d125f526004601cfd5b60018060a01b031680638b78c6d819547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3638b78c6d81955565b60208101608061ffff82511692019165ffffffffffff613f28828551612ef5565b5151164210613f9a57505161ffff165b81518051821015613f8b5781613f4d91612ef5565b514265ffffffffffff82511611159081613f74575b50613f6f57600101613f38565b905090565b65ffffffffffff915060200151164211155f613f62565b639856227d60e01b5f5260045ffd5b91505090565b90936003821180156141db575b611d185790613fbe81959395612bf4565b8251915f955f945b8486106140035750505050505081613fdc575050565b5f80809381935af1613fec613524565b5015613ff457565b631d42c86760e21b5f5260045ffd5b9091929394966140138883612ef5565b5197855f52600b60205260018060a01b0360405f2054169160208a6024604051809681936331a9108f60e11b835260048301525afa928315612596575f936141bb575b506001600160a01b038681169316839003612569576140758286612ef5565b5192875f52600c60205260405f208b5f5260205260405f209188828d8d86548914614177575b505050508254928386116141685760048a1015611d315785807f67c680c232fa9400adef6a1ad234c1d6d15a44170b85fddb60ceed23e31c322093606093600161413a8f99829c8b841b84019103845561412f6001600160601b036140ff88613628565b81845460401c1603168290600160401b600160a01b0382549160401b1690600160401b600160a01b031916179055565b5460a01c8502613eb5565b9101908154039055019d6040519182528d888060a01b031660208301526040820152a3019493929190613fc6565b639acaefc760e01b5f5260045ffd5b7f45c072aa05b9853b5a993de7a28bc332ee01404a628cec1a23ce0f659f842ef1916141a66040928987615b1d565b9082519182526020820152a388828d8d61409b565b6141d491935060203d81116117395761172b81836127fe565b915f614056565b5060018210613fad565b9193926003831180156142f1575b611d185761420083612bf4565b5f838152600b60205260408120546001600160a01b031692905b81518110156142e85761422d8183612ef5565b516040516331a9108f60e11b8152600481018290529190602083602481895afa928315612596575f936142c8575b506001600160a01b038581169316839003612569576001927f45c072aa05b9853b5a993de7a28bc332ee01404a628cec1a23ce0f659f842ef160408993845f52600c602052815f20815f526020526142b68d835f2087615b1d565b9082519182526020820152a30161421a565b6142e191935060203d81116117395761172b81836127fe565b915f61425b565b50505050509050565b50600183106141f3565b91906143078151612f09565b6143118251612f09565b915f925f955f945b83518610156143e95761432c8685612ef5565b51604051635a2d1e0760e11b815260048101919091526020816024816001600160a01b0387165afa908115612596575f916143af575b501561438c57600180916143768887612ef5565b516143818289612ef5565b5201955b0194614319565b94966001809161439c8a87612ef5565b516143a78287612ef5565b520197614385565b90506020813d82116143e1575b816143c9602093836127fe565b81010312611d4557518015158103611d45575f614362565b3d91506143bc565b94505090509390936143fa83612f09565b9261440483612f09565b955f5b828110614440575050505f5b828110614421575050509190565b8061442e60019284612ef5565b516144398289612ef5565b5201614413565b8061444d60019284612ef5565b516144588289612ef5565b5201614407565b90602080835192838152019201905f5b81811061447c5750505090565b825184526020938401939092019160010161446f565b919096959492946144c46144be5f99855f52600b60205260018060a01b0360405f205416943691612836565b836142fb565b928151806144fe575b5050505080516144de575050505050565b6144ee6144f49533953691612836565b91613fa0565b5f80808080612e0a565b90919299506145186131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b0361457061455f608484018d61445f565b838103600319016044850152612f90565b96169586606483015203915afa938415612596575f946147bc575b5083809c106147ae576020916040518095818094633df7b26d60e21b8252606060048301526145d16145c0606484018c61445f565b838103600319016024850152612f90565b90604483015203925af1918215612596575f9261477a575b505f828152602081905260409020805461ffff191660ff8716908117610100178255600190910180546001600160a01b0319166001600160a01b03891690811782559194919290614644906001600160601b03831690612bd1565b5f848152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790558a905b8281106146d057505050906146b85f516020615bd45f395f51905f52949392604051948594855260208501526001604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f8080806144cd565b855f525f602052600260405f20016146f16146eb8387612ef5565b51613616565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b189055855f525f602052614730818c600360405f200194612aaf565b35600160801b8110156136095760019260205281831c5f5260405f209060808360071b166001600160801b038354921682821c186001600160801b0316901b189055018a90614674565b9091506020813d6020116147a6575b81614796602093836127fe565b81010312611d455751905f6145e9565b3d9150614789565b62976f7560e21b5f5260045ffd5b6147d691945060403d6040116132645761325881836127fe565b50925f61458b565b95949150915061480a6144be5f9660015f52600b60205260018060a01b0360405f205416943691612836565b9281518061482e575b505050508051614821575050565b612a7191339160016141e5565b90919296506148486131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b0361488f61455f608484018d61445f565b96169586606483015203915afa938415612596575f94614a4c575b50838099106147ae576020916040518095818094633df7b26d60e21b8252606060048301526148df6145c0606484018c61445f565b90604483015203925af1918215612596575f92614a18575b505f828152602081905260409020805461ffff1916600190811782550180546001600160a01b0319166001600160a01b03871690811782559190614945906001600160601b03831690612bd1565b5f838152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790555b8181106149ce575050905f516020615bd45f395f51905f5292916149b66040519384938452600160208501525f604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f808080614813565b600190845f525f602052600260405f20016149ec6146eb8389612ef5565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b18905501614973565b9091506020813d602011614a44575b81614a34602093836127fe565b81010312611d455751905f6148f7565b3d9150614a27565b614a6691945060403d6040116132645761325881836127fe565b50925f6148aa565b959491509150614a9a6144be5f9660025f52600b60205260018060a01b0360405f205416943691612836565b92815180614abe575b505050508051614ab1575050565b612a7191339160026141e5565b9091929650614ad86131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b03614b1f61455f608484018d61445f565b96169586606483015203915afa938415612596575f94614cdc575b50838099106147ae576020916040518095818094633df7b26d60e21b825260606004830152614b6f6145c0606484018c61445f565b90604483015203925af1918215612596575f92614ca8575b505f828152602081905260409020805461ffff1916600217815560010180546001600160a01b0319166001600160a01b03871690811782559190614bd5906001600160601b03831690612bd1565b5f838152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790555b818110614c5e575050905f516020615bd45f395f51905f529291614c466040519384938452600260208501525f604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f808080614aa3565b600190845f525f602052600260405f2001614c7c6146eb8389612ef5565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b18905501614c03565b9091506020813d602011614cd4575b81614cc4602093836127fe565b81010312611d455751905f614b87565b3d9150614cb7565b614cf691945060403d6040116132645761325881836127fe565b50925f614b3a565b959491509150614d2a6144be5f9660035f52600b60205260018060a01b0360405f205416943691612836565b92815180614d4e575b505050508051614d41575050565b612a7191339160036141e5565b9091929650614d686131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b03614daf61455f608484018d61445f565b96169586606483015203915afa938415612596575f94614f6c575b50838099106147ae576020916040518095818094633df7b26d60e21b825260606004830152614dff6145c0606484018c61445f565b90604483015203925af1918215612596575f92614f38575b505f828152602081905260409020805461ffff1916600317815560010180546001600160a01b0319166001600160a01b03871690811782559190614e65906001600160601b03831690612bd1565b5f838152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790555b818110614eee575050905f516020615bd45f395f51905f529291614ed66040519384938452600360208501525f604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f808080614d33565b600190845f525f602052600260405f2001614f0c6146eb8389612ef5565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b18905501614e93565b9091506020813d602011614f64575b81614f54602093836127fe565b81010312611d455751905f614e17565b3d9150614f47565b614f8691945060403d6040116132645761325881836127fe565b50925f614dca565b9350959490939150614fc1614fbb5f97855f52600b60205260018060a01b0360405f205416963691612836565b856142fb565b94815180614fe4575b505050508251614fd957505050565b612a719233926141e5565b9091929750614ffe6131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b0361504561455f608484018d61445f565b96169586606483015203915afa938415612596575f9461520a575b5083809a106147ae576020916040518095818094633df7b26d60e21b8252606060048301526150956145c0606484018c61445f565b90604483015203925af1918215612596575f926151d6575b505f828152602081905260409020805461ffff191660ff87169081178255600190910180546001600160a01b0319166001600160a01b03871690811782559194919290615104906001600160601b03831690612bd1565b5f848152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790555b81811061518c575050906151745f516020615bd45f395f51905f52949392604051948594855260208501525f604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f808080614fca565b600190855f525f602052600260405f20016151aa6146eb8387612ef5565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b18905501615132565b9091506020813d602011615202575b816151f2602093836127fe565b81010312611d455751905f6150ad565b3d91506151e5565b61522491945060403d6040116132645761325881836127fe565b50925f615060565b95949391936152576144be5f9860015f52600b60205260018060a01b0360405f205416943691612836565b92815180615291575b5050505080516152705750505050565b6152806152889433943691612836565b906001613fa0565b5f808080612e11565b90919298506152ab6131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b036152f261455f608484018d61445f565b96169586606483015203915afa938415612596575f9461550b575b5083809b106147ae576020916040518095818094633df7b26d60e21b8252606060048301526153426145c0606484018c61445f565b90604483015203925af1918215612596575f926154d7575b505f828152602081905260409020805461ffff191661010117815560010180546001600160a01b0387166001600160a01b03199091168117825591906153aa906001600160601b03831690612bd1565b5f838152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790555b818110615434575050905f516020615bd45f395f51905f52929161541c6040519384938452600160208501526001604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f808080615260565b835f525f602052600260405f200161544f6146eb8388612ef5565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b189055835f525f602052600360405f20019061548f818a8c612aaf565b35600160801b8110156136095760019260205281831c5f5260405f209060808360071b166001600160801b038354921682821c186001600160801b0316901b189055016153d8565b9091506020813d602011615503575b816154f3602093836127fe565b81010312611d455751905f61535a565b3d91506154e6565b61552591945060403d6040116132645761325881836127fe565b50925f61530d565b95949391936155586144be5f9860025f52600b60205260018060a01b0360405f205416943691612836565b92815180615589575b5050505080516155715750505050565b6155816152889433943691612836565b906002613fa0565b90919298506155a36131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b036155ea61455f608484018d61445f565b96169586606483015203915afa938415612596575f94615803575b5083809b106147ae576020916040518095818094633df7b26d60e21b82526060600483015261563a6145c0606484018c61445f565b90604483015203925af1918215612596575f926157cf575b505f828152602081905260409020805461ffff191661010217815560010180546001600160a01b0387166001600160a01b03199091168117825591906156a2906001600160601b03831690612bd1565b5f838152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790555b81811061572c575050905f516020615bd45f395f51905f5292916157146040519384938452600260208501526001604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f808080615561565b835f525f602052600260405f20016157476146eb8388612ef5565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b189055835f525f602052600360405f200190615787818a8c612aaf565b35600160801b8110156136095760019260205281831c5f5260405f209060808360071b166001600160801b038354921682821c186001600160801b0316901b189055016156d0565b9091506020813d6020116157fb575b816157eb602093836127fe565b81010312611d455751905f615652565b3d91506157de565b61581d91945060403d6040116132645761325881836127fe565b50925f615605565b95949391936158506144be5f9860035f52600b60205260018060a01b0360405f205416943691612836565b92815180615881575b5050505080516158695750505050565b6158796152889433943691612836565b906003613fa0565b909192985061589b6131a76001600160801b038316612f3b565b600954604080516304bd49a560e01b8152600481018690526080602482015294929185906001600160a01b031681806001600160801b036158e261455f608484018d61445f565b96169586606483015203915afa938415612596575f94615afb575b5083809b106147ae576020916040518095818094633df7b26d60e21b8252606060048301526159326145c0606484018c61445f565b90604483015203925af1918215612596575f92615ac7575b505f828152602081905260409020805461ffff191661010317815560010180546001600160a01b0387166001600160a01b031990911681178255919061599a906001600160601b03831690612bd1565b5f838152602081905260408120805462010000600160b01b0319163360101b62010000600160b01b03161790555b818110615a24575050905f516020615bd45f395f51905f529291615a0c6040519384938452600360208501526001604085015260c0606085015260c084019061445f565b9060808301523360a08301520390a15f808080615859565b835f525f602052600260405f2001615a3f6146eb8388612ef5565b906020528160041c5f5260405f209060f08360041b1682549182821c1861ffff16901b189055835f525f602052600360405f200190615a7f818a8c612aaf565b35600160801b8110156136095760019260205281831c5f5260405f209060808360071b166001600160801b038354921682821c186001600160801b0316901b189055016159c8565b9091506020813d602011615af3575b81615ae3602093836127fe565b81010312611d455751905f61594a565b3d9150615ad6565b615b1591945060403d6040116132645761325881836127fe565b50925f6158fd565b929190926004811015611d3157615b44611622600192865490841b84015460a01c90612b8f565b930190670de0b6b3a7640000615b5e611622845487612eb7565b049384925581615b6c575050565b5f80809381935af1615b7c613524565b5015615b8457565b6312171d8360e31b5f5260045ffdfe36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1ec65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a81702a763a649a340af75b915af1e2cd8f63ae4d1702417eafcde5ae7ea6467bca264697066735822122007326f9d9ca0fb3f9b0542244228578e4cb976e55ebd4bd148f2588bea2a1df964736f6c634300081c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000039c3f9ee2066a514c38f9c6ac2d814e454ceaba2000000000000000000000000d3cbba36c7a218dbe71f465831f2d04564d3b76d000000000000000000000000cd78faddf3f4d18bd70904ab110e8669be44b7c8000000000000000000000000d335a9b6b1f6210c6f5bff825e7fb44f8fb5508e

-----Decoded View---------------
Arg [0] : beacon (address): 0x39C3F9EE2066A514C38f9c6ac2D814E454CEABa2
Arg [1] : _baycContractAddress (address): 0xD3Cbba36c7A218dbE71F465831F2D04564D3B76d
Arg [2] : _maycContractAddress (address): 0xcD78faddF3f4d18Bd70904ab110E8669bE44B7c8
Arg [3] : _bakcContractAddress (address): 0xD335A9B6B1f6210c6f5BFf825e7fB44f8fB5508e

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000039c3f9ee2066a514c38f9c6ac2d814e454ceaba2
Arg [1] : 000000000000000000000000d3cbba36c7a218dbe71f465831f2d04564d3b76d
Arg [2] : 000000000000000000000000cd78faddf3f4d18bd70904ab110e8669be44b7c8
Arg [3] : 000000000000000000000000d335a9b6b1f6210c6f5bff825e7fb44f8fb5508e


Deployed Bytecode Sourcemap

4243:43189:3:-:0;;;;;;;;;-1:-1:-1;4243:43189:3;;;;;;;;9276:34;6813:405:0;;;;;11523:61;9296:9:3;9276:34;;;;;:::i;:::-;;9324:8;9320:35;;4243:43189;9320:35;9341:14;;;9276:34;9341:14;4243:43189;9276:34;9341:14;4243:43189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;:::i;:::-;11885:237:0;;;;;4243:43189:3;11885:237:0;;;;4243:43189:3;;;;;;;;;;-1:-1:-1;4243:43189:3;;-1:-1:-1;;4243:43189:3;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;6338:1;9013:22;;:48;;;;4243:43189;9009:101;;10682:20;;10678:50;;10742:23;10738:54;;10826:9;10845:72;10826:9;;;41405:70;10826:9;10942:12;10826:9;;41405:70;;:::i;:::-;10826:9;10845:72;:::i;:::-;10942:12;:::i;:::-;4243:43189;;10738:54;-1:-1:-1;;;10774:18:3;;4243:43189;11983:18;10774;10678:50;-1:-1:-1;;;10711:17:3;;4243:43189;11843:17;10711;9009:101;-1:-1:-1;;;9084:15:3;;4243:43189;9084:15;;9013:48;9039:22;4243:43189;9039:22;;9013:48;;4243:43189;;;;;;;;;-1:-1:-1;4243:43189:3;;-1:-1:-1;;4243:43189:3;;;;;;:::i;:::-;12478:70:0;;:::i;:::-;8479:183;;;;;;8681:8;;;:::i;8479:183::-;;;;4243:43189:3;8479:183:0;;4243:43189:3;;;;;:::i;:::-;19404:24;;;;;;;;;;;;;;;:52;;;4243:43189;19404:80;;;4243:43189;19400:110;;19537:41;;;;;:86;;;4243:43189;19537:147;;;;4243:43189;19520:203;;20280:12;19757:9;;;19780:23;;19776:154;;4243:43189;19943:23;;;;;19939:154;;4243:43189;20106:23;;;;;20102:154;;4243:43189;20280:12;;;;:::i;20102:154::-;20220:10;41724:80;20220:10;;;20145:100;20220:10;;41724:80;;:::i;:::-;20145:100;;:::i;:::-;20102:154;;;;;;19939;20057:10;41724:80;20057:10;;;;19982:100;20057:10;;;;41724:80;;:::i;19982:100::-;19939:154;;;;;;;19776;19819:100;19757:9;;;;41724:80;19757:9;;;;19894:10;;41724:80;;:::i;19819:100::-;19776:154;;;;;;;19520:203;-1:-1:-1;;;19702:21:3;;4243:43189;11916:21;19702;19537:147;19643:41;;;;;19537:147;;:86;19582:41;;;;;19537:86;;19400:110;-1:-1:-1;;;19493:17:3;;4243:43189;11843:17;19493;19404:80;19460:24;;;19404:80;;:52;19432:24;;;19404:52;;4243:43189;-1:-1:-1;4243:43189:3;;-1:-1:-1;;4243:43189:3;;;;;;:::i;:::-;12478:70:0;;:::i;:::-;10506:526;;;;;;4243:43189:3;10506:526:0;;;;;;;;;;11051:12;10506:526;;11051:12;:::i;10506:526::-;;;;4243:43189:3;10506:526:0;;4243:43189:3;-1:-1:-1;4243:43189:3;;-1:-1:-1;;4243:43189:3;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;17724:24;;;;;:52;;4243:43189;17724:80;;;4243:43189;17720:110;;17857:41;;;;;;;:86;;;4243:43189;17857:147;;;;;4243:43189;17840:203;;-1:-1:-1;;;;;4243:43189:3;;18057:23;18053:54;;18141:9;18661:12;18141:9;;;;;;;;;;18164:23;;18160:153;;4243:43189;18326:23;;;;;18322:153;;4243:43189;18488:23;;;;;;18484:153;;4243:43189;18661:12;;;;:::i;18484:153::-;41724:80;;;18527:99;41724:80;;;;;:::i;18527:99::-;18484:153;;;;;;;18322;41724:80;;;;;18365:99;41724:80;;;;;;:::i;18365:99::-;18322:153;;;;;;;;18160;18203:99;18141:9;;;;;;41724:80;18141:9;;;41724:80;;:::i;18203:99::-;18160:153;;;;;;;18053:54;-1:-1:-1;;;18089:18:3;;4243:43189;11983:18;18089;17840:203;-1:-1:-1;;;18022:21:3;;4243:43189;11916:21;18022;17857:147;17963:41;;;;;17857:147;;:86;17902:41;;;;;17857:86;;;17720:110;-1:-1:-1;;;17813:17:3;;4243:43189;11843:17;17813;17724:80;17780:24;;;17724:80;;:52;17752:24;;;17724:52;;4243:43189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;9013:22;6338:1;9013:22;;:48;;;;4243:43189;9009:101;;4243:43189;24822:1345;4243:43189;;;;;24822:1345;:::i;:::-;4243:43189;;;;;;;;;;9009:101;-1:-1:-1;;;9084:15:3;;4243:43189;;9084:15;9013:48;9039:22;4243:43189;9039:22;;9013:48;;4243:43189;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;:::i;:::-;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;30884:49;4243:43189;30980:49;4243:43189;30788:49;4243:43189;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;30788:49;;:::i;:::-;4243:43189;;;;:::i;:::-;30884:49;;:::i;:::-;4243:43189;;;;:::i;:::-;30980:49;;:::i;:::-;4243:43189;31161:27;31057:57;:37;4243:43189;;;;31057:37;;:::i;:::-;4243:43189;;31057:57;;:::i;:::-;31161:27;:::i;:::-;31199:14;;31229:13;;31224:128;31267:3;4243:43189;;31244:21;;;;;31333:8;6242:1;31306:13;;;;;:::i;:::-;;31286:33;;;;:::i;:::-;;;;;;:::i;:::-;;31333:8;:::i;:::-;31267:3;4243:43189;31229:13;;;31244:21;;;;;31367:13;31362:128;31405:3;4243:43189;;31382:21;;;;;31471:8;6242:1;31444:13;;;;;:::i;:::-;;31424:33;;;;:::i;:::-;;;;;;:::i;31471:8::-;31405:3;4243:43189;31367:13;;;31382:21;;;;;31500:128;31543:3;4243:43189;;31520:21;;;;;31609:8;6242:1;31582:13;;;;;:::i;:::-;;31562:33;;;;:::i;:::-;;;;;;:::i;31609:8::-;31543:3;4243:43189;31505:13;;;31520:21;4243:43189;;;;31520:21;4243:43189;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;6338:1;9013:22;;:48;;;;4243:43189;9009:101;;12478:70:0;;:::i;:::-;4243:43189:3;;;;;;;;22751:25;;4243:43189;;;;;;-1:-1:-1;;4243:43189:3;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;4243:43189:3;;;;;;;;;;-1:-1:-1;;;4243:43189:3;;;;;;;;;-1:-1:-1;;;4243:43189:3;;;;;;;;9009:101;-1:-1:-1;;;9084:15:3;;4243:43189;9084:15;;9013:48;9039:22;4243:43189;9039:22;;9013:48;;4243:43189;;;;;;31979:45;4243:43189;;;:::i;:::-;31979:45;;:::i;:::-;4243:43189;;;;;;;:::i;:::-;;;;;:::i;:::-;6338:1;9013:22;;;;:48;;;;4243:43189;9009:101;;11081:20;;11077:50;;11278:12;11161:9;11180:73;11161:9;41405:70;11161:9;;11228:10;;;;41405:70;;:::i;11077:50::-;-1:-1:-1;;;11110:17:3;;4243:43189;11843:17;11110;9009:101;-1:-1:-1;;;9084:15:3;;4243:43189;9084:15;;9013:48;9039:22;6242:1;9039:22;;9013:48;;4243:43189;-1:-1:-1;4243:43189:3;;-1:-1:-1;;4243:43189:3;;;;;;;;;;;;;;6338:1;9013:22;;:48;;;;4243:43189;9009:101;;12478:70:0;;:::i;:::-;21194:9:3;;:20;21190:48;;21252:32;;;;21248:66;;6057:2;6000:4;4243:43189;;5876:4;21328:30;;;:64;;;4243:43189;21324:96;;6057:2;6000:4;4243:43189;;5876:4;21434:28;;;:60;;;4243:43189;21430:90;;4243:43189;;;;;;21592:15;4243:43189;;;21592:15;4243:43189;;21628:10;;21624:140;;4243:43189;21799:31;;;;:::i;:::-;4243:43189;6000:4;4243:43189;;;;;;6000:4;4243:43189;;;;;;;21865:44;;;;:::i;:::-;21967:26;;;;:::i;:::-;21995:24;;;:::i;:::-;22021:25;;;:::i;:::-;22048:26;;;;:::i;:::-;4243:43189;;;;;;;;:::i;:::-;;;;;;21944:140;;4243:43189;;;;-1:-1:-1;;;;;4243:43189:3;21944:140;;4243:43189;;;;-1:-1:-1;;;;;4243:43189:3;21944:140;;4243:43189;;;;-1:-1:-1;;;4243:43189:3;;;;;;;;;;;;;;:::i;:::-;;;;;;;6000:4;;4243:43189;;;;-1:-1:-1;;;;;;4243:43189:3;;;;;;;;;6000:4;;;;;;;4243:43189;;;;;;;;;-1:-1:-1;;;4243:43189:3;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;;;;;;;22136:138;4243:43189;;;;;;;;;;;;;;;;;;;;;;;22136:138;4243:43189;;;-1:-1:-1;;;4243:43189:3;;;;;;;;;-1:-1:-1;;;4243:43189:3;;;;;;;;;;-1:-1:-1;;;4243:43189:3;;;;;;;;;-1:-1:-1;;;4243:43189:3;;;;;;;;21624:140;-1:-1:-1;;4243:43189:3;;;;;;;21677:27;4243:43189;21677:27;;;:::i;:::-;-1:-1:-1;4243:43189:3;;;;21654:99;;21624:140;21654:99;-1:-1:-1;;;21730:23:3;;4243:43189;21730:23;;4243:43189;-1:-1:-1;;;4243:43189:3;;;;;;;;21430:90;-1:-1:-1;;;21503:17:3;;4243:43189;21503:17;;21434:60;38691:31;6057:2;4243:43189;;21466:28;;21434:60;;21324:96;-1:-1:-1;;;21401:19:3;;4243:43189;21401:19;;21328:64;38691:31;6057:2;4243:43189;;21362:30;;21328:64;;21248:66;-1:-1:-1;;;21293:21:3;;4243:43189;21293:21;;21190:48;-1:-1:-1;;;21223:15:3;;4243:43189;10235:15;21223;9013:48;9039:22;4243:43189;9039:22;;9013:48;;4243:43189;;;;;;32349:45;4243:43189;;;:::i;:::-;32349:45;;:::i;4243:43189::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;;;;;;;;;;;;;;;;;;;;;23113:12;4243:43189;;;;;;;;;;;;23149:10;:32;23145:59;;4243:43189;23281:14;;4243:43189;;;;;;23333:22;;;:::i;:::-;23370:13;23439:15;;;23370:13;23385:11;;;;;;4243:43189;;;;;;;23487:33;23483:414;4243:43189;;;-1:-1:-1;;4243:43189:3;;;;23912:22;;-1:-1:-1;4243:43189:3;;;23582:13;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;;23582:13;:::i;:::-;4243:43189;;;;;23912:22;4243:43189;;23483:414;23654:22;;;;;;;:::i;:::-;23695:13;23767:14;;23695:13;23710:11;;;;;;-1:-1:-1;23912:22:3;;4243:43189;;;;23872:13;;4243:43189;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;-1:-1:-1;4243:43189:3;;-1:-1:-1;23872:13:3;:::i;:::-;23483:414;;23723:3;4243:43189;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;5905:1:1;4243:43189:3;;;6383:1;23746:43;;;;:::i;:::-;4243:43189;;23695:13;;23398:3;4243:43189;;;;;;;;;;;;;;;;;;;;;;23417:45;;;;:::i;:::-;4243:43189;;23370:13;;23145:59;-1:-1:-1;;;23190:14:3;;4243:43189;23190:14;;4243:43189;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;;6499:20;;;;;4243:43189;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;;;;;;-1:-1:-1;4243:43189:3;;-1:-1:-1;;4243:43189:3;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;15157:24;;;;;;:52;;;4243:43189;15157:80;;;4243:43189;15153:110;;-1:-1:-1;;;;;4243:43189:3;;15277:23;15273:54;;15832:12;15360:9;;;15383:23;;15379:137;;4243:43189;15529:23;;;15525:137;;4243:43189;15675:23;;;15671:137;;4243:43189;15832:12;;;;:::i;15671:137::-;41405:70;;;;;;;15714:83;41405:70;;:::i;15714:83::-;15671:137;;;;;15525;41405:70;;;;15568:83;41405:70;;;;;;:::i;15568:83::-;15525:137;;;;;15379;15422:83;15360:9;;;;;41405:70;15360:9;;41405:70;;;;:::i;15422:83::-;15379:137;;;;;15273:54;-1:-1:-1;;;15309:18:3;;4243:43189;11983:18;15309;15153:110;-1:-1:-1;;;15246:17:3;;4243:43189;11843:17;15246;15157:80;15213:24;;;15157:80;;:52;15185:24;;;15157:52;;4243:43189;;;;;;;;;;;:::i;:::-;;;;6731:67;4243:43189;;;;;;;;;;;6731:67;4243:43189;;6731:67;;4243:43189;;;;;;;;;;;;;;;;:::i;:::-;9013:22;6338:1;9013:22;;;;:48;;;;4243:43189;9009:101;;12582:20;;12578:50;;12642:33;;;12638:67;;12739:9;41724:80;12739:9;12868:12;12739:9;;12758:85;12739:9;;12818:10;;41724:80;;:::i;12638:67::-;-1:-1:-1;;;12684:21:3;;4243:43189;11916:21;12684;9013:48;9039:22;6242:1;9039:22;;9013:48;;4243:43189;;;;;;;;;;;;;-1:-1:-1;;11523:61:0;4243:43189:3;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;29074:28;4243:43189;;;;;;28998:28;28900:34;29150:28;4243:43189;;;;;;;;28900:34;:::i;:::-;4243:43189;;;;;;28998:19;;:28;:::i;:::-;;4243:43189;;;;;;;;;:::i;:::-;28782:5;4243:43189;;;28965:62;;4243:43189;28965:62;4243:43189;;;29074:19;;:28;:::i;:::-;;4243:43189;;;;;;:::i;:::-;;;;;29041:62;;4243:43189;;29041:62;;4243:43189;;;29150:19;;:28;:::i;:::-;;4243:43189;;;;;;:::i;:::-;;;;;29117:62;;4243:43189;;29117:62;;4243:43189;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;28782:5;4243:43189;;;;:::i;:::-;;;;;;;;;;;;;;;28782:5;4243:43189;;;;:::i;:::-;;;;;;;;;;;;;;;28782:5;4243:43189;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;12478:70:0;;:::i;:::-;6813:405;;;;;;;;;;;;4243:43189:3;;;;;;;:::i;:::-;13591:24;;;;;;;;;;;;;;;:52;;;4243:43189;13591:80;;;4243:43189;13587:110;;13724:41;;;;;:86;;;4243:43189;13724:147;;;;4243:43189;13707:203;;4243:43189;;13975:23;;;;;;14074:13;4243:43189;14089:23;;;;;;;14188:13;;;4243:43189;14183:105;14203:23;;;;;;;14301:9;;;;:25;14297:53;;14365:23;14361:82;;14183:105;14457:23;;;;;14453:82;;14183:105;14549:23;;;;;14545:82;;4243:43189;;;14545:82;9013:22;:48;;9009:101;;9119:1;6338;9119;:::i;:::-;-1:-1:-1;39571:10:3;;;;;;14545:82;;4243:43189;;;39583:3;39620:12;;;;;:::i;:::-;4243:43189;;6338:1;4243:43189;;39657:11;4243:43189;;;;;;;;;;;;;;;;39704:26;;;39700:146;;39583:3;39876:11;;;;;:::i;:::-;4243:43189;40141:22;5876:4;40141:22;;40137:58;;40222:32;;;;;:::i;:::-;4243:43189;;;;-1:-1:-1;;;;;4243:43189:3;40273:63;4243:43189;;;;;;40273:25;:63;:::i;:::-;:78;;4243:43189;;-1:-1:-1;40205:208:3;;39149:33;4243:43189;-1:-1:-1;39149:33:3;;:::i;:::-;4243:43189;;39213:18;;;:::i;:::-;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;-1:-1:-1;;;;;;;4243:43189:3;;;;;;;-1:-1:-1;;;;;;;4243:43189:3;;;;;;39266:54;39267:41;4243:43189;;;;39267:41;;:::i;:::-;39266:54;:::i;:::-;39241:21;;4243:43189;;;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;;;;;;;;;6338:1;4243:43189;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4243:43189:3;39971:10;39963:45;;4243:43189;39560:9;;4243:43189;;;;-1:-1:-1;4243:43189:3;;;;;-1:-1:-1;4243:43189:3;40205:208;40383:19;;;-1:-1:-1;40383:19:3;4243:43189;-1:-1:-1;40383:19:3;4243:43189;-1:-1:-1;;;4243:43189:3;;;;;;;;40137:58;-1:-1:-1;;;40172:23:3;;4243:43189;;40172:23;39700:146;6338:1;4243:43189;;39754:12;4243:43189;;39754:38;4243:43189;;;;;;;;;;;;;6188:6;;;;;;;39754:38;;;4243:43189;39754:38;;4243:43189;39754:38;;;;;;;;;;;39700:146;-1:-1:-1;;;;;;4243:43189:3;39971:10;39750:81;39700:146;39750:81;-1:-1:-1;;;39815:16:3;;4243:43189;;39815:16;39754:38;;;;4243:43189;39754:38;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;4243:43189;;6188:6;4243:43189;;6188:6;;;;14453:82;9013:22;:48;;9009:101;;9119:1;6290;9119;:::i;:::-;-1:-1:-1;39571:10:3;;;;;;14453:82;;;;39583:3;39620:12;;;;;:::i;:::-;4243:43189;;6290:1;4243:43189;;39657:11;4243:43189;;;;;;;;;;;;;;;;39704:26;;;39700:146;;39583:3;39876:11;;;;;:::i;:::-;4243:43189;40141:22;5876:4;40141:22;;40137:58;;40222:32;;;;;:::i;:::-;4243:43189;;;;-1:-1:-1;;;;;4243:43189:3;40273:63;4243:43189;;;;;;40273:25;:63;:::i;:::-;:78;;4243:43189;;-1:-1:-1;40205:208:3;;39149:33;4243:43189;-1:-1:-1;39149:33:3;;:::i;:::-;4243:43189;;39213:18;;;:::i;:::-;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;-1:-1:-1;;;;;;;4243:43189:3;;;;;;;-1:-1:-1;;;;;;;4243:43189:3;;;;;;39266:54;39267:41;4243:43189;;;;39267:41;;:::i;39266:54::-;39241:21;;4243:43189;;;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;;;;;;;;;6290:1;4243:43189;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4243:43189:3;39971:10;39963:45;;4243:43189;39560:9;;39700:146;6290:1;4243:43189;;39754:12;4243:43189;;39754:38;4243:43189;;;;;;;;;;;;;6188:6;;;;;;;39754:38;;;4243:43189;39754:38;;4243:43189;39754:38;;;;;;;;;;;39700:146;-1:-1:-1;;;;;;4243:43189:3;39971:10;39750:81;39700:146;39750:81;-1:-1:-1;;;39815:16:3;;4243:43189;;39815:16;39754:38;;;;4243:43189;39754:38;;;;;;;;;:::i;:::-;;;;9009:101;-1:-1:-1;;;9084:15:3;;4243:43189;9084:15;;14361:82;9013:22;;;;;4243:43189;;9119:1;;4243:43189;9119:1;:::i;:::-;-1:-1:-1;39571:10:3;;;;;;14361:82;;;;39583:3;39620:12;;;;;:::i;:::-;4243:43189;;;;;39657:11;4243:43189;;;;;;;;;;;;;;;;39704:26;;;39700:146;;39583:3;39876:11;;;;;:::i;:::-;4243:43189;40141:22;5876:4;40141:22;;40137:58;;40222:32;;;;;:::i;:::-;4243:43189;;;;-1:-1:-1;;;;;4243:43189:3;40273:63;4243:43189;6338:1;4243:43189;;;;;40273:63;:::i;:::-;:78;;4243:43189;;-1:-1:-1;40205:208:3;;39149:33;4243:43189;-1:-1:-1;39149:33:3;;:::i;:::-;4243:43189;;39213:18;;;:::i;:::-;-1:-1:-1;;;;;4243:43189:3;6338:1;4243:43189;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;-1:-1:-1;;;;;;;6338:1:3;4243:43189;;;;;;-1:-1:-1;;;;;;;4243:43189:3;;;6338:1;4243:43189;;39266:54;39267:41;6338:1;4243:43189;;;39267:41;;:::i;39266:54::-;39241:21;;4243:43189;;;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4243:43189:3;39971:10;39963:45;;4243:43189;39560:9;;39700:146;4243:43189;;;39754:12;4243:43189;;39754:38;4243:43189;;;;;;;;;;;;;6188:6;;;;;;;39754:38;;;4243:43189;39754:38;;4243:43189;39754:38;;;;;;;;;;;39700:146;-1:-1:-1;;;;;;4243:43189:3;39971:10;39750:81;39700:146;39750:81;-1:-1:-1;;;39815:16:3;;4243:43189;;39815:16;39754:38;;;;4243:43189;39754:38;;;;;;;;;:::i;:::-;;;;14297:53;10235:15;;;4243:43189;14335:15;4243:43189;;14335:15;14228:3;14263:14;;;14247:30;14263:14;4243:43189;14263:14;;;:::i;:::-;4243:43189;14247:30;;:::i;:::-;14228:3;4243:43189;14188:13;;;14114:3;14149:14;;;4243:43189;14149:14;14133:30;14149:14;;;:::i;14133:30::-;14114:3;4243:43189;14074:13;;14000:3;14035:14;14019:30;4243:43189;14035:14;;;;;;:::i;14019:30::-;14000:3;4243:43189;13960:13;;13707:203;11916:21;;;4243:43189;13889:21;4243:43189;;13889:21;13724:147;13830:41;;;;;13724:147;;:86;13769:41;;;;;13724:86;;13587:110;11843:17;;;4243:43189;13680:17;4243:43189;;13680:17;13591:80;13647:24;;;13591:80;;:52;13619:24;;;13591:52;;4243:43189;;;;;;;:::i;:::-;;;;;;;;;;35011:5;4243:43189;35011:5;4243:43189;;:::i;:::-;;;;;35062:11;4243:43189;;;;;;;;;;;;;35011:5;4243:43189;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;35206:26;;:::i;:::-;9013:22;6338:1;9013:22;;:48;;;;4243:43189;9009:101;;24822:1345;;;:::i;:::-;35280:31;;-1:-1:-1;;;;;35280:31:3;;;4243:43189;;;;;;;6000:4;4243:43189;;;;;;;35326:15;:68;:94;;;4243:43189;35322:267;;4243:43189;;5876:4;35605:100;35606:86;4243:43189;35606:63;35607:50;4243:43189;;;35607:50;:::i;35606:63::-;4243:43189;;35606:86;;:::i;35605:100::-;5876:4;4243:43189;;;;;;35322:267;4243:43189;;5876:4;4243:43189;;;;;;5876:4;4243:43189;;;;;;;35606:63;35607:50;35605:100;35561:17;35481:97;4243:43189;35561:17;35510:68;35606:86;35561:17;-1:-1:-1;;;;;4243:43189:3;5876:4;35561:17;;4243:43189;;35510:68;;:::i;:::-;35481:97;;:::i;:::-;35322:267;;;;;;;;;35326:94;35398:17;-1:-1:-1;;;;;4243:43189:3;35398:17;;4243:43189;;35398:22;;35326:94;;9009:101;9084:15;;;4243:43189;9084:15;4243:43189;;9084:15;9013:48;9039:22;35011:5;9039:22;;9013:48;;4243:43189;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;;;;;;;;;;;;;;;;;37216:30;;;4243:43189;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32719:45;4243:43189;;;:::i;:::-;;;-1:-1:-1;;4243:43189:3;;;;9831:339:0;;;;4243:43189:3;9831:339:0;4243:43189:3;9831:339:0;;;;;;4243:43189:3;9831:339:0;;4243:43189:3;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;6338:1;9013:22;;:48;;;;4243:43189;9009:101;;9119:1;;;:::i;:::-;4243:43189;9013:48;9039:22;4243:43189;9039:22;;9013:48;;4243:43189;;;;;;-1:-1:-1;;4243:43189:3;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;29716:41;4243:43189;;;30088:3;4243:43189;;30067:19;;;;;30150:51;6242:1;30125:11;;;;;:::i;:::-;4243:43189;;;;30159:11;4243:43189;;;;;;;;;;;;;;30150:51;;:::i;:::-;30088:3;4243:43189;30052:13;;;30067:19;4243:43189;30067:19;4243:43189;30088:3;4243:43189;;30067:19;;;;;30150:51;6242:1;30125:11;;;;;:::i;:::-;4243:43189;;;;;;;;;;;;;30150:51;:::i;:::-;30088:3;4243:43189;30052:13;;;30067:19;29767:50;30067:19;;29767:50;:::i;:::-;4243:43189;;30088:3;4243:43189;;30067:19;;;;;30150:51;6242:1;30125:11;;;;;:::i;:::-;4243:43189;;;;;;;;;;;;;30150:51;:::i;:::-;30088:3;4243:43189;30052:13;;;30067:19;29827:50;4243:43189;30067:19;;29827:50;:::i;4243:43189::-;;;;:::i;:::-;16274:24;;;;;;;;;:52;;;4243:43189;16274:80;;;4243:43189;16270:110;;16889:12;16414:9;;16437:23;;16433:138;;4243:43189;16584:23;;;16580:138;;4243:43189;16731:23;;;16727:138;;4243:43189;16889:12;;;:::i;16727:138::-;16829:10;16770:84;16829:10;;41405:70;16829:10;;41405:70;;;;:::i;16770:84::-;16727:138;;;;16580;16682:10;16623:84;16682:10;;;41405:70;16682:10;;41405:70;;;;:::i;16623:84::-;16580:138;;;;;16433;16476:84;16414:9;;;;41405:70;16414:9;;16535:10;;41405:70;;;;:::i;16476:84::-;16433:138;;;;;16274:80;16330:24;;;16274:80;;:52;16302:24;;;16274:52;;4243:43189;;;-1:-1:-1;;4243:43189:3;;;;9239:383:0;;;;4243:43189:3;9239:383:0;7972:9;9132:15;4243:43189:3;9239:383:0;;;;;;4243:43189:3;9239:383:0;;4243:43189:3;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;12478:70:0;;;:::i;:::-;-1:-1:-1;;;;;4243:43189:3;;;;-1:-1:-1;;;4243:43189:3;;;;22507:12;4243:43189;;22507:12;4243:43189;;;;;;;;;22507:12;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;4243:43189:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;4243:43189:3;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;4243:43189:3;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4243:43189:3;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4243:43189:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36298:41;36422;36360;4243:43189;;;:::i;:::-;36298:41;;;;;;;;:::i;:::-;36360;;:::i;:::-;4243:43189;36422:41;;:::i;:::-;4243:43189;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;;;6628:50;4243:43189;;;;;;;;;;;;;;;;;;;;;;;;24317:16;4243:43189;;;:::i;:::-;;;;:::i;:::-;24317:16;:::i;:::-;4243:43189;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9013:22;;;;6338:1;9013:22;;;:48;;;;;;4243:43189;9009:101;;9923:20;;9919:50;;9983:33;;;9979:67;;4243:43189;;10111:19;;;;;;10201:9;;:25;10197:53;;9013:48;;;10091:97;9009:101;;9119:1;;;;;;:::i;:::-;4243:43189;;;;;;;;;;40273:25;4243:43189;;;40273:25;;39555:464;39571:10;;;;;;4243:43189;39583:3;39620:12;;;;;:::i;:::-;4243:43189;;;;;39657:11;4243:43189;;;;;;;;;;;;;;;;39704:26;;39700:146;;39583:3;39876:11;;;;;:::i;:::-;4243:43189;40141:22;5876:4;40141:22;;40137:58;;40222:32;;;;:::i;:::-;4243:43189;;;;-1:-1:-1;;;;;4243:43189:3;40273:63;4243:43189;;;;;;;40273:63;;:::i;:::-;:78;;4243:43189;;-1:-1:-1;40205:208:3;;4243:43189;39149:33;4243:43189;39149:33;:::i;:::-;4243:43189;;39213:18;;;:::i;:::-;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;-1:-1:-1;;4243:43189:3;;;;;;-1:-1:-1;;;;;;;4243:43189:3;;;;;39266:54;39267:41;4243:43189;;;;39267:41;;:::i;39266:54::-;39241:21;;4243:43189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4243:43189:3;39971:10;39963:45;;4243:43189;39560:9;;40137:58;40172:23;;;4243:43189;40172:23;4243:43189;;40172:23;39700:146;4243:43189;;;39754:12;4243:43189;;39754:38;4243:43189;;;;;;;;;;;;;6188:6;;;;;;;39754:38;;;4243:43189;39754:38;;4243:43189;39754:38;;;;;;;4243:43189;39754:38;;;39700:146;-1:-1:-1;;;;;;4243:43189:3;39971:10;39750:81;39700:146;39750:81;;39815:16;;;4243:43189;39815:16;4243:43189;;39815:16;39754:38;;;;4243:43189;39754:38;;;;;;;;;:::i;:::-;;;;;4243:43189;;6188:6;4243:43189;6188:6;;;;;9013:48;9039:22;4243:43189;9039:22;;9013:48;;10132:3;10167:10;10151:26;4243:43189;10167:10;;;;;;:::i;10151:26::-;10132:3;4243:43189;10096:13;;9013:48;9039:22;6242:1;9039:22;;9013:48;;4243:43189;;;-1:-1:-1;;4243:43189:3;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;9013:22;6338:1;9013:22;;:48;;;;4243:43189;9009:101;;11814:20;;11810:50;;11874:33;;;11870:67;;-1:-1:-1;;;;;4243:43189:3;;11951:23;11947:54;;12163:12;12035:9;12054:84;12035:9;41724:80;12035:9;;41724:80;;:::i;11947:54::-;11983:18;;;4243:43189;11983:18;4243:43189;;11983:18;9013:48;9039:22;4243:43189;9039:22;;9013:48;;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;:::o;:::-;;;-1:-1:-1;;4243:43189:3;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;;4243:43189:3;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;:::o;:::-;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;-1:-1:-1;;4243:43189:3;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;4243:43189:3;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;;;;;:::o;8964:163::-;;6338:1;9013:22;;:48;;;;8964:163;9009:101;;4243:43189;;;;;;;;24356:25;:33;4243:43189;24356:5;4243:43189;24356:25;:33;:::i;:::-;4243:43189;;:::i;9013:48::-;9039:22;6242:1;9039:22;;9013:48;;4243:43189;;;;;;;;-1:-1:-1;4243:43189:3;;-1:-1:-1;4243:43189:3;;;;;;-1:-1:-1;4243:43189:3;:::o;:::-;;;;;;;:::i;:::-;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;5876:4::-;;;;;;;:::o;:::-;4243:43189;;;5876:4;;;;;;;;;;;-1:-1:-1;;;;;5876:4:3;;;;;;-1:-1:-1;;;;;;5876:4:3;;;;;;;:::o;26388:1377::-;4243:43189;;;;;;;26481:5;4243:43189;26509:15;4243:43189;26481:5;4243:43189;26509:15;;4243:43189;;;26509:27;;26505:40;;4243:43189;;;;;;-1:-1:-1;4243:43189:3;;;-1:-1:-1;4243:43189:3;;;26559:15;:55;26555:68;;4243:43189;;;;;;6000:4;4243:43189;;;;;;;26559:15;26636:69;;26632:82;;-1:-1:-1;;4243:43189:3;;;;;;;;26751:43;;;;:::i;:::-;4243:43189;;;;;26852:26;-1:-1:-1;;;;;26852:37:3;:26;;:::i;:::-;:37;:::i;:::-;4243:43189;;;;26904:22;26900:207;;4243:43189;;;;;9013:22;6338:1;9013:22;;:48;;;;26388:1377;9009:101;;24822:1345;4243:43189;;;;24822:1345;;:::i;:::-;4243:43189;;;;;;;;;27239:35;27235:111;;26388:1377;4243:43189;;;;;5876:4;4243:43189;;;;;;5876:4;4243:43189;;;;;;;;5876:4;4243:43189;27355:144;27401:98;27402:85;4243:43189;27436:51;4243:43189;;-1:-1:-1;;;;;27655:103:3;4243:43189;;;;27436:51;;:::i;:::-;4243:43189;;;27402:85;:::i;:::-;27401:98;:::i;:::-;27355:144;;:::i;:::-;27554:41;4243:43189;;;27554:85;;4243:43189;;6000:4;;;;;;;4243:43189;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;5876:4;;4243:43189;;;;5876:4;;4243:43189;27655:103;26388:1377::o;27554:85::-;;;;;27235:111;27319:16;6000:4;27319:16;;:::i;:::-;4243:43189;6000:4;;;;;;;;;27235:111;;;;9013:48;9039:22;26481:5;9039:22;;9013:48;;26900:207;26991:85;;4243:43189;26991:85;4243:43189;;;;26991:41;:85;4243:43189;;;26991:85;;4243:43189;;6000:4;;;;;;;27090:7::o;26991:85::-;;;;;26632:82;26707:7;;;;;:::o;26555:68::-;26616:7;;;;:::o;4243:43189::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;4243:43189:3;;-1:-1:-1;4243:43189:3;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;-1:-1:-1;4243:43189:3;;-1:-1:-1;4243:43189:3;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;6188:6::-;-1:-1:-1;;;;;6383:1:3;;6188:6;6383:1;-1:-1:-1;;;;;6383:1:3;;6188:6;;;;;:::o;:::-;-1:-1:-1;;;;;6383:1:3;;6188:6;;-1:-1:-1;;;;;6188:6:3;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::o;:::-;38184:5;4243:43189;;;;;-1:-1:-1;4243:43189:3;;;;;;;;-1:-1:-1;;;;;;;;;;;6188:6:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;4243:43189;6188:6;;4243:43189;6188:6;;:::o;:::-;;4243:43189;6188:6;;4243:43189;6188:6;;;4243:43189;6188:6;;;;;;;;4243:43189;;6188:6;4243:43189;;;6188:6;4243:43189;;6188:6;;;;;;;;;4243:43189;6188:6;;4243:43189;6188:6;;;4243:43189;6188:6;;;;;;;;4243:43189;;6188:6;4243:43189;;;6188:6;4243:43189;;6188:6;;;;;;;;4243:43189;;6188:6;4243:43189;;;6188:6;4243:43189;;6188:6;;;;;;;;;4243:43189;6188:6;;4243:43189;6188:6;;;4243:43189;6188:6;;;;;;;;4243:43189;;6188:6;4243:43189;;;;6188:6;;;;;;;;;;;;;;;4243:43189;;;6188:6;;4243:43189;6188:6;4243:43189;6188:6;4243:43189;;6188:6;;;4243:43189;;6188:6;4243:43189;;6188:6;;;;4243:43189;;6188:6;4243:43189;;6188:6;;;;4243:43189;6188:6;;;4243:43189;6188:6;;;;4243:43189;;6188:6;4243:43189;;6188:6;;;;4243:43189;6188:6;;;4243:43189;6188:6;;;;;4243:43189;6188:6;;;;;;;;;;;;37555:686;37670:20;;37666:34;;6242:1;4243:43189;;37739:12;4243:43189;;;;-1:-1:-1;;;;;4243:43189:3;;37802:36;4243:43189;;;;;:::i;:::-;37802:36;;:::i;:::-;4243:43189;;37852:22;;37848:36;;37961:60;-1:-1:-1;;;;;37934:87:3;6383:1;;37961:60;:::i;:::-;37934:87;:::i;:::-;38131:7;6188:6;4243:43189;;-1:-1:-1;;;38131:77:3;;;;;4243:43189;;;;6188:6;;;;;;;;4243:43189;;;;;-1:-1:-1;;;;;4243:43189:3;;;;-1:-1:-1;;;;;6188:6:3;;;;;;;-1:-1:-1;;;;;6188:6:3;4243:43189;;6188:6;;;;;4243:43189;;;;;6188:6;;;;;;;;-1:-1:-1;;6188:6:3;;;;;;;:::i;:::-;6383:1;;6188:6;;;;38131:77;;;;;;;;;4243:43189;38131:77;;;38218:16;37555:686;:::o;38131:77::-;;;;4243:43189;38131:77;4243:43189;38131:77;;;;;;;;:::i;:::-;;;;;:::i;:::-;;37555:686;:::o;38131:77::-;;;;;37848:36;37876:8;;;;4243:43189;37876:8;:::o;37666:34::-;37692:8;;4243:43189;37692:8;:::o;37555:686::-;37670:20;;37666:34;;6290:1;4243:43189;;37739:12;4243:43189;;;;-1:-1:-1;;;;;4243:43189:3;;37802:36;4243:43189;;;;;:::i;37555:686::-;37670:20;;37666:34;;6338:1;4243:43189;;37739:12;4243:43189;;;;-1:-1:-1;;;;;4243:43189:3;;37802:36;4243:43189;;;;;:::i;37555:686::-;37670:20;;37666:34;;4243:43189;;;;37739:12;4243:43189;;;;;;-1:-1:-1;;;;;4243:43189:3;;37802:36;4243:43189;;;;;:::i;37666:34::-;37692:8;;;4243:43189;37692:8;:::o;4243:43189::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;4243:43189:3;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;-1:-1:-1;4243:43189:3;;-1:-1:-1;4243:43189:3;;;;-1:-1:-1;4243:43189:3;;;;-1:-1:-1;4243:43189:3;;;;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;;:::o;24822:1345::-;;;;4243:43189;;;;;;;;25009:5;4243:43189;25009:5;4243:43189;;:::i;:::-;25057:26;25103:15;4243:43189;25057:26;;;4243:43189;;25103:15;;;;;4243:43189;;;;;25057:26;4243:43189;25103:18;4243:43189;;;25097:43;;25093:73;;25177:238;;4243:43189;25057:26;25205:29;:15;;;:29;:::i;:::-;;:46;4243:43189;;25197:54;;:126;;;25177:238;25197:126;;;25009:5;4243:43189;25177:238;;25197:126;;-1:-1:-1;4243:43189:3;;;:::i;:::-;;25571:15;;4243:43189;25608:24;25634:10;;;;;;4243:43189;;;;;;;;;;;;;26132:28;24822:1345;:::o;25646:3::-;25922:94;25675:18;:15;;;:18;:::i;:::-;;4243:43189;;25675:18;;4243:43189;;;25728:35;;;;;25932:64;6000:4;25728:72;;;25057:26;25840:24;;4243:43189;;;25833:31;;;;;:64;-1:-1:-1;;;;;25974:22:3;25933:37;25833:64;;;25933:37;;:::i;:::-;25974:22;;4243:43189;;25932:64;;:::i;:::-;5876:4;25922:94;;:::i;:::-;26035:23;;;;26031:81;;25009:5;4243:43189;25608:24;;26031:81;26078:19;;;;;;;:::o;25833:64::-;25974:22;25933:37;-1:-1:-1;;;;;25833:64:3;;;;25728:72;;6000:4;25932:64;25728:72;;;;25197:126;25277:15;4243:43189;25057:26;25277:29;:15;;;:29;:::i;:::-;;:46;4243:43189;;25271:52;;25197:126;;25093:73;25142:24;;;-1:-1:-1;25142:24:3;;:::o;4243:43189::-;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;:::i;:::-;;;;-1:-1:-1;4243:43189:3;;;;:::o;:::-;;;:::o;47207:223::-;47274:16;47270:154;;47207:223;:::o;47270:154::-;47289:1;47324:10;;;;;:40;;;;:::i;:::-;;47382:8;47378:35;;47207:223::o;4243:43189::-;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;:::o;7292:355:0:-;-1:-1:-1;;7390:251:0;;;;;7292:355::o;7390:251::-;;;;;;;38790:172:3;6057:2;6000:4;38875:15;4243:43189;5876:4;6057:2;4243:43189;;;;;;6057:2;4243:43189;;;;;;;38894:60;38875:80;38691:31;6057:2;38875:15;4243:43189;38894:60;;:::i;:::-;38875:15;:80;:::i;2189:138:2:-;2268:7;2263:12;;;2259:35;;4243:43189:3;;2189:138:2;:::o;2259:35::-;23595:191;;;;;;1385:138;1464:7;1459:12;;;1455:35;;4243:43189:3;;1385:138:2;:::o;3395:::-;-1:-1:-1;;;3469:12:2;;;3465:35;;-1:-1:-1;;;;;4243:43189:3;3395:138:2;:::o;32777:1434:3:-;;;;4243:43189;;32986:37;4243:43189;;32986:37;:::i;:::-;33033:27;33059:1;33076:13;33059:1;33112:3;4243:43189;;33091:19;;;;;33149:11;;;;:::i;:::-;4243:43189;6338:1;33059;4243:43189;33210:12;4243:43189;;;;;;;;-1:-1:-1;;;33210:38:3;;;;;4243:43189;;;;;;;33210:38;;4243:43189;;-1:-1:-1;;;;;4243:43189:3;33210:38;;;;;;;33059:1;33210:38;;;33112:3;-1:-1:-1;;;;;;4243:43189:3;;;;;33210:50;33206:608;;33112:3;;4243:43189;;33076:13;;33206:608;33059:1;4243:43189;;;;;;;;;;33380:13;;;;;;:57;;4243:43189;;-1:-1:-1;;;33396:37:3;;6338:1;33210:38;33396:37;;4243:43189;33210:38;4243:43189;;;;;;;33396:37;4243:43189;33396:4;:37;;;;;;;33059:1;33396:37;;;33380:57;;;;33478:60;;;;4243:43189;;;:::i;:::-;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;34532:55;;4243:43189;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;24317:16;4243:43189;;34487:26;;4243:43189;;6338:1;4243:43189;;:::i;24317:16::-;4243:43189;;34564:22;;4243:43189;;34532:55;;:::i;:::-;34590:2;4243:43189;;;;;;34590:2;4243:43189;;;;;;;-1:-1:-1;;;;;4243:43189:3;34531:91;34604:17;;4243:43189;;34531:91;;:::i;:::-;33478:60;;33561:30;;;33478:60;33557:243;;33478:60;33206:608;;;;;33557:243;4243:43189;33764:17;4243:43189;;;;;;;;;;;;:::i;:::-;6338:1;4243:43189;;;33674:68;;4243:43189;;33674:68;;4243:43189;33674:68;;;4243:43189;33674:68;;;4243:43189;33615:127;;;;:::i;33764:17::-;33557:243;;;;;;;33561:30;33578:13;;;;33561:30;;33478:60;33059:1;33478:60;;;33396:37;;;4243:43189;33396:37;;;;;;;;;4243:43189;33396:37;;;:::i;:::-;;;4243:43189;;;;6188:6;33396:37;;;;;;-1:-1:-1;33396:37:3;;33380:57;33059:1;33380:57;;;33210:38;;;;4243:43189;33210:38;;;;;;;;;:::i;:::-;;;;33091:19;;;;;;;;;4243:43189;33872:33;;33868:304;;34182:22;32777:1434;:::o;33868:304::-;33961:37;;;:::i;:::-;34017:13;33059:1;34032:19;;;;;;34141:20;;;;:::o;34053:3::-;34095:18;;4243:43189;34095:18;;;:::i;:::-;;34076:37;;;;:::i;:::-;;;;;;:::i;:::-;;4243:43189;34017:13;;32777:1434;;;;4243:43189;;32986:37;4243:43189;;32986:37;:::i;:::-;33033:27;33059:1;33076:13;33059:1;33112:3;4243:43189;;33091:19;;;;;33149:11;;;;:::i;:::-;4243:43189;6290:1;33059;4243:43189;33210:12;4243:43189;;;;;;;;-1:-1:-1;;;33210:38:3;;;;;4243:43189;;;;;;;33210:38;;4243:43189;;-1:-1:-1;;;;;4243:43189:3;33210:38;;;;;;;33059:1;33210:38;;;33112:3;-1:-1:-1;;;;;;4243:43189:3;;;;;33210:50;33206:608;;33112:3;;4243:43189;;33076:13;;33206:608;33059:1;4243:43189;;;;;;;;;;33380:13;;;;;;:57;;4243:43189;;-1:-1:-1;;;33396:37:3;;6290:1;33210:38;33396:37;;4243:43189;33210:38;4243:43189;;;;;;;33396:37;4243:43189;33396:4;:37;;;;;;;33059:1;33396:37;;;33380:57;;;;33478:60;;;;4243:43189;;;:::i;:::-;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;34532:55;;4243:43189;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;24317:16;4243:43189;;34487:26;;4243:43189;;6290:1;4243:43189;;:::i;34532:55::-;34590:2;4243:43189;;;;;;34590:2;4243:43189;;;;;;;-1:-1:-1;;;;;4243:43189:3;34531:91;34604:17;;4243:43189;;34531:91;;:::i;:::-;33478:60;;33561:30;;;33478:60;33557:243;;33478:60;33206:608;;;;;33557:243;4243:43189;33764:17;4243:43189;;;;;;;;;;;;:::i;:::-;6290:1;4243:43189;;;33674:68;;4243:43189;;33674:68;;4243:43189;33674:68;;;4243:43189;33674:68;;;4243:43189;33615:127;;;;:::i;33764:17::-;33557:243;;;;;;;33561:30;33578:13;;;;33561:30;;33478:60;33059:1;33478:60;;;33396:37;;;4243:43189;33396:37;;;;;;;;;4243:43189;33396:37;;;:::i;:::-;;;4243:43189;;;;6188:6;33396:37;;;;;;-1:-1:-1;33396:37:3;;33380:57;33059:1;33380:57;;;33210:38;;;;4243:43189;33210:38;;;;;;;;;:::i;:::-;;;;33091:19;;;;;;;;;4243:43189;33872:33;;33868:304;;34182:22;32777:1434;:::o;33868:304::-;33961:37;;;:::i;:::-;34017:13;33059:1;34032:19;;;;;;34141:20;;;;:::o;34053:3::-;34095:18;;4243:43189;34095:18;;;:::i;:::-;;34076:37;;;;:::i;:::-;;;;;;:::i;:::-;;4243:43189;34017:13;;32777:1434;;;;4243:43189;;32986:37;4243:43189;;32986:37;:::i;:::-;33033:27;33059:1;33076:13;33059:1;33112:3;4243:43189;;33091:19;;;;;33149:11;;;;:::i;:::-;4243:43189;6242:1;33059;4243:43189;33210:12;4243:43189;;;;;;;;-1:-1:-1;;;33210:38:3;;;;;4243:43189;;;;;;;33210:38;;4243:43189;;-1:-1:-1;;;;;4243:43189:3;33210:38;;;;;;;33059:1;33210:38;;;33112:3;-1:-1:-1;;;;;;4243:43189:3;;;;;33210:50;33206:608;;33112:3;;6242:1;4243:43189;33076:13;;33206:608;33059:1;4243:43189;;;;;;;;;;33380:13;;;;;;:57;;4243:43189;;-1:-1:-1;;;33396:37:3;;6242:1;33210:38;33396:37;;4243:43189;33210:38;4243:43189;;;;;;;33396:37;4243:43189;33396:4;:37;;;;;;;33059:1;33396:37;;;33380:57;;;;33478:60;;;;4243:43189;;;:::i;:::-;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;34532:55;;6242:1;;4243:43189;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;24317:16;4243:43189;;34487:26;;4243:43189;;6242:1;4243:43189;;:::i;34532:55::-;34590:2;4243:43189;;;;;;34590:2;4243:43189;;;;;;;-1:-1:-1;;;;;4243:43189:3;34531:91;34604:17;;4243:43189;;34531:91;;:::i;:::-;33478:60;;33561:30;;;33478:60;33557:243;;33478:60;33206:608;;;;;33557:243;4243:43189;33764:17;4243:43189;;6242:1;4243:43189;;;;;;;;;:::i;:::-;;;;;33674:68;;4243:43189;;33674:68;;4243:43189;33674:68;;;4243:43189;33674:68;;;4243:43189;33615:127;;;;:::i;33764:17::-;33557:243;;;;;;;33561:30;33578:13;;;;33561:30;;33478:60;33059:1;33478:60;;;33396:37;;;4243:43189;33396:37;;;;;;;;;4243:43189;33396:37;;;:::i;:::-;;;4243:43189;;;;6188:6;33396:37;;;;;;-1:-1:-1;33396:37:3;;33380:57;33059:1;33380:57;;;33210:38;;;;4243:43189;33210:38;;;;;;;;;:::i;:::-;;;;33091:19;;;;;;;;;4243:43189;33872:33;;33868:304;;34182:22;32777:1434;:::o;33868:304::-;33961:37;;;:::i;:::-;34017:13;33059:1;34032:19;;;;;;34141:20;;;;:::o;34053:3::-;34095:18;;6242:1;34095:18;;;:::i;:::-;;34076:37;;;;:::i;:::-;;;;;;:::i;:::-;;4243:43189;34017:13;;22875:140:2;4243:43189:3;22949:14:2;;;22945:36;;23595:191;4243:43189:3;23595:191:2;;;;6145:1089:0;4243:43189:3;;;;;6813:405:0;;;;;;-1:-1:-1;6813:405:0;;-1:-1:-1;;6813:405:0;6145:1089::o;27792:648:3:-;27903:26;;;27962:15;4243:43189;;;;27962:15;;;4243:43189;27962:24;:15;;;:24;:::i;:::-;;4243:43189;;27944:15;:61;27940:81;;-1:-1:-1;4243:43189:3;;;28108:9;28084:15;;4243:43189;;28074:32;;;;;28169:24;;;;:::i;:::-;;27944:15;4243:43189;;;;28228:54;;:130;;;;28108:9;28207:180;;;4243:43189;;28036:36;;28207:180;28373:14;;;:::o;28228:130::-;4243:43189;28325:33;;27903:26;28325:33;4243:43189;;27944:15;28306:52;;28228:130;;;28074:32;28414:19;;;4243:43189;28414:19;;4243:43189;28414:19;27940:81;28007:14;;;;:::o;45678:1523::-;;;6338:1;9013:22;;:48;;;;45678:1523;9009:101;;9119:1;;;;;;;:::i;:::-;4243:43189;;45991:21;4243:43189;46022:25;4243:43189;46057:970;46073:10;;;;;;47041:17;;;;;;;47037:158;;45678:1523;;:::o;47037:158::-;4243:43189;47092:41;;;;;;;;;:::i;:::-;;47151:8;47147:37;;45678:1523::o;47147:37::-;47168:16;;;4243:43189;47168:16;46144:38;4243:43189;47168:16;46085:3;46114:12;;;;;;;;;;:::i;:::-;4243:43189;;;;;46144:12;4243:43189;;;;;;;;;;;;;;;46144:38;4243:43189;;6188:6;;;;;;;46144:38;;;;;4243:43189;46144:38;;;;;;;4243:43189;46144:38;;;46085:3;-1:-1:-1;;;;;;4243:43189:3;;;;;46144:49;;;46140:78;;46242:11;;;;:::i;:::-;4243:43189;;;;;46278:11;4243:43189;;;;;;;;;;;;;;;;;;;;46325:31;;46321:211;;46085:3;4243:43189;;;;;;46550:30;;;;46546:65;;46144:38;4243:43189;;;;;;;46961:55;4243:43189;;;;46832:53;4243:43189;;;;;;;;;;;;;46752:38;-1:-1:-1;;;;;46773:17:3;;;:::i;:::-;4243:43189;;;;;;;;46752:38;4243:43189;-1:-1:-1;;;;;;;4243:43189:3;;;;;;;-1:-1:-1;;;;;;;4243:43189:3;;;;;;46752:38;4243:43189;;;;;46832:53;:::i;:::-;46808:20;;4243:43189;;;;;;;;;;;;;;;;;;;;;;;;;;;;46961:55;4243:43189;46062:9;;;;;;;46546:65;46589:22;;;4243:43189;46589:22;46144:38;4243:43189;46589:22;46321:211;46465:52;46405:37;;4243:43189;46405:37;;;;:::i;:::-;4243:43189;;;;;;;;;;46465:52;46321:211;;;;;;46144:38;;;;;4243:43189;46144:38;;;;;;;;;:::i;:::-;;;;;9013:48;9039:22;6242:1;9039:22;;9013:48;;45050:622;;;;6338:1;9013:22;;:48;;;;45050:622;9009:101;;9119:1;;;:::i;:::-;-1:-1:-1;4243:43189:3;;;45227:12;4243:43189;;;;;;-1:-1:-1;;;;;4243:43189:3;;45264:9;45297:3;4243:43189;;45275:20;;;;;45334:12;;;;:::i;:::-;4243:43189;;;-1:-1:-1;;;45364:31:3;;;;;4243:43189;;;;;;;45364:31;4243:43189;45364:31;;;;;;;;-1:-1:-1;45364:31:3;;;45297:3;-1:-1:-1;;;;;;4243:43189:3;;;;;45364:42;;;45360:71;;4243:43189;;45603:52;4243:43189;;;;-1:-1:-1;4243:43189:3;45474:11;4243:43189;;;-1:-1:-1;4243:43189:3;;-1:-1:-1;4243:43189:3;;;45546:37;4243:43189;;-1:-1:-1;4243:43189:3;45546:37;;:::i;:::-;4243:43189;;;;;;;;;;45603:52;4243:43189;45264:9;;45364:31;;;;;4243:43189;45364:31;;;;;;;;;:::i;:::-;;;;;45275:20;;;;;;;;45050:622::o;9013:48::-;9039:22;6242:1;9039:22;;9013:48;;43755:1289;;;43960:31;4243:43189;;43960:31;:::i;:::-;44036;4243:43189;;44036:31;:::i;:::-;44077:27;44103:1;44114:29;44103:1;44159:9;44103:1;44154:447;44192:3;4243:43189;;44170:20;;;;;44238:12;;;;:::i;:::-;4243:43189;;;-1:-1:-1;;;44215:36:3;;;;;4243:43189;;;;44215:36;4243:43189;44215:36;4243:43189;-1:-1:-1;;;;;4243:43189:3;;44215:36;;;;;;;44103:1;44215:36;;;44192:3;-1:-1:-1;44211:380:3;;;4243:43189;44304:12;;;;;;:::i;:::-;4243:43189;44271:45;;;;:::i;:::-;4243:43189;;44211:380;;4243:43189;44159:9;;;44211:380;44477:12;;4243:43189;44477:12;;;;;;:::i;:::-;4243:43189;44440:49;;;;:::i;:::-;4243:43189;;44211:380;;;44215:36;;;;;;;;;;;;;;;;;:::i;:::-;;;4243:43189;;;;;;;;;;;;44215:36;;;;;;-1:-1:-1;44215:36:3;;44170:20;;;;;;;;;44666:30;;;:::i;:::-;44738:32;;;;:::i;:::-;44786:9;44103:1;44797:19;;;;;;44894:9;;;44103:1;44905:21;;;;;;45004:33;;;;43755:1289;:::o;44928:3::-;44965:18;;4243:43189;44965:18;;;:::i;:::-;4243:43189;44947:36;;;;:::i;:::-;4243:43189;;44894:9;;44818:3;44853:16;;4243:43189;44853:16;;;:::i;:::-;4243:43189;44837:32;;;;:::i;:::-;4243:43189;;44786:9;;4243:43189;;;;;;;;;;;;;;-1:-1:-1;4243:43189:3;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;41817:1932;;;;;;;;42184:38;4243:43189;;;;;;42089:12;4243:43189;;;;;;;;;;;;;;;;:::i;:::-;42184:38;;:::i;:::-;4243:43189;;;42290:19;42286:1145;;41817:1932;4243:43189;;;;;;43441:302;;41817:1932;;;;;:::o;43441:302::-;4243:43189;43652:66;43484:249;43707:10;4243:43189;;;;:::i;:::-;43652:66;;:::i;:::-;43441:302;;;;;;;42286:1145;6383:1;;;;;42368:85;42395:58;-1:-1:-1;;;;;6383:1:3;;42395:58;:::i;42368:85::-;42476:7;6188:6;4243:43189;;;-1:-1:-1;;;42476:80:3;;;;;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;:::i;:::-;;;;-1:-1:-1;;4243:43189:3;;;;;;:::i;:::-;6383:1;;4243:43189;;;;;6188:6;42476:80;;;;;;;;;4243:43189;42476:80;;;42286:1145;42467:89;;;42574:18;;42570:48;;4243:43189;;;;6188:6;;;;;;;;42648:81;;4243:43189;42476:80;42648:81;;4243:43189;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4243:43189:3;;;;;;:::i;:::-;;;;;6188:6;42648:81;;;;;;;;;4243:43189;42648:81;;;42286:1145;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;;;;;;-1:-1:-1;42856:30:3;;;4243:43189;;-1:-1:-1;;;;;;4243:43189:3;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;;42913:54;;-1:-1:-1;;;;;4243:43189:3;;;42913:54;:::i;:::-;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;;4243:43189:3;43011:10;4243:43189;;-1:-1:-1;;;;;4243:43189:3;;;;43041:9;;43052:19;;;;;;4243:43189;;;;;-1:-1:-1;;;;;;;;;;;4243:43189:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;43011:10;4243:43189;;;;43339:81;;;42286:1145;;;;;;43073:3;4243:43189;;;;;;43096:29;4243:43189;;;43096:29;43133:24;:13;;;;:::i;:::-;4243:43189;43133:24;:::i;:::-;2762:395:1;4243:43189:3;2762:395:1;;42476:80:3;2762:395:1;4243:43189:3;2762:395:1;4243:43189:3;;2762:395:1;;;;42476:80:3;2762:395:1;;;;;;;;;;;;;;;;4243:43189:3;;;;;;43263:11;4243:43189;;43227:28;4243:43189;;;43227:28;43263:11;;:::i;:::-;4243:43189;-1:-1:-1;;;4291:13:2;;;4287:36;;4243:43189:3;6110:422:1;4243:43189:3;6110:422:1;;;;4243:43189:3;6110:422:1;4243:43189:3;;6110:422:1;;4243:43189:3;6110:422:1;;;;-1:-1:-1;;;;;6110:422:1;;6383:1:3;;6110:422:1;;;;-1:-1:-1;;;;;6110:422:1;;;;;;4243:43189:3;43041:9;;;;42648:81;;;;4243:43189;42648:81;;4243:43189;42648:81;;;;;;4243:43189;42648:81;;;:::i;:::-;;;4243:43189;;;;;42648:81;;;;;;;-1:-1:-1;42648:81:3;;42570:48;42601:17;;;4243:43189;42601:17;42476:80;4243:43189;42601:17;42476:80;;;;;4243:43189;42476:80;4243:43189;42476:80;;;;;;;:::i;:::-;;;;;;41817:1932;;;;;;;42184:38;4243:43189;;;6242:1;4243:43189;;42089:12;4243:43189;;;;;;;;;;;;;;;;:::i;42184:38::-;4243:43189;;;42290:19;42286:1145;;41817:1932;4243:43189;;;;;;43441:302;;41817:1932;;:::o;43441:302::-;43573:10;;;;6242:1;43573:10;:::i;42286:1145::-;6383:1;;;;;42368:85;42395:58;-1:-1:-1;;;;;6383:1:3;;42395:58;:::i;42368:85::-;42476:7;6188:6;4243:43189;;;-1:-1:-1;;;42476:80:3;;;;;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;:::i;:::-;6383:1;;4243:43189;;;;;6188:6;42476:80;;;;;;;;;4243:43189;42476:80;;;42286:1145;42467:89;;;42574:18;;42570:48;;4243:43189;;;;6188:6;;;;;;;;42648:81;;4243:43189;42476:80;42648:81;;4243:43189;;;;;;;;:::i;:::-;;;;;6188:6;42648:81;;;;;;;;;4243:43189;42648:81;;;42286:1145;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;6242:1;4243:43189;;;;;42856:30;4243:43189;;-1:-1:-1;;;;;;4243:43189:3;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;42913:54;;-1:-1:-1;;;;;4243:43189:3;;;42913:54;:::i;:::-;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;;4243:43189:3;43011:10;4243:43189;;-1:-1:-1;;;;;4243:43189:3;;;;43052:19;;;;;;4243:43189;;;-1:-1:-1;;;;;;;;;;;4243:43189:3;;;;;;;;;;6242:1;4243:43189;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;43011:10;4243:43189;;;;43339:81;;;42286:1145;;;;;;43073:3;6242:1;4243:43189;;;;;;;43096:29;4243:43189;;;43096:29;43133:24;:13;;;;:::i;:24::-;2762:395:1;4243:43189:3;2762:395:1;;42476:80:3;2762:395:1;4243:43189:3;2762:395:1;4243:43189:3;;2762:395:1;;;;42476:80:3;2762:395:1;;;;;;;;;;;;;;;;4243:43189:3;43041:9;;42648:81;;;;4243:43189;42648:81;;4243:43189;42648:81;;;;;;4243:43189;42648:81;;;:::i;:::-;;;4243:43189;;;;;42648:81;;;;;;;-1:-1:-1;42648:81:3;;42476:80;;;;;4243:43189;42476:80;4243:43189;42476:80;;;;;;;:::i;:::-;;;;;;41817:1932;;;;;;;42184:38;4243:43189;;;6290:1;4243:43189;;42089:12;4243:43189;;;;;;;;;;;;;;;;:::i;42184:38::-;4243:43189;;;42290:19;42286:1145;;41817:1932;4243:43189;;;;;;43441:302;;41817:1932;;:::o;43441:302::-;43573:10;;;;6290:1;43573:10;:::i;42286:1145::-;6383:1;;;;;42368:85;42395:58;-1:-1:-1;;;;;6383:1:3;;42395:58;:::i;42368:85::-;42476:7;6188:6;4243:43189;;;-1:-1:-1;;;42476:80:3;;;;;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;:::i;:::-;6383:1;;4243:43189;;;;;6188:6;42476:80;;;;;;;;;4243:43189;42476:80;;;42286:1145;42467:89;;;42574:18;;42570:48;;4243:43189;;;;6188:6;;;;;;;;42648:81;;4243:43189;42476:80;42648:81;;4243:43189;;;;;;;;:::i;:::-;;;;;6188:6;42648:81;;;;;;;;;4243:43189;42648:81;;;42286:1145;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;6290:1;4243:43189;;;-1:-1:-1;42856:30:3;4243:43189;;-1:-1:-1;;;;;;4243:43189:3;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;42913:54;;-1:-1:-1;;;;;4243:43189:3;;;42913:54;:::i;:::-;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;;4243:43189:3;43011:10;4243:43189;;-1:-1:-1;;;;;4243:43189:3;;;;43052:19;;;;;;4243:43189;;;-1:-1:-1;;;;;;;;;;;4243:43189:3;;;;;;;;;;6290:1;4243:43189;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;43011:10;4243:43189;;;;43339:81;;;42286:1145;;;;;;43073:3;42856:30;4243:43189;;;;;;;6290:1;4243:43189;;;43096:29;43133:24;:13;;;;:::i;:24::-;2762:395:1;4243:43189:3;2762:395:1;;42476:80:3;2762:395:1;4243:43189:3;2762:395:1;4243:43189:3;;2762:395:1;;;;42476:80:3;2762:395:1;;;;;;;;;;;;;;;;4243:43189:3;43041:9;;42648:81;;;;4243:43189;42648:81;;4243:43189;42648:81;;;;;;4243:43189;42648:81;;;:::i;:::-;;;4243:43189;;;;;42648:81;;;;;;;-1:-1:-1;42648:81:3;;42476:80;;;;;4243:43189;42476:80;4243:43189;42476:80;;;;;;;:::i;:::-;;;;;;41817:1932;;;;;;;42184:38;4243:43189;;;6338:1;4243:43189;;42089:12;4243:43189;;;;;;;;;;;;;;;;:::i;42184:38::-;4243:43189;;;42290:19;42286:1145;;41817:1932;4243:43189;;;;;;43441:302;;41817:1932;;:::o;43441:302::-;43573:10;;;;6338:1;43573:10;:::i;42286:1145::-;6383:1;;;;;42368:85;42395:58;-1:-1:-1;;;;;6383:1:3;;42395:58;:::i;42368:85::-;42476:7;6188:6;4243:43189;;;-1:-1:-1;;;42476:80:3;;;;;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;:::i;:::-;6383:1;;4243:43189;;;;;6188:6;42476:80;;;;;;;;;4243:43189;42476:80;;;42286:1145;42467:89;;;42574:18;;42570:48;;4243:43189;;;;6188:6;;;;;;;;42648:81;;4243:43189;42476:80;42648:81;;4243:43189;;;;;;;;:::i;:::-;;;;;6188:6;42648:81;;;;;;;;;4243:43189;42648:81;;;42286:1145;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;6338:1;4243:43189;;;-1:-1:-1;42856:30:3;4243:43189;;-1:-1:-1;;;;;;4243:43189:3;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;42913:54;;-1:-1:-1;;;;;4243:43189:3;;;42913:54;:::i;:::-;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;;4243:43189:3;43011:10;4243:43189;;-1:-1:-1;;;;;4243:43189:3;;;;43052:19;;;;;;4243:43189;;;-1:-1:-1;;;;;;;;;;;4243:43189:3;;;;;;;;;;6338:1;4243:43189;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;43011:10;4243:43189;;;;43339:81;;;42286:1145;;;;;;43073:3;42856:30;4243:43189;;;;;;;43096:29;4243:43189;;;43096:29;43133:24;:13;;;;:::i;:24::-;2762:395:1;4243:43189:3;2762:395:1;;42476:80:3;2762:395:1;4243:43189:3;2762:395:1;4243:43189:3;;2762:395:1;;;;42476:80:3;2762:395:1;;;;;;;;;;;;;;;;4243:43189:3;43041:9;;42648:81;;;;4243:43189;42648:81;;4243:43189;42648:81;;;;;;4243:43189;42648:81;;;:::i;:::-;;;4243:43189;;;;;42648:81;;;;;;;-1:-1:-1;42648:81:3;;42476:80;;;;;4243:43189;42476:80;4243:43189;42476:80;;;;;;;:::i;:::-;;;;;;41817:1932;;;;;;;;;42184:38;4243:43189;;;;;;42089:12;4243:43189;;;;;;;;;;;;;;;;:::i;:::-;42184:38;;:::i;:::-;4243:43189;;;42290:19;42286:1145;;41817:1932;4243:43189;;;;;;43441:302;;41817:1932;;;:::o;43441:302::-;43573:10;;;;;:::i;42286:1145::-;6383:1;;;;;42368:85;42395:58;-1:-1:-1;;;;;6383:1:3;;42395:58;:::i;42368:85::-;42476:7;6188:6;4243:43189;;;-1:-1:-1;;;42476:80:3;;;;;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;:::i;:::-;6383:1;;4243:43189;;;;;6188:6;42476:80;;;;;;;;;4243:43189;42476:80;;;42286:1145;42467:89;;;42574:18;;42570:48;;4243:43189;;;;6188:6;;;;;;;;42648:81;;4243:43189;42476:80;42648:81;;4243:43189;;;;;;;;:::i;:::-;;;;;6188:6;42648:81;;;;;;;;;4243:43189;42648:81;;;42286:1145;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;;;;;-1:-1:-1;42856:30:3;;;4243:43189;;-1:-1:-1;;;;;;4243:43189:3;-1:-1:-1;;;;;4243:43189:3;;;;;;;;;;;;42913:54;;-1:-1:-1;;;;;4243:43189:3;;;42913:54;:::i;:::-;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;;4243:43189:3;43011:10;4243:43189;;-1:-1:-1;;;;;4243:43189:3;;;;43052:19;;;;;;4243:43189;;;;-1:-1:-1;;;;;;;;;;;4243:43189:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;43011:10;4243:43189;;;;43339:81;;;42286:1145;;;;;;43073:3;42856:30;4243:43189;;;;;;;43096:29;4243:43189;;;43096:29;43133:24;:13;;;;:::i;:24::-;2762:395:1;4243:43189:3;2762:395:1;;42476:80:3;2762:395:1;4243:43189:3;2762:395:1;4243:43189:3;;2762:395:1;;;;42476:80:3;2762:395:1;;;;;;;;;;;;;;;;4243:43189:3;43041:9;;42648:81;;;;4243:43189;42648:81;;4243:43189;42648:81;;;;;;4243:43189;42648:81;;;:::i;:::-;;;4243:43189;;;;;42648:81;;;;;;;-1:-1:-1;42648:81:3;;42476:80;;;;;4243:43189;42476:80;4243:43189;42476:80;;;;;;;:::i;:::-;;;;;;41817:1932;;;;;;42184:38;4243:43189;;;6430:1;4243:43189;;42089:12;4243:43189;;;;;;;;;;;;;;;;:::i;42184:38::-;4243:43189;;;42290:19;42286:1145;;41817:1932;4243:43189;;;;;;43441:302;;41817:1932;;;;:::o;43441:302::-;4243:43189;43652:66;43484:249;43707:10;4243:43189;;;;:::i;:::-;43652:66;6430:1;43652:66;:::i;:::-;43441:302;;;;;;42286:1145;6383:1;;;;;42368:85;42395:58;-1:-1:-1;;;;;6383:1:3;;42395:58;:::i;42368:85::-;42476:7;6188:6;4243:43189;;;-1:-1:-1;;;42476:80:3;;;;;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;:::i;:::-;6383:1;;4243:43189;;;;;6188:6;42476:80;;;;;;;;;4243:43189;42476:80;;;42286:1145;42467:89;;;42574:18;;42570:48;;4243:43189;;;;6188:6;;;;;;;;42648:81;;4243:43189;42476:80;42648:81;;4243:43189;;;;;;;;:::i;:::-;;;;;6188:6;42648:81;;;;;;;;;4243:43189;42648:81;;;42286:1145;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;-1:-1:-1;42856:30:3;4243:43189;;-1:-1:-1;;;;;4243:43189:3;;-1:-1:-1;;;;;;4243:43189:3;;;;;;;;;42913:54;;-1:-1:-1;;;;;4243:43189:3;;;42913:54;:::i;:::-;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;;4243:43189:3;43011:10;4243:43189;;-1:-1:-1;;;;;4243:43189:3;;;;43052:19;;;;;;4243:43189;;;-1:-1:-1;;;;;;;;;;;4243:43189:3;;;;;;;;;;6430:1;4243:43189;;;;6430:1;4243:43189;;;;;;;;;;;;;;:::i;:::-;;;;;;43011:10;4243:43189;;;;43339:81;;;42286:1145;;;;;;43073:3;4243:43189;;;;;;43096:29;4243:43189;;;43096:29;43133:24;:13;;;;:::i;:24::-;2762:395:1;4243:43189:3;2762:395:1;;42476:80:3;2762:395:1;4243:43189:3;2762:395:1;4243:43189:3;;2762:395:1;;;;42476:80:3;2762:395:1;;;;;;;;;;;;;;;;4243:43189:3;;;;;;43227:28;4243:43189;;;43227:28;43263:11;;;;;;:::i;:::-;4243:43189;-1:-1:-1;;;4291:13:2;;;4287:36;;6430:1:3;6110:422:1;4243:43189:3;6110:422:1;;;;4243:43189:3;6110:422:1;4243:43189:3;;6110:422:1;;4243:43189:3;6110:422:1;;;;-1:-1:-1;;;;;6110:422:1;;6383:1:3;;6110:422:1;;;;-1:-1:-1;;;;;6110:422:1;;;;;;4243:43189:3;43041:9;;42648:81;;;;4243:43189;42648:81;;4243:43189;42648:81;;;;;;4243:43189;42648:81;;;:::i;:::-;;;4243:43189;;;;;42648:81;;;;;;;-1:-1:-1;42648:81:3;;42476:80;;;;;4243:43189;42476:80;4243:43189;42476:80;;;;;;;:::i;:::-;;;;;;41817:1932;;;;;;42184:38;4243:43189;;;6290:1;4243:43189;;42089:12;4243:43189;;;;;;;;;;;;;;;;:::i;42184:38::-;4243:43189;;;42290:19;42286:1145;;41817:1932;4243:43189;;;;;;43441:302;;41817:1932;;;;:::o;43441:302::-;4243:43189;43652:66;43484:249;43707:10;4243:43189;;;;:::i;:::-;43652:66;6290:1;43652:66;:::i;42286:1145::-;6383:1;;;;;42368:85;42395:58;-1:-1:-1;;;;;6383:1:3;;42395:58;:::i;42368:85::-;42476:7;6188:6;4243:43189;;;-1:-1:-1;;;42476:80:3;;;;;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;:::i;:::-;6383:1;;4243:43189;;;;;6188:6;42476:80;;;;;;;;;4243:43189;42476:80;;;42286:1145;42467:89;;;42574:18;;42570:48;;4243:43189;;;;6188:6;;;;;;;;42648:81;;4243:43189;42476:80;42648:81;;4243:43189;;;;;;;;:::i;:::-;;;;;6188:6;42648:81;;;;;;;;;4243:43189;42648:81;;;42286:1145;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;-1:-1:-1;42856:30:3;4243:43189;;-1:-1:-1;;;;;4243:43189:3;;-1:-1:-1;;;;;;4243:43189:3;;;;;;;;;42913:54;;-1:-1:-1;;;;;4243:43189:3;;;42913:54;:::i;:::-;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;;4243:43189:3;43011:10;4243:43189;;-1:-1:-1;;;;;4243:43189:3;;;;43052:19;;;;;;4243:43189;;;-1:-1:-1;;;;;;;;;;;4243:43189:3;;;;;;;;;;6290:1;4243:43189;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;43011:10;4243:43189;;;;43339:81;;;42286:1145;;;;;;43073:3;4243:43189;;;;;;6290:1;4243:43189;;;43096:29;43133:24;:13;;;;:::i;:24::-;2762:395:1;4243:43189:3;2762:395:1;;42476:80:3;2762:395:1;4243:43189:3;2762:395:1;4243:43189:3;;2762:395:1;;;;42476:80:3;2762:395:1;;;;;;;;;;;;;;;;4243:43189:3;;;;;;43227:28;4243:43189;;;43227:28;43263:11;;;;;;:::i;:::-;4243:43189;-1:-1:-1;;;4291:13:2;;;4287:36;;4243:43189:3;6110:422:1;4243:43189:3;6110:422:1;;;;4243:43189:3;6110:422:1;4243:43189:3;;6110:422:1;;4243:43189:3;6110:422:1;;;;-1:-1:-1;;;;;6110:422:1;;6383:1:3;;6110:422:1;;;;-1:-1:-1;;;;;6110:422:1;;;;;;4243:43189:3;43041:9;;42648:81;;;;4243:43189;42648:81;;4243:43189;42648:81;;;;;;4243:43189;42648:81;;;:::i;:::-;;;4243:43189;;;;;42648:81;;;;;;;-1:-1:-1;42648:81:3;;42476:80;;;;;4243:43189;42476:80;4243:43189;42476:80;;;;;;;:::i;:::-;;;;;;41817:1932;;;;;;42184:38;4243:43189;;;6338:1;4243:43189;;42089:12;4243:43189;;;;;;;;;;;;;;;;:::i;42184:38::-;4243:43189;;;42290:19;42286:1145;;41817:1932;4243:43189;;;;;;43441:302;;41817:1932;;;;:::o;43441:302::-;4243:43189;43652:66;43484:249;43707:10;4243:43189;;;;:::i;:::-;43652:66;6338:1;43652:66;:::i;42286:1145::-;6383:1;;;;;42368:85;42395:58;-1:-1:-1;;;;;6383:1:3;;42395:58;:::i;42368:85::-;42476:7;6188:6;4243:43189;;;-1:-1:-1;;;42476:80:3;;;;;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;4243:43189:3;;;-1:-1:-1;;;;;4243:43189:3;;;;;;;:::i;:::-;6383:1;;4243:43189;;;;;6188:6;42476:80;;;;;;;;;4243:43189;42476:80;;;42286:1145;42467:89;;;42574:18;;42570:48;;4243:43189;;;;6188:6;;;;;;;;42648:81;;4243:43189;42476:80;42648:81;;4243:43189;;;;;;;;:::i;:::-;;;;;6188:6;42648:81;;;;;;;;;4243:43189;42648:81;;;42286:1145;-1:-1:-1;4243:43189:3;;;;;;;;;;;;;-1:-1:-1;;4243:43189:3;;;;;-1:-1:-1;42856:30:3;4243:43189;;-1:-1:-1;;;;;4243:43189:3;;-1:-1:-1;;;;;;4243:43189:3;;;;;;;;;42913:54;;-1:-1:-1;;;;;4243:43189:3;;;42913:54;:::i;:::-;4243:43189;;;;;;;;;;;;;-1:-1:-1;;;;;;4243:43189:3;43011:10;4243:43189;;-1:-1:-1;;;;;4243:43189:3;;;;43052:19;;;;;;4243:43189;;;-1:-1:-1;;;;;;;;;;;4243:43189:3;;;;;;;;;;6338:1;4243:43189;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;43011:10;4243:43189;;;;43339:81;;;42286:1145;;;;;;43073:3;4243:43189;;;;;;43096:29;4243:43189;;;43096:29;43133:24;:13;;;;:::i;:24::-;2762:395:1;4243:43189:3;2762:395:1;;42476:80:3;2762:395:1;4243:43189:3;2762:395:1;4243:43189:3;;2762:395:1;;;;42476:80:3;2762:395:1;;;;;;;;;;;;;;;;4243:43189:3;;;;;;6338:1;4243:43189;;;43227:28;43263:11;;;;;;:::i;:::-;4243:43189;-1:-1:-1;;;4291:13:2;;;4287:36;;4243:43189:3;6110:422:1;4243:43189:3;6110:422:1;;;;4243:43189:3;6110:422:1;4243:43189:3;;6110:422:1;;4243:43189:3;6110:422:1;;;;-1:-1:-1;;;;;6110:422:1;;6383:1:3;;6110:422:1;;;;-1:-1:-1;;;;;6110:422:1;;;;;;4243:43189:3;43041:9;;42648:81;;;;4243:43189;42648:81;;4243:43189;42648:81;;;;;;4243:43189;42648:81;;;:::i;:::-;;;4243:43189;;;;;42648:81;;;;;;;-1:-1:-1;42648:81:3;;42476:80;;;;;4243:43189;42476:80;4243:43189;42476:80;;;;;;;:::i;:::-;;;;;;40473:658;;;;;4243:43189;;;;;;40703:78;40704:65;40649:5;4243:43189;;;;;;;;;;;40704:65;;:::i;40703:78::-;40835:21;;4243:43189;5876:4;40812:57;40813:43;4243:43189;;40813:43;;:::i;40812:57::-;5876:4;4243:43189;;;;40960:23;40956:169;;40473:658;;:::o;40956:169::-;-1:-1:-1;41017:46:3;;;;;;;;;:::i;:::-;;41081:8;41077:37;;40473:658::o;41077:37::-;41098:16;;;-1:-1:-1;41098:16:3;4243:43189;-1:-1:-1;41098:16:3

Swarm Source

ipfs://07326f9d9ca0fb3f9b0542244228578e4cb976e55ebd4bd148f2588bea2a1df9

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ 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.