ETH Price: $3,301.29 (-10.20%)

Token

Concave Presale Token (BBT) (bbtCNV)
 

Overview

Max Total Supply

712,793.358046022378752866 bbtCNV

Holders

230

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
bbtCNV

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2022-01-30
*/

// SPDX-License-Identifier: WTFPL
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*///////////////////////////////////////////////////////////////
                             METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*///////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*///////////////////////////////////////////////////////////////
                             EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    bytes32 public constant PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*///////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*///////////////////////////////////////////////////////////////
                              ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*///////////////////////////////////////////////////////////////
                              EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            bytes32 digest = keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
                )
            );

            address recoveredAddress = ecrecover(digest, v, r, s);

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}


/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @author Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
library SafeTransferLib {
    /*///////////////////////////////////////////////////////////////
                            ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool callStatus;

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            callStatus := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(callStatus, "ETH_TRANSFER_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                           ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 100 because the calldata length is 4 + 32 * 3.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "APPROVE_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                         INTERNAL HELPER LOGIC
    //////////////////////////////////////////////////////////////*/

    function didLastOptionalReturnCallSucceed(bool callStatus) private pure returns (bool success) {
        assembly {
            // Get how many bytes the call returned.
            let returnDataSize := returndatasize()

            // If the call reverted:
            if iszero(callStatus) {
                // Copy the revert message into memory.
                returndatacopy(0, 0, returnDataSize)

                // Revert with the same message.
                revert(0, returnDataSize)
            }

            switch returnDataSize
            case 32 {
                // Copy the return data into memory.
                returndatacopy(0, 0, returnDataSize)

                // Set success to whether it returned true.
                success := iszero(iszero(mload(0)))
            }
            case 0 {
                // There was no return data.
                success := 1
            }
            default {
                // It returned some malformed input.
                success := 0
            }
        }
    }
}

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

interface ICNV {
    function mint(address to, uint256 amount) external returns (uint256);

    function totalSupply() external view returns (uint256);
}

/// @notice Concave Presale Token
/// @author 0xBarista & Dionysus (ConcaveFi)
contract bbtCNV is ERC20("Concave Presale Token (BBT)", "bbtCNV", 18) {

    /* ---------------------------------------------------------------------- */
    /*                                DEPENDENCIES                            */
    /* ---------------------------------------------------------------------- */

    using SafeTransferLib for ERC20;

    /* ---------------------------------------------------------------------- */
    /*                             IMMUTABLE STATE                            */
    /* ---------------------------------------------------------------------- */

    /// @notice FRAX tokenIn address
    ERC20 public immutable FRAX = ERC20(0x853d955aCEf822Db058eb8505911ED77F175b99e);

    /// @notice DAI tokenIn address
    ERC20 public immutable DAI = ERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F);

    /// @notice Error related to amount
    string constant AMOUNT_ERROR = "!AMOUNT";

    /// @notice Error related to token address
    string constant TOKEN_IN_ERROR = "!TOKEN_IN";

    /* ---------------------------------------------------------------------- */
    /*                              MUTABLE STATE                             */
    /* ---------------------------------------------------------------------- */

    /// @notice Address that is recipient of raised funds + access control
    address public treasury = 0x226e7AF139a0F34c6771DeB252F9988876ac1Ced;

    /// @notice Returns the current merkle root being used
    bytes32 public merkleRoot;

    /// @notice Returns an array of all merkle roots used
    bytes32[] public roots;

    /// @notice Returns the current pCNV price in DAI/FRAX
    uint256 public rate;

    /// @notice Returns the total amount of pCNV that has cumulatively been minted
    uint256 public totalMinted;

    /// @notice Returns if pCNV are redeemable for CNV
    // bool public redeemable;

    /// @notice Returns whether transfers are paused
    bool public transfersPaused;

    /* ---------------------------------------------------------------------- */
    /*                              STRUCTURED STATE                          */
    /* ---------------------------------------------------------------------- */

    /// @notice Structure of Participant vesting storage
    struct Participant {
        uint256 purchased; // amount (in total) of pCNV that user has purchased
        uint256 redeemed;  // amount (in total) of pCNV that user has redeemed
    }

    /// @notice             maps an account to vesting storage
    /// address             - account to check
    /// returns Participant - Structured vesting storage
    mapping(address => Participant) public participants;

    /// @notice             amount of DAI/FRAX user has spent for a specific root
    /// bytes32             - merkle root
    /// address             - account to check
    /// returns uint256     - amount in DAI/FRAX (denominated in ether) spent purchasing pCNV
    mapping(bytes32 => mapping(address => uint256)) public spentAmounts;

    /* ---------------------------------------------------------------------- */
    /*                                  EVENTS                                */
    /* ---------------------------------------------------------------------- */

    /// @notice Emitted when treasury changes treasury address
    /// @param  treasury address of new treasury
    event TreasurySet(address treasury);

    /// @notice             Emitted when a new round is set by treasury
    /// @param  merkleRoot  new merkle root
    /// @param  rate        new price of pCNV in DAI/FRAX
    event NewRound(bytes32 merkleRoot, uint256 rate);

    /// @notice             Emitted when maxSupply of pCNV is burned or minted to target
    /// @param  target      target to which to mint pCNV or burn if target = address(0)
    /// @param  amount      amount of pCNV minted to target or burned
    /// @param  totalMinted amount of pCNV minted to target or burned
    event Managed(address target, uint256 amount, uint256 totalMinted);

    /// @notice                 Emitted when pCNV minted via "mint()" or "mintWithPermit"
    /// @param  depositedFrom   address from which DAI/FRAX was deposited
    /// @param  mintedTo        address to which pCNV were minted to
    /// @param  amount          amount of pCNV minted
    /// @param  deposited       amount of DAI/FRAX deposited
    /// @param  totalMinted     total amount of pCNV minted so far
    event Minted(
        address indexed depositedFrom,
        address indexed mintedTo,
        uint256 amount,
        uint256 deposited,
        uint256 totalMinted
    );

    /* ---------------------------------------------------------------------- */
    /*                                MODIFIERS                               */
    /* ---------------------------------------------------------------------- */

    /// @notice only allows Concave treasury
    modifier onlyConcave() {
        require(msg.sender == treasury, "!CONCAVE");
        _;
    }

    /* ---------------------------------------------------------------------- */
    /*                              ONLY CONCAVE                              */
    /* ---------------------------------------------------------------------- */

    /// @notice Set a new treasury address if treasury
    function setTreasury(
        address _treasury
    ) external onlyConcave {
        treasury = _treasury;

        emit TreasurySet(_treasury);
    }

    /// @notice             Update merkle root and rate
    /// @param _merkleRoot  root of merkle tree
    /// @param _rate        price of pCNV in DAI/FRAX
    function setRound(
        bytes32 _merkleRoot,
        uint256 _rate
    ) external onlyConcave {
        // push new root to array of all roots - for viewing
        roots.push(_merkleRoot);
        // update merkle root
        merkleRoot = _merkleRoot;
        // update rate
        rate = _rate;

        emit NewRound(merkleRoot,rate);
    }

    /// @notice         Reduce an "amount" of available supply of pCNV or mint it to "target"
    /// @param target   address to which to mint; if address(0), will burn
    /// @param amount   to reduce from max supply or mint to "target"
    function manage(
        address target,
        uint256 amount
    ) external onlyConcave {

        totalMinted += amount;
        // mint target amount
        _mint(target, amount);

        emit Managed(target, amount, totalMinted);
    }

    /// @notice         Allows Concave to pause transfers in the event of a bug
    /// @param paused   if transfers should be paused or not
    function setTransfersPaused(bool paused) external onlyConcave {
        transfersPaused = paused;
    }

    /* ---------------------------------------------------------------------- */
    /*                              PUBLIC LOGIC                              */
    /* ---------------------------------------------------------------------- */

    /// @notice               mint pCNV by providing merkle proof and depositing DAI/FRAX
    /// @param to             whitelisted address pCNV will be minted to
    /// @param tokenIn        address of tokenIn user wishes to deposit (DAI/FRAX)
    /// @param maxAmount      max amount of DAI/FRAX sender can deposit for pCNV, to verify merkle proof
    /// @param amountIn       amount of DAI/FRAX sender wishes to deposit for pCNV
    /// @param proof          merkle proof to prove "to" and "maxAmount" are in merkle tree
    function mint(
        address to,
        address tokenIn,
        uint256 maxAmount,
        uint256 amountIn,
        bytes32[] calldata proof
    ) external returns (uint256 amountOut) {
        return _purchase(msg.sender, to, tokenIn, maxAmount, amountIn, proof);
    }

    /// @notice               mint pCNV by providing merkle proof and depositing DAI; uses EIP-2612 permit to save a transaction
    /// @param to             whitelisted address pCNV will be minted to
    /// @param tokenIn        address of tokenIn user wishes to deposit (DAI)
    /// @param maxAmount      max amount of DAI sender can deposit for pCNV, to verify merkle proof
    /// @param amountIn       amount of DAI sender wishes to deposit for pCNV
    /// @param proof          merkle proof to prove "to" and "maxAmount" are in merkle tree
    /// @param permitDeadline EIP-2612 : time when permit is no longer valid
    /// @param v              EIP-2612 : part of EIP-2612 signature
    /// @param r              EIP-2612 : part of EIP-2612 signature
    /// @param s              EIP-2612 : part of EIP-2612 signature
    function mintWithPermit(
        address to,
        address tokenIn,
        uint256 maxAmount,
        uint256 amountIn,
        bytes32[] calldata proof,
        uint256 permitDeadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountOut) {
        // Make sure payment tokenIn is DAI
        require(tokenIn == address(DAI), TOKEN_IN_ERROR);
        // Approve tokens for spender - https://eips.ethereum.org/EIPS/eip-2612
        ERC20(tokenIn).permit(msg.sender, address(this), amountIn, permitDeadline, v, r, s);
        // allow sender to mint for "to"
        return _purchase(msg.sender, to, tokenIn, maxAmount, amountIn, proof);
    }

    /// @notice         transfer "amount" of tokens from msg.sender to "to"
    /// @dev            calls "_beforeTransfer" to update vesting storage for "from" and "to"
    /// @param to       address tokens are being sent to
    /// @param amount   number of tokens being transfered
    function transfer(
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        require(!transfersPaused,"PAUSED");
        // default ERC20 transfer
        return super.transfer(to, amount);
    }

    /// @notice         transfer "amount" of tokens from "from" to "to"
    /// @dev            calls "_beforeTransfer" to update vesting storage for "from" and "to"
    /// @param from     address tokens are being transfered from
    /// @param to       address tokens are being sent to
    /// @param amount   number of tokens being transfered
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        require(!transfersPaused,"PAUSED");
        // default ERC20 transfer
        return super.transferFrom(from, to, amount);
    }

    /* ---------------------------------------------------------------------- */
    /*                             INTERNAL LOGIC                             */
    /* ---------------------------------------------------------------------- */

    /// @notice               Deposits FRAX/DAI for pCNV if merkle proof exists in specified round
    /// @param sender         address sending transaction
    /// @param to             whitelisted address purchased pCNV will be sent to
    /// @param tokenIn        address of tokenIn user wishes to deposit
    /// @param maxAmount      max amount of DAI/FRAX sender can deposit for pCNV
    /// @param amountIn       amount of DAI/FRAX sender wishes to deposit for pCNV
    /// @param proof          merkle proof to prove address and amount are in tree
    function _purchase(
        address sender,
        address to,
        address tokenIn,
        uint256 maxAmount,
        uint256 amountIn,
        bytes32[] calldata proof
    ) internal returns(uint256 amountOut) {
        // Make sure payment tokenIn is either DAI or FRAX
        require(tokenIn == address(DAI) || tokenIn == address(FRAX), TOKEN_IN_ERROR);

        // Require merkle proof with `to` and `maxAmount` to be successfully verified
        require(MerkleProof.verify(proof, merkleRoot, keccak256(abi.encodePacked(to, maxAmount))), "!PROOF");

        // Verify amount claimed by user does not surpass "maxAmount"
        uint256 newAmount = spentAmounts[merkleRoot][to] + amountIn; // save gas
        require(newAmount <= maxAmount, AMOUNT_ERROR);
        spentAmounts[merkleRoot][to] = newAmount;

        // Calculate rate of pCNV that should be returned for "amountIn"
        amountOut = amountIn * 1e18 / rate;

        // Interface storage for participant
        Participant storage participant = participants[to];

        // Increase participant.purchased to account for newly purchased tokens
        participant.purchased += amountOut;

        // Increase totalMinted to account for newly minted supply
        totalMinted += amountOut;

        // Transfer amountIn*ratio of tokenIn to treasury address
        ERC20(tokenIn).safeTransferFrom(sender, treasury, amountIn);

        // Mint tokens to address after pulling
        _mint(to, amountOut);

        emit Minted(sender, to, amountOut, amountIn, totalMinted);
    }


    /// @notice         Rescues accidentally sent tokens and ETH
    /// @param token    address of token to rescue, if address(0) rescue ETH
    function rescue(address token) external onlyConcave {
        if (token == address(0)) payable(treasury).transfer( address(this).balance );
        else ERC20(token).transfer(treasury, ERC20(token).balanceOf(address(this)));
    }
}

// © 2022 WTFPL – Do What the Fuck You Want to Public License.

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalMinted","type":"uint256"}],"name":"Managed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositedFrom","type":"address"},{"indexed":true,"internalType":"address","name":"mintedTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"deposited","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalMinted","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"}],"name":"NewRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"TreasurySet","type":"event"},{"inputs":[],"name":"DAI","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FRAX","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"manage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"permitDeadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mintWithPermit","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"participants","outputs":[{"internalType":"uint256","name":"purchased","type":"uint256"},{"internalType":"uint256","name":"redeemed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"roots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setTransfersPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"spentAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

61012060405273853d955acef822db058eb8505911ed77f175b99e73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1660601b815250736b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff166101009073ffffffffffffffffffffffffffffffffffffffff1660601b81525073226e7af139a0f34c6771deb252f9988876ac1ced600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000fc57600080fd5b506040518060400160405280601b81526020017f436f6e636176652050726573616c6520546f6b656e20284242542900000000008152506040518060400160405280600681526020017f626274434e560000000000000000000000000000000000000000000000000000815250601282600090805190602001906200018392919062000266565b5081600190805190602001906200019c92919062000266565b508060ff1660808160ff1660f81b815250504660a08181525050620001c6620001d660201b60201c565b60c0818152505050505062000517565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516200020a9190620003d4565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200024b959493929190620003ed565b60405160208183030381529060405280519060200120905090565b8280546200027490620004b2565b90600052602060002090601f016020900481019282620002985760008555620002e4565b82601f10620002b357805160ff1916838001178555620002e4565b82800160010185558215620002e4579182015b82811115620002e3578251825591602001919060010190620002c6565b5b509050620002f39190620002f7565b5090565b5b8082111562000312576000816000905550600101620002f8565b5090565b62000321816200046a565b82525050565b62000332816200047e565b82525050565b600081546200034781620004b2565b6200035381866200045f565b945060018216600081146200037157600181146200038357620003ba565b60ff19831686528186019350620003ba565b6200038e856200044a565b60005b83811015620003b25781548189015260018201915060208101905062000391565b838801955050505b50505092915050565b620003ce81620004a8565b82525050565b6000620003e2828462000338565b915081905092915050565b600060a08201905062000404600083018862000327565b62000413602083018762000327565b62000422604083018662000327565b620004316060830185620003c3565b62000440608083018462000316565b9695505050505050565b60008190508160005260206000209050919050565b600081905092915050565b6000620004778262000488565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006002820490506001821680620004cb57607f821691505b60208210811415620004e257620004e1620004e8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160f81c60a05160c05160e05160601c6101005160601c6131e26200057a60003960008181610f1701528181611467015261193e0152600081816110de015261199301526000610adb01526000610aa701526000610a8101526131e26000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806361d027b311610104578063a9059cbb116100a2578063d505accf11610071578063d505accf14610598578063dd62ed3e146105b4578063e0bab4c4146105e4578063f0f4426014610602576101da565b8063a9059cbb146104ea578063b0e4556f1461051a578063c2b40ae414610538578063c89380fd14610568576101da565b8063839006f2116100de578063839006f21461046257806395d89b411461047e57806396fb8b101461049c578063a2309ff8146104cc576101da565b806361d027b3146103e457806370a08231146104025780637ecebe0014610432576101da565b806323b872dd1161017c578063313ce5671161014b578063313ce5671461036e5780633644e5151461038c57806344e46dff146103aa5780634563f30a146103c6576101da565b806323b872dd146102e45780632c4e722e146103145780632eb4a7ab1461033257806330adf81f14610350576101da565b80630b0eee30116101b85780630b0eee301461025e5780630cf5e1561461027a578063103a34721461029657806318160ddd146102c6576101da565b806306fdde03146101df578063095ea7b3146101fd57806309e69ede1461022d575b600080fd5b6101e761061e565b6040516101f49190612ad8565b60405180910390f35b61021760048036038101906102129190612441565b6106ac565b6040516102249190612965565b60405180910390f35b6102476004803603810190610242919061215a565b61079e565b604051610255929190612bd5565b60405180910390f35b61027860048036038101906102739190612441565b6107c2565b005b610294600480360381019061028f919061251b565b6108b6565b005b6102b060048036038101906102ab91906124db565b6109be565b6040516102bd9190612bba565b60405180910390f35b6102ce6109e3565b6040516102db9190612bba565b60405180910390f35b6102fe60048036038101906102f991906121c7565b6109e9565b60405161030b9190612965565b60405180910390f35b61031c610a4f565b6040516103299190612bba565b60405180910390f35b61033a610a55565b6040516103479190612980565b60405180910390f35b610358610a5b565b6040516103659190612980565b60405180910390f35b610376610a7f565b6040516103839190612c35565b60405180910390f35b610394610aa3565b6040516103a19190612980565b60405180910390f35b6103c460048036038101906103bf9190612481565b610b00565b005b6103ce610bad565b6040516103db9190612965565b60405180910390f35b6103ec610bc0565b6040516103f9919061287b565b60405180910390f35b61041c6004803603810190610417919061215a565b610be6565b6040516104299190612bba565b60405180910390f35b61044c6004803603810190610447919061215a565b610bfe565b6040516104599190612bba565b60405180910390f35b61047c6004803603810190610477919061215a565b610c16565b005b610486610e85565b6040516104939190612ad8565b60405180910390f35b6104b660048036038101906104b191906122b4565b610f13565b6040516104c39190612bba565b60405180910390f35b6104d4611072565b6040516104e19190612bba565b60405180910390f35b61050460048036038101906104ff9190612441565b611078565b6040516105119190612965565b60405180910390f35b6105226110dc565b60405161052f9190612abd565b60405180910390f35b610552600480360381019061054d919061255b565b611100565b60405161055f9190612980565b60405180910390f35b610582600480360381019061057d919061221a565b611124565b60405161058f9190612bba565b60405180910390f35b6105b260048036038101906105ad919061239f565b611141565b005b6105ce60048036038101906105c99190612187565b611440565b6040516105db9190612bba565b60405180910390f35b6105ec611465565b6040516105f99190612abd565b60405180910390f35b61061c6004803603810190610617919061215a565b611489565b005b6000805461062b90612e74565b80601f016020809104026020016040519081016040528092919081815260200182805461065790612e74565b80156106a45780601f10610679576101008083540402835291602001916106a4565b820191906000526020600020905b81548152906001019060200180831161068757829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161078c9190612bba565b60405180910390a36001905092915050565b600c6020528060005260406000206000915090508060000154908060010154905082565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084990612b5a565b60405180910390fd5b80600a60008282546108649190612c97565b925050819055506108758282611594565b7fc5c33ab5e6467a87a001b77efc45aa27f6890b08565b99b7101becae3d82320e8282600a546040516108aa9392919061292e565b60405180910390a15050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093d90612b5a565b60405180910390fd5b600882908060018154018082558091505060019003906000526020600020016000909190919091505581600781905550806009819055507fc9714d3f318877e8200732d0c1e80981c397cbde2518a4b32c68d9ba1eab3b506007546009546040516109b2929190612a4f565b60405180910390a15050565b600d602052816000526040600020602052806000526040600020600091509150505481565b60025481565b6000600b60009054906101000a900460ff1615610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290612afa565b60405180910390fd5b610a46848484611664565b90509392505050565b60095481565b60075481565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000004614610ad957610ad46118ae565b610afb565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8790612b5a565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b600b60009054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90612b5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d4957600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d43573d6000803e3d6000fd5b50610e82565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dc1919061287b565b60206040518083038186803b158015610dd957600080fd5b505afa158015610ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e119190612588565b6040518363ffffffff1660e01b8152600401610e2e929190612905565b602060405180830381600087803b158015610e4857600080fd5b505af1158015610e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8091906124ae565b505b50565b60018054610e9290612e74565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebe90612e74565b8015610f0b5780601f10610ee057610100808354040283529160200191610f0b565b820191906000526020600020905b815481529060010190602001808311610eee57829003601f168201915b505050505081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600981526020017f21544f4b454e5f494e000000000000000000000000000000000000000000000081525090610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd29190612ad8565b60405180910390fd5b508973ffffffffffffffffffffffffffffffffffffffff1663d505accf33308b898989896040518863ffffffff1660e01b81526004016110219796959493929190612896565b600060405180830381600087803b15801561103b57600080fd5b505af115801561104f573d6000803e3d6000fd5b50505050611062338c8c8c8c8c8c61193a565b90509a9950505050505050505050565b600a5481565b6000600b60009054906101000a900460ff16156110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c190612afa565b60405180910390fd5b6110d48383611dae565b905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6008818154811061111057600080fd5b906000526020600020016000915090505481565b60006111353388888888888861193a565b90509695505050505050565b42841015611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b90612b9a565b60405180910390fd5b600061118e610aa3565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9898989600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558a6040516020016112169695949392919061299b565b6040516020818303038152906040528051906020012060405160200161123d929190612844565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161127a9493929190612a78565b6020604051602081039080840390855afa15801561129c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561131057508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690612b7a565b60405180910390fd5b86600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258760405161142f9190612bba565b60405180910390a350505050505050565b6004602052816000526040600020602052806000526040600020600091509150505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151090612b5a565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f81604051611589919061287b565b60405180910390a150565b80600260008282546115a69190612c97565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116589190612bba565b60405180910390a35050565b600080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461179a5782816117199190612d78565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b82600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e99190612d78565b9250508190555082600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161189a9190612bba565b60405180910390a360019150509392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516118e0919061282d565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161191f9594939291906129fc565b60405160208183030381529060405280519060200120905090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614806119e157507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600981526020017f21544f4b454e5f494e000000000000000000000000000000000000000000000081525090611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f9190612ad8565b60405180910390fd5b50611acf838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506007548988604051602001611ab4929190612801565b60405160208183030381529060405280519060200120611ec2565b611b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0590612b1a565b60405180910390fd5b600084600d6000600754815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b6e9190612c97565b9050858111156040518060400160405280600781526020017f21414d4f554e540000000000000000000000000000000000000000000000000081525090611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be29190612ad8565b60405180910390fd5b5080600d6000600754815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600954670de0b6b3a764000086611c5a9190612d1e565b611c649190612ced565b91506000600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905082816000016000828254611cbd9190612c97565b9250508190555082600a6000828254611cd69190612c97565b92505081905550611d2c8a600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16888b73ffffffffffffffffffffffffffffffffffffffff16611ed9909392919063ffffffff16565b611d368984611594565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f68c721f9a38584842eb66945b43c95066397ce5f2576fcc0588471c85d209d0c8589600a54604051611d9993929190612bfe565b60405180910390a35050979650505050505050565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dff9190612d78565b9250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611eb09190612bba565b60405180910390a36001905092915050565b600082611ecf8584611f9c565b1490509392505050565b60006040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff8416602482015282604482015260008060648360008a5af1915050611f5681612011565b611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c90612b3a565b60405180910390fd5b5050505050565b60008082905060005b8451811015612006576000858281518110611fc357611fc2612fb4565b5b60200260200101519050808311611fe557611fde838261205a565b9250611ff2565b611fef818461205a565b92505b508080611ffe90612ea6565b915050611fa5565b508091505092915050565b60003d8261202357806000803e806000fd5b806020811461203d576000811461204e5760009250612053565b816000803e60005115159250612053565b600192505b5050919050565b600082600052816020526040600020905092915050565b60008135905061208081613139565b92915050565b60008083601f84011261209c5761209b612fe8565b5b8235905067ffffffffffffffff8111156120b9576120b8612fe3565b5b6020830191508360208202830111156120d5576120d4612fed565b5b9250929050565b6000813590506120eb81613150565b92915050565b60008151905061210081613150565b92915050565b60008135905061211581613167565b92915050565b60008135905061212a8161317e565b92915050565b60008151905061213f8161317e565b92915050565b60008135905061215481613195565b92915050565b6000602082840312156121705761216f612ff7565b5b600061217e84828501612071565b91505092915050565b6000806040838503121561219e5761219d612ff7565b5b60006121ac85828601612071565b92505060206121bd85828601612071565b9150509250929050565b6000806000606084860312156121e0576121df612ff7565b5b60006121ee86828701612071565b93505060206121ff86828701612071565b92505060406122108682870161211b565b9150509250925092565b60008060008060008060a0878903121561223757612236612ff7565b5b600061224589828a01612071565b965050602061225689828a01612071565b955050604061226789828a0161211b565b945050606061227889828a0161211b565b935050608087013567ffffffffffffffff81111561229957612298612ff2565b5b6122a589828a01612086565b92509250509295509295509295565b6000806000806000806000806000806101208b8d0312156122d8576122d7612ff7565b5b60006122e68d828e01612071565b9a505060206122f78d828e01612071565b99505060406123088d828e0161211b565b98505060606123198d828e0161211b565b97505060808b013567ffffffffffffffff81111561233a57612339612ff2565b5b6123468d828e01612086565b965096505060a06123598d828e0161211b565b94505060c061236a8d828e01612145565b93505060e061237b8d828e01612106565b92505061010061238d8d828e01612106565b9150509295989b9194979a5092959850565b600080600080600080600060e0888a0312156123be576123bd612ff7565b5b60006123cc8a828b01612071565b97505060206123dd8a828b01612071565b96505060406123ee8a828b0161211b565b95505060606123ff8a828b0161211b565b94505060806124108a828b01612145565b93505060a06124218a828b01612106565b92505060c06124328a828b01612106565b91505092959891949750929550565b6000806040838503121561245857612457612ff7565b5b600061246685828601612071565b92505060206124778582860161211b565b9150509250929050565b60006020828403121561249757612496612ff7565b5b60006124a5848285016120dc565b91505092915050565b6000602082840312156124c4576124c3612ff7565b5b60006124d2848285016120f1565b91505092915050565b600080604083850312156124f2576124f1612ff7565b5b600061250085828601612106565b925050602061251185828601612071565b9150509250929050565b6000806040838503121561253257612531612ff7565b5b600061254085828601612106565b92505060206125518582860161211b565b9150509250929050565b60006020828403121561257157612570612ff7565b5b600061257f8482850161211b565b91505092915050565b60006020828403121561259e5761259d612ff7565b5b60006125ac84828501612130565b91505092915050565b6125be81612dac565b82525050565b6125d56125d082612dac565b612eef565b82525050565b6125e481612dbe565b82525050565b6125f381612dca565b82525050565b61260a61260582612dca565b612f01565b82525050565b6000815461261d81612e74565b6126278186612c70565b94506001821660008114612642576001811461265357612686565b60ff19831686528186019350612686565b61265c85612c50565b60005b8381101561267e5781548189015260018201915060208101905061265f565b838801955050505b50505092915050565b61269881612e0b565b82525050565b60006126a982612c65565b6126b38185612c7b565b93506126c3818560208601612e41565b6126cc81612ffc565b840191505092915050565b60006126e4600683612c7b565b91506126ef8261301a565b602082019050919050565b6000612707600283612c8c565b915061271282613043565b600282019050919050565b600061272a600683612c7b565b91506127358261306c565b602082019050919050565b600061274d601483612c7b565b915061275882613095565b602082019050919050565b6000612770600883612c7b565b915061277b826130be565b602082019050919050565b6000612793600e83612c7b565b915061279e826130e7565b602082019050919050565b60006127b6601783612c7b565b91506127c182613110565b602082019050919050565b6127d581612df4565b82525050565b6127ec6127e782612df4565b612f1d565b82525050565b6127fb81612dfe565b82525050565b600061280d82856125c4565b60148201915061281d82846127db565b6020820191508190509392505050565b60006128398284612610565b915081905092915050565b600061284f826126fa565b915061285b82856125f9565b60208201915061286b82846125f9565b6020820191508190509392505050565b600060208201905061289060008301846125b5565b92915050565b600060e0820190506128ab600083018a6125b5565b6128b860208301896125b5565b6128c560408301886127cc565b6128d260608301876127cc565b6128df60808301866127f2565b6128ec60a08301856125ea565b6128f960c08301846125ea565b98975050505050505050565b600060408201905061291a60008301856125b5565b61292760208301846127cc565b9392505050565b600060608201905061294360008301866125b5565b61295060208301856127cc565b61295d60408301846127cc565b949350505050565b600060208201905061297a60008301846125db565b92915050565b600060208201905061299560008301846125ea565b92915050565b600060c0820190506129b060008301896125ea565b6129bd60208301886125b5565b6129ca60408301876125b5565b6129d760608301866127cc565b6129e460808301856127cc565b6129f160a08301846127cc565b979650505050505050565b600060a082019050612a1160008301886125ea565b612a1e60208301876125ea565b612a2b60408301866125ea565b612a3860608301856127cc565b612a4560808301846125b5565b9695505050505050565b6000604082019050612a6460008301856125ea565b612a7160208301846127cc565b9392505050565b6000608082019050612a8d60008301876125ea565b612a9a60208301866127f2565b612aa760408301856125ea565b612ab460608301846125ea565b95945050505050565b6000602082019050612ad2600083018461268f565b92915050565b60006020820190508181036000830152612af2818461269e565b905092915050565b60006020820190508181036000830152612b13816126d7565b9050919050565b60006020820190508181036000830152612b338161271d565b9050919050565b60006020820190508181036000830152612b5381612740565b9050919050565b60006020820190508181036000830152612b7381612763565b9050919050565b60006020820190508181036000830152612b9381612786565b9050919050565b60006020820190508181036000830152612bb3816127a9565b9050919050565b6000602082019050612bcf60008301846127cc565b92915050565b6000604082019050612bea60008301856127cc565b612bf760208301846127cc565b9392505050565b6000606082019050612c1360008301866127cc565b612c2060208301856127cc565b612c2d60408301846127cc565b949350505050565b6000602082019050612c4a60008301846127f2565b92915050565b60008190508160005260206000209050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612ca282612df4565b9150612cad83612df4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ce257612ce1612f27565b5b828201905092915050565b6000612cf882612df4565b9150612d0383612df4565b925082612d1357612d12612f56565b5b828204905092915050565b6000612d2982612df4565b9150612d3483612df4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d6d57612d6c612f27565b5b828202905092915050565b6000612d8382612df4565b9150612d8e83612df4565b925082821015612da157612da0612f27565b5b828203905092915050565b6000612db782612dd4565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612e1682612e1d565b9050919050565b6000612e2882612e2f565b9050919050565b6000612e3a82612dd4565b9050919050565b60005b83811015612e5f578082015181840152602081019050612e44565b83811115612e6e576000848401525b50505050565b60006002820490506001821680612e8c57607f821691505b60208210811415612ea057612e9f612f85565b5b50919050565b6000612eb182612df4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ee457612ee3612f27565b5b600182019050919050565b6000612efa82612f0b565b9050919050565b6000819050919050565b6000612f168261300d565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5041555345440000000000000000000000000000000000000000000000000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f2150524f4f460000000000000000000000000000000000000000000000000000600082015250565b7f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000600082015250565b7f21434f4e43415645000000000000000000000000000000000000000000000000600082015250565b7f494e56414c49445f5349474e4552000000000000000000000000000000000000600082015250565b7f5045524d49545f444541444c494e455f45585049524544000000000000000000600082015250565b61314281612dac565b811461314d57600080fd5b50565b61315981612dbe565b811461316457600080fd5b50565b61317081612dca565b811461317b57600080fd5b50565b61318781612df4565b811461319257600080fd5b50565b61319e81612dfe565b81146131a957600080fd5b5056fea26469706673582212206dcdb126719391a14240e2923bde42df1d48e65eb8f3e10507f95d12755dc64c64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806361d027b311610104578063a9059cbb116100a2578063d505accf11610071578063d505accf14610598578063dd62ed3e146105b4578063e0bab4c4146105e4578063f0f4426014610602576101da565b8063a9059cbb146104ea578063b0e4556f1461051a578063c2b40ae414610538578063c89380fd14610568576101da565b8063839006f2116100de578063839006f21461046257806395d89b411461047e57806396fb8b101461049c578063a2309ff8146104cc576101da565b806361d027b3146103e457806370a08231146104025780637ecebe0014610432576101da565b806323b872dd1161017c578063313ce5671161014b578063313ce5671461036e5780633644e5151461038c57806344e46dff146103aa5780634563f30a146103c6576101da565b806323b872dd146102e45780632c4e722e146103145780632eb4a7ab1461033257806330adf81f14610350576101da565b80630b0eee30116101b85780630b0eee301461025e5780630cf5e1561461027a578063103a34721461029657806318160ddd146102c6576101da565b806306fdde03146101df578063095ea7b3146101fd57806309e69ede1461022d575b600080fd5b6101e761061e565b6040516101f49190612ad8565b60405180910390f35b61021760048036038101906102129190612441565b6106ac565b6040516102249190612965565b60405180910390f35b6102476004803603810190610242919061215a565b61079e565b604051610255929190612bd5565b60405180910390f35b61027860048036038101906102739190612441565b6107c2565b005b610294600480360381019061028f919061251b565b6108b6565b005b6102b060048036038101906102ab91906124db565b6109be565b6040516102bd9190612bba565b60405180910390f35b6102ce6109e3565b6040516102db9190612bba565b60405180910390f35b6102fe60048036038101906102f991906121c7565b6109e9565b60405161030b9190612965565b60405180910390f35b61031c610a4f565b6040516103299190612bba565b60405180910390f35b61033a610a55565b6040516103479190612980565b60405180910390f35b610358610a5b565b6040516103659190612980565b60405180910390f35b610376610a7f565b6040516103839190612c35565b60405180910390f35b610394610aa3565b6040516103a19190612980565b60405180910390f35b6103c460048036038101906103bf9190612481565b610b00565b005b6103ce610bad565b6040516103db9190612965565b60405180910390f35b6103ec610bc0565b6040516103f9919061287b565b60405180910390f35b61041c6004803603810190610417919061215a565b610be6565b6040516104299190612bba565b60405180910390f35b61044c6004803603810190610447919061215a565b610bfe565b6040516104599190612bba565b60405180910390f35b61047c6004803603810190610477919061215a565b610c16565b005b610486610e85565b6040516104939190612ad8565b60405180910390f35b6104b660048036038101906104b191906122b4565b610f13565b6040516104c39190612bba565b60405180910390f35b6104d4611072565b6040516104e19190612bba565b60405180910390f35b61050460048036038101906104ff9190612441565b611078565b6040516105119190612965565b60405180910390f35b6105226110dc565b60405161052f9190612abd565b60405180910390f35b610552600480360381019061054d919061255b565b611100565b60405161055f9190612980565b60405180910390f35b610582600480360381019061057d919061221a565b611124565b60405161058f9190612bba565b60405180910390f35b6105b260048036038101906105ad919061239f565b611141565b005b6105ce60048036038101906105c99190612187565b611440565b6040516105db9190612bba565b60405180910390f35b6105ec611465565b6040516105f99190612abd565b60405180910390f35b61061c6004803603810190610617919061215a565b611489565b005b6000805461062b90612e74565b80601f016020809104026020016040519081016040528092919081815260200182805461065790612e74565b80156106a45780601f10610679576101008083540402835291602001916106a4565b820191906000526020600020905b81548152906001019060200180831161068757829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161078c9190612bba565b60405180910390a36001905092915050565b600c6020528060005260406000206000915090508060000154908060010154905082565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084990612b5a565b60405180910390fd5b80600a60008282546108649190612c97565b925050819055506108758282611594565b7fc5c33ab5e6467a87a001b77efc45aa27f6890b08565b99b7101becae3d82320e8282600a546040516108aa9392919061292e565b60405180910390a15050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093d90612b5a565b60405180910390fd5b600882908060018154018082558091505060019003906000526020600020016000909190919091505581600781905550806009819055507fc9714d3f318877e8200732d0c1e80981c397cbde2518a4b32c68d9ba1eab3b506007546009546040516109b2929190612a4f565b60405180910390a15050565b600d602052816000526040600020602052806000526040600020600091509150505481565b60025481565b6000600b60009054906101000a900460ff1615610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290612afa565b60405180910390fd5b610a46848484611664565b90509392505050565b60095481565b60075481565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b7f000000000000000000000000000000000000000000000000000000000000001281565b60007f00000000000000000000000000000000000000000000000000000000000000014614610ad957610ad46118ae565b610afb565b7fcb81026912554fbc7fae772c56a86d9c6d281c43ba476b2fc42f89348cba7f515b905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8790612b5a565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b600b60009054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90612b5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d4957600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d43573d6000803e3d6000fd5b50610e82565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dc1919061287b565b60206040518083038186803b158015610dd957600080fd5b505afa158015610ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e119190612588565b6040518363ffffffff1660e01b8152600401610e2e929190612905565b602060405180830381600087803b158015610e4857600080fd5b505af1158015610e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8091906124ae565b505b50565b60018054610e9290612e74565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebe90612e74565b8015610f0b5780601f10610ee057610100808354040283529160200191610f0b565b820191906000526020600020905b815481529060010190602001808311610eee57829003601f168201915b505050505081565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600981526020017f21544f4b454e5f494e000000000000000000000000000000000000000000000081525090610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd29190612ad8565b60405180910390fd5b508973ffffffffffffffffffffffffffffffffffffffff1663d505accf33308b898989896040518863ffffffff1660e01b81526004016110219796959493929190612896565b600060405180830381600087803b15801561103b57600080fd5b505af115801561104f573d6000803e3d6000fd5b50505050611062338c8c8c8c8c8c61193a565b90509a9950505050505050505050565b600a5481565b6000600b60009054906101000a900460ff16156110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c190612afa565b60405180910390fd5b6110d48383611dae565b905092915050565b7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e81565b6008818154811061111057600080fd5b906000526020600020016000915090505481565b60006111353388888888888861193a565b90509695505050505050565b42841015611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b90612b9a565b60405180910390fd5b600061118e610aa3565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9898989600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558a6040516020016112169695949392919061299b565b6040516020818303038152906040528051906020012060405160200161123d929190612844565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161127a9493929190612a78565b6020604051602081039080840390855afa15801561129c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561131057508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690612b7a565b60405180910390fd5b86600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258760405161142f9190612bba565b60405180910390a350505050505050565b6004602052816000526040600020602052806000526040600020600091509150505481565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151090612b5a565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f81604051611589919061287b565b60405180910390a150565b80600260008282546115a69190612c97565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116589190612bba565b60405180910390a35050565b600080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461179a5782816117199190612d78565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b82600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e99190612d78565b9250508190555082600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161189a9190612bba565b60405180910390a360019150509392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516118e0919061282d565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161191f9594939291906129fc565b60405160208183030381529060405280519060200120905090565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614806119e157507f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600981526020017f21544f4b454e5f494e000000000000000000000000000000000000000000000081525090611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f9190612ad8565b60405180910390fd5b50611acf838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506007548988604051602001611ab4929190612801565b60405160208183030381529060405280519060200120611ec2565b611b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0590612b1a565b60405180910390fd5b600084600d6000600754815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b6e9190612c97565b9050858111156040518060400160405280600781526020017f21414d4f554e540000000000000000000000000000000000000000000000000081525090611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be29190612ad8565b60405180910390fd5b5080600d6000600754815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600954670de0b6b3a764000086611c5a9190612d1e565b611c649190612ced565b91506000600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905082816000016000828254611cbd9190612c97565b9250508190555082600a6000828254611cd69190612c97565b92505081905550611d2c8a600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16888b73ffffffffffffffffffffffffffffffffffffffff16611ed9909392919063ffffffff16565b611d368984611594565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f68c721f9a38584842eb66945b43c95066397ce5f2576fcc0588471c85d209d0c8589600a54604051611d9993929190612bfe565b60405180910390a35050979650505050505050565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dff9190612d78565b9250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611eb09190612bba565b60405180910390a36001905092915050565b600082611ecf8584611f9c565b1490509392505050565b60006040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff8416602482015282604482015260008060648360008a5af1915050611f5681612011565b611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c90612b3a565b60405180910390fd5b5050505050565b60008082905060005b8451811015612006576000858281518110611fc357611fc2612fb4565b5b60200260200101519050808311611fe557611fde838261205a565b9250611ff2565b611fef818461205a565b92505b508080611ffe90612ea6565b915050611fa5565b508091505092915050565b60003d8261202357806000803e806000fd5b806020811461203d576000811461204e5760009250612053565b816000803e60005115159250612053565b600192505b5050919050565b600082600052816020526040600020905092915050565b60008135905061208081613139565b92915050565b60008083601f84011261209c5761209b612fe8565b5b8235905067ffffffffffffffff8111156120b9576120b8612fe3565b5b6020830191508360208202830111156120d5576120d4612fed565b5b9250929050565b6000813590506120eb81613150565b92915050565b60008151905061210081613150565b92915050565b60008135905061211581613167565b92915050565b60008135905061212a8161317e565b92915050565b60008151905061213f8161317e565b92915050565b60008135905061215481613195565b92915050565b6000602082840312156121705761216f612ff7565b5b600061217e84828501612071565b91505092915050565b6000806040838503121561219e5761219d612ff7565b5b60006121ac85828601612071565b92505060206121bd85828601612071565b9150509250929050565b6000806000606084860312156121e0576121df612ff7565b5b60006121ee86828701612071565b93505060206121ff86828701612071565b92505060406122108682870161211b565b9150509250925092565b60008060008060008060a0878903121561223757612236612ff7565b5b600061224589828a01612071565b965050602061225689828a01612071565b955050604061226789828a0161211b565b945050606061227889828a0161211b565b935050608087013567ffffffffffffffff81111561229957612298612ff2565b5b6122a589828a01612086565b92509250509295509295509295565b6000806000806000806000806000806101208b8d0312156122d8576122d7612ff7565b5b60006122e68d828e01612071565b9a505060206122f78d828e01612071565b99505060406123088d828e0161211b565b98505060606123198d828e0161211b565b97505060808b013567ffffffffffffffff81111561233a57612339612ff2565b5b6123468d828e01612086565b965096505060a06123598d828e0161211b565b94505060c061236a8d828e01612145565b93505060e061237b8d828e01612106565b92505061010061238d8d828e01612106565b9150509295989b9194979a5092959850565b600080600080600080600060e0888a0312156123be576123bd612ff7565b5b60006123cc8a828b01612071565b97505060206123dd8a828b01612071565b96505060406123ee8a828b0161211b565b95505060606123ff8a828b0161211b565b94505060806124108a828b01612145565b93505060a06124218a828b01612106565b92505060c06124328a828b01612106565b91505092959891949750929550565b6000806040838503121561245857612457612ff7565b5b600061246685828601612071565b92505060206124778582860161211b565b9150509250929050565b60006020828403121561249757612496612ff7565b5b60006124a5848285016120dc565b91505092915050565b6000602082840312156124c4576124c3612ff7565b5b60006124d2848285016120f1565b91505092915050565b600080604083850312156124f2576124f1612ff7565b5b600061250085828601612106565b925050602061251185828601612071565b9150509250929050565b6000806040838503121561253257612531612ff7565b5b600061254085828601612106565b92505060206125518582860161211b565b9150509250929050565b60006020828403121561257157612570612ff7565b5b600061257f8482850161211b565b91505092915050565b60006020828403121561259e5761259d612ff7565b5b60006125ac84828501612130565b91505092915050565b6125be81612dac565b82525050565b6125d56125d082612dac565b612eef565b82525050565b6125e481612dbe565b82525050565b6125f381612dca565b82525050565b61260a61260582612dca565b612f01565b82525050565b6000815461261d81612e74565b6126278186612c70565b94506001821660008114612642576001811461265357612686565b60ff19831686528186019350612686565b61265c85612c50565b60005b8381101561267e5781548189015260018201915060208101905061265f565b838801955050505b50505092915050565b61269881612e0b565b82525050565b60006126a982612c65565b6126b38185612c7b565b93506126c3818560208601612e41565b6126cc81612ffc565b840191505092915050565b60006126e4600683612c7b565b91506126ef8261301a565b602082019050919050565b6000612707600283612c8c565b915061271282613043565b600282019050919050565b600061272a600683612c7b565b91506127358261306c565b602082019050919050565b600061274d601483612c7b565b915061275882613095565b602082019050919050565b6000612770600883612c7b565b915061277b826130be565b602082019050919050565b6000612793600e83612c7b565b915061279e826130e7565b602082019050919050565b60006127b6601783612c7b565b91506127c182613110565b602082019050919050565b6127d581612df4565b82525050565b6127ec6127e782612df4565b612f1d565b82525050565b6127fb81612dfe565b82525050565b600061280d82856125c4565b60148201915061281d82846127db565b6020820191508190509392505050565b60006128398284612610565b915081905092915050565b600061284f826126fa565b915061285b82856125f9565b60208201915061286b82846125f9565b6020820191508190509392505050565b600060208201905061289060008301846125b5565b92915050565b600060e0820190506128ab600083018a6125b5565b6128b860208301896125b5565b6128c560408301886127cc565b6128d260608301876127cc565b6128df60808301866127f2565b6128ec60a08301856125ea565b6128f960c08301846125ea565b98975050505050505050565b600060408201905061291a60008301856125b5565b61292760208301846127cc565b9392505050565b600060608201905061294360008301866125b5565b61295060208301856127cc565b61295d60408301846127cc565b949350505050565b600060208201905061297a60008301846125db565b92915050565b600060208201905061299560008301846125ea565b92915050565b600060c0820190506129b060008301896125ea565b6129bd60208301886125b5565b6129ca60408301876125b5565b6129d760608301866127cc565b6129e460808301856127cc565b6129f160a08301846127cc565b979650505050505050565b600060a082019050612a1160008301886125ea565b612a1e60208301876125ea565b612a2b60408301866125ea565b612a3860608301856127cc565b612a4560808301846125b5565b9695505050505050565b6000604082019050612a6460008301856125ea565b612a7160208301846127cc565b9392505050565b6000608082019050612a8d60008301876125ea565b612a9a60208301866127f2565b612aa760408301856125ea565b612ab460608301846125ea565b95945050505050565b6000602082019050612ad2600083018461268f565b92915050565b60006020820190508181036000830152612af2818461269e565b905092915050565b60006020820190508181036000830152612b13816126d7565b9050919050565b60006020820190508181036000830152612b338161271d565b9050919050565b60006020820190508181036000830152612b5381612740565b9050919050565b60006020820190508181036000830152612b7381612763565b9050919050565b60006020820190508181036000830152612b9381612786565b9050919050565b60006020820190508181036000830152612bb3816127a9565b9050919050565b6000602082019050612bcf60008301846127cc565b92915050565b6000604082019050612bea60008301856127cc565b612bf760208301846127cc565b9392505050565b6000606082019050612c1360008301866127cc565b612c2060208301856127cc565b612c2d60408301846127cc565b949350505050565b6000602082019050612c4a60008301846127f2565b92915050565b60008190508160005260206000209050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612ca282612df4565b9150612cad83612df4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ce257612ce1612f27565b5b828201905092915050565b6000612cf882612df4565b9150612d0383612df4565b925082612d1357612d12612f56565b5b828204905092915050565b6000612d2982612df4565b9150612d3483612df4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d6d57612d6c612f27565b5b828202905092915050565b6000612d8382612df4565b9150612d8e83612df4565b925082821015612da157612da0612f27565b5b828203905092915050565b6000612db782612dd4565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612e1682612e1d565b9050919050565b6000612e2882612e2f565b9050919050565b6000612e3a82612dd4565b9050919050565b60005b83811015612e5f578082015181840152602081019050612e44565b83811115612e6e576000848401525b50505050565b60006002820490506001821680612e8c57607f821691505b60208210811415612ea057612e9f612f85565b5b50919050565b6000612eb182612df4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ee457612ee3612f27565b5b600182019050919050565b6000612efa82612f0b565b9050919050565b6000819050919050565b6000612f168261300d565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5041555345440000000000000000000000000000000000000000000000000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f2150524f4f460000000000000000000000000000000000000000000000000000600082015250565b7f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000600082015250565b7f21434f4e43415645000000000000000000000000000000000000000000000000600082015250565b7f494e56414c49445f5349474e4552000000000000000000000000000000000000600082015250565b7f5045524d49545f444541444c494e455f45585049524544000000000000000000600082015250565b61314281612dac565b811461314d57600080fd5b50565b61315981612dbe565b811461316457600080fd5b50565b61317081612dca565b811461317b57600080fd5b50565b61318781612df4565b811461319257600080fd5b50565b61319e81612dfe565b81146131a957600080fd5b5056fea26469706673582212206dcdb126719391a14240e2923bde42df1d48e65eb8f3e10507f95d12755dc64c64736f6c63430008070033

Deployed Bytecode Sourcemap

14970:13502:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1044:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2680:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17670:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;21356:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20746:360;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17999:67;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1328:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25388:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16671:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16487:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1679:146;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1100:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5138:179;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21760:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16962:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16350:68;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1363:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1946:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28236:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1071:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23785:705;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16783:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24787:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15623:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16580:22;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22653:283;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4107:1023;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1416:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15748:78;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20421:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1044:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2680:217::-;2754:4;2804:6;2771:9;:21;2781:10;2771:21;;;;;;;;;;;;;;;:30;2793:7;2771:30;;;;;;;;;;;;;;;:39;;;;2849:7;2828:37;;2837:10;2828:37;;;2858:6;2828:37;;;;;;:::i;:::-;;;;;;;;2885:4;2878:11;;2680:217;;;;:::o;17670:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21356:253::-;20068:8;;;;;;;;;;;20054:22;;:10;:22;;;20046:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;21478:6:::1;21463:11;;:21;;;;;;;:::i;:::-;;;;;;;;21526;21532:6;21540;21526:5;:21::i;:::-;21565:36;21573:6;21581;21589:11;;21565:36;;;;;;;;:::i;:::-;;;;;;;;21356:253:::0;;:::o;20746:360::-;20068:8;;;;;;;;;;;20054:22;;:10;:22;;;20046:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;20919:5:::1;20930:11;20919:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20997:11;20984:10;:24;;;;21050:5;21043:4;:12;;;;21073:25;21082:10;;21093:4;;21073:25;;;;;;;:::i;:::-;;;;;;;;20746:360:::0;;:::o;17999:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1328:26::-;;;;:::o;25388:279::-;25519:4;25545:15;;;;;;;;;;;25544:16;25536:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;25623:36;25642:4;25648:2;25652:6;25623:18;:36::i;:::-;25616:43;;25388:279;;;;;:::o;16671:19::-;;;;:::o;16487:25::-;;;;:::o;1679:146::-;1730:95;1679:146;:::o;1100:31::-;;;:::o;5138:179::-;5195:7;5239:16;5222:13;:33;:87;;5285:24;:22;:24::i;:::-;5222:87;;;5258:24;5222:87;5215:94;;5138:179;:::o;21760:105::-;20068:8;;;;;;;;;;;20054:22;;:10;:22;;;20046:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;21851:6:::1;21833:15;;:24;;;;;;;;;;;;;;;;;;21760:105:::0;:::o;16962:27::-;;;;;;;;;;;;;:::o;16350:68::-;;;;;;;;;;;;;:::o;1363:44::-;;;;;;;;;;;;;;;;;:::o;1946:41::-;;;;;;;;;;;;;;;;;:::o;28236:233::-;20068:8;;;;;;;;;;;20054:22;;:10;:22;;;20046:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;28320:1:::1;28303:19;;:5;:19;;;28299:162;;;28332:8;;;;;;;;;;;28324:26;;:51;28352:21;28324:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;28299:162;;;28397:5;28391:21;;;28413:8;;;;;;;;;;;28429:5;28423:22;;;28454:4;28423:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28391:70;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28299:162;28236:233:::0;:::o;1071:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23785:705::-;24062:17;24164:3;24145:23;;:7;:23;;;24170:14;;;;;;;;;;;;;;;;;24137:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24283:7;24277:21;;;24299:10;24319:4;24326:8;24336:14;24352:1;24355;24358;24277:83;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24420:62;24430:10;24442:2;24446:7;24455:9;24466:8;24476:5;;24420:9;:62::i;:::-;24413:69;;23785:705;;;;;;;;;;;;:::o;16783:26::-;;;;:::o;24787:242::-;24891:4;24917:15;;;;;;;;;;;24916:16;24908:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;24995:26;25010:2;25014:6;24995:14;:26::i;:::-;24988:33;;24787:242;;;;:::o;15623:79::-;;;:::o;16580:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22653:283::-;22829:17;22866:62;22876:10;22888:2;22892:7;22901:9;22912:8;22922:5;;22866:9;:62::i;:::-;22859:69;;22653:283;;;;;;;;:::o;4107:1023::-;4335:15;4323:8;:27;;4315:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4548:14;4665:18;:16;:18::i;:::-;1730:95;4744:5;4751:7;4760:5;4767:6;:13;4774:5;4767:13;;;;;;;;;;;;;;;;:15;;;;;;;;;;;;4784:8;4716:77;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4706:88;;;;;;4593:220;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4565:263;;;;;;4548:280;;4845:24;4872:26;4882:6;4890:1;4893;4896;4872:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4845:53;;4951:1;4923:30;;:16;:30;;;;:59;;;;;4977:5;4957:25;;:16;:25;;;4923:59;4915:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;5057:5;5018:9;:27;5028:16;5018:27;;;;;;;;;;;;;;;:36;5046:7;5018:36;;;;;;;;;;;;;;;:44;;;;4523:551;;5107:7;5091:31;;5100:5;5091:31;;;5116:5;5091:31;;;;;;:::i;:::-;;;;;;;;4107:1023;;;;;;;:::o;1416:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15748:78::-;;;:::o;20421:156::-;20068:8;;;;;;;;;;;20054:22;;:10;:22;;;20046:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;20520:9:::1;20509:8;;:20;;;;;;;;;;;;;;;;;;20547:22;20559:9;20547:22;;;;;;:::i;:::-;;;;;;;;20421:156:::0;:::o;5982:335::-;6068:6;6053:11;;:21;;;;;;;:::i;:::-;;;;;;;;6242:6;6225:9;:13;6235:2;6225:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;6298:2;6277:32;;6294:1;6277:32;;;6302:6;6277:32;;;;;;:::i;:::-;;;;;;;;5982:335;;:::o;3298:612::-;3420:4;3437:15;3455:9;:15;3465:4;3455:15;;;;;;;;;;;;;;;:27;3471:10;3455:27;;;;;;;;;;;;;;;;3437:45;;3546:17;3535:7;:28;3531:80;;3605:6;3595:7;:16;;;;:::i;:::-;3565:9;:15;3575:4;3565:15;;;;;;;;;;;;;;;:27;3581:10;3565:27;;;;;;;;;;;;;;;:46;;;;3531:80;3643:6;3624:9;:15;3634:4;3624:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;3817:6;3800:9;:13;3810:2;3800:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;3867:2;3852:26;;3861:4;3852:26;;;3871:6;3852:26;;;;;;:::i;:::-;;;;;;;;3898:4;3891:11;;;3298:612;;;;;:::o;5325:457::-;5390:7;5491:95;5625:4;5609:22;;;;;;:::i;:::-;;;;;;;;5654:14;5691:13;5735:4;5458:301;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5430:344;;;;;;5410:364;;5325:457;:::o;26487:1595::-;26692:17;26809:3;26790:23;;:7;:23;;;:51;;;;26836:4;26817:24;;:7;:24;;;26790:51;26843:14;;;;;;;;;;;;;;;;;26782:76;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26966:81;26985:5;;26966:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26992:10;;27031:2;27035:9;27014:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27004:42;;;;;;26966:18;:81::i;:::-;26958:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;27142:17;27193:8;27162:12;:24;27175:10;;27162:24;;;;;;;;;;;:28;27187:2;27162:28;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;27142:59;;27245:9;27232;:22;;27256:12;;;;;;;;;;;;;;;;;27224:45;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27311:9;27280:12;:24;27293:10;;27280:24;;;;;;;;;;;:28;27305:2;27280:28;;;;;;;;;;;;;;;:40;;;;27437:4;;27430;27419:8;:15;;;;:::i;:::-;:22;;;;:::i;:::-;27407:34;;27500:31;27534:12;:16;27547:2;27534:16;;;;;;;;;;;;;;;27500:50;;27669:9;27644:11;:21;;;:34;;;;;;;:::i;:::-;;;;;;;;27774:9;27759:11;;:24;;;;;;;:::i;:::-;;;;;;;;27863:59;27895:6;27903:8;;;;;;;;;;;27913;27869:7;27863:31;;;;:59;;;;;;:::i;:::-;27984:20;27990:2;27994:9;27984:5;:20::i;:::-;28037:2;28022:52;;28029:6;28022:52;;;28041:9;28052:8;28062:11;;28022:52;;;;;;;;:::i;:::-;;;;;;;;26711:1371;;26487:1595;;;;;;;;;:::o;2905:385::-;2975:4;3017:6;2992:9;:21;3002:10;2992:21;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;3191:6;3174:9;:13;3184:2;3174:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;3247:2;3226:32;;3235:10;3226:32;;;3251:6;3226:32;;;;;;:::i;:::-;;;;;;;;3278:4;3271:11;;2905:385;;;;:::o;13262:190::-;13387:4;13440;13411:25;13424:5;13431:4;13411:12;:25::i;:::-;:33;13404:40;;13262:190;;;;;:::o;7863:1242::-;8007:15;8141:4;8135:11;8261:66;8242:17;8235:93;8423:42;8417:4;8413:53;8409:1;8390:17;8386:25;8379:88;8564:42;8560:2;8556:51;8551:2;8532:17;8528:26;8521:87;8695:6;8690:2;8671:17;8667:26;8660:42;8995:1;8992;8987:3;8968:17;8965:1;8958:5;8951;8946:51;8932:65;;8044:964;9028:44;9061:10;9028:32;:44::i;:::-;9020:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;7996:1109;7863:1242;;;;:::o;13814:675::-;13897:7;13917:20;13940:4;13917:27;;13960:9;13955:497;13979:5;:12;13975:1;:16;13955:497;;;14013:20;14036:5;14042:1;14036:8;;;;;;;;:::i;:::-;;;;;;;;14013:31;;14079:12;14063;:28;14059:382;;14206:42;14221:12;14235;14206:14;:42::i;:::-;14191:57;;14059:382;;;14383:42;14398:12;14412;14383:14;:42::i;:::-;14368:57;;14059:382;13998:454;13993:3;;;;;:::i;:::-;;;;13955:497;;;;14469:12;14462:19;;;13814:675;;;;:::o;11448:1072::-;11529:12;11654:16;11734:10;11724:244;;11843:14;11840:1;11837;11822:36;11938:14;11935:1;11928:25;11724:244;11991:14;12024:2;12019:248;;;;12286:1;12281:99;;;;12486:1;12475:12;;11984:518;;12019:248;12121:14;12118:1;12115;12100:36;12248:1;12242:8;12235:16;12228:24;12217:35;;12019:248;;12281:99;12364:1;12353:12;;11984:518;;11563:950;11448:1072;;;:::o;14497:224::-;14565:13;14628:1;14622:4;14615:15;14657:1;14651:4;14644:15;14698:4;14692;14682:21;14673:30;;14497:224;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;169:568::-;242:8;252:6;302:3;295:4;287:6;283:17;279:27;269:122;;310:79;;:::i;:::-;269:122;423:6;410:20;400:30;;453:18;445:6;442:30;439:117;;;475:79;;:::i;:::-;439:117;589:4;581:6;577:17;565:29;;643:3;635:4;627:6;623:17;613:8;609:32;606:41;603:128;;;650:79;;:::i;:::-;603:128;169:568;;;;;:::o;743:133::-;786:5;824:6;811:20;802:29;;840:30;864:5;840:30;:::i;:::-;743:133;;;;:::o;882:137::-;936:5;967:6;961:13;952:22;;983:30;1007:5;983:30;:::i;:::-;882:137;;;;:::o;1025:139::-;1071:5;1109:6;1096:20;1087:29;;1125:33;1152:5;1125:33;:::i;:::-;1025:139;;;;:::o;1170:::-;1216:5;1254:6;1241:20;1232:29;;1270:33;1297:5;1270:33;:::i;:::-;1170:139;;;;:::o;1315:143::-;1372:5;1403:6;1397:13;1388:22;;1419:33;1446:5;1419:33;:::i;:::-;1315:143;;;;:::o;1464:135::-;1508:5;1546:6;1533:20;1524:29;;1562:31;1587:5;1562:31;:::i;:::-;1464:135;;;;:::o;1605:329::-;1664:6;1713:2;1701:9;1692:7;1688:23;1684:32;1681:119;;;1719:79;;:::i;:::-;1681:119;1839:1;1864:53;1909:7;1900:6;1889:9;1885:22;1864:53;:::i;:::-;1854:63;;1810:117;1605:329;;;;:::o;1940:474::-;2008:6;2016;2065:2;2053:9;2044:7;2040:23;2036:32;2033:119;;;2071:79;;:::i;:::-;2033:119;2191:1;2216:53;2261:7;2252:6;2241:9;2237:22;2216:53;:::i;:::-;2206:63;;2162:117;2318:2;2344:53;2389:7;2380:6;2369:9;2365:22;2344:53;:::i;:::-;2334:63;;2289:118;1940:474;;;;;:::o;2420:619::-;2497:6;2505;2513;2562:2;2550:9;2541:7;2537:23;2533:32;2530:119;;;2568:79;;:::i;:::-;2530:119;2688:1;2713:53;2758:7;2749:6;2738:9;2734:22;2713:53;:::i;:::-;2703:63;;2659:117;2815:2;2841:53;2886:7;2877:6;2866:9;2862:22;2841:53;:::i;:::-;2831:63;;2786:118;2943:2;2969:53;3014:7;3005:6;2994:9;2990:22;2969:53;:::i;:::-;2959:63;;2914:118;2420:619;;;;;:::o;3045:1141::-;3167:6;3175;3183;3191;3199;3207;3256:3;3244:9;3235:7;3231:23;3227:33;3224:120;;;3263:79;;:::i;:::-;3224:120;3383:1;3408:53;3453:7;3444:6;3433:9;3429:22;3408:53;:::i;:::-;3398:63;;3354:117;3510:2;3536:53;3581:7;3572:6;3561:9;3557:22;3536:53;:::i;:::-;3526:63;;3481:118;3638:2;3664:53;3709:7;3700:6;3689:9;3685:22;3664:53;:::i;:::-;3654:63;;3609:118;3766:2;3792:53;3837:7;3828:6;3817:9;3813:22;3792:53;:::i;:::-;3782:63;;3737:118;3922:3;3911:9;3907:19;3894:33;3954:18;3946:6;3943:30;3940:117;;;3976:79;;:::i;:::-;3940:117;4089:80;4161:7;4152:6;4141:9;4137:22;4089:80;:::i;:::-;4071:98;;;;3865:314;3045:1141;;;;;;;;:::o;4192:1721::-;4348:6;4356;4364;4372;4380;4388;4396;4404;4412;4420;4469:3;4457:9;4448:7;4444:23;4440:33;4437:120;;;4476:79;;:::i;:::-;4437:120;4596:1;4621:53;4666:7;4657:6;4646:9;4642:22;4621:53;:::i;:::-;4611:63;;4567:117;4723:2;4749:53;4794:7;4785:6;4774:9;4770:22;4749:53;:::i;:::-;4739:63;;4694:118;4851:2;4877:53;4922:7;4913:6;4902:9;4898:22;4877:53;:::i;:::-;4867:63;;4822:118;4979:2;5005:53;5050:7;5041:6;5030:9;5026:22;5005:53;:::i;:::-;4995:63;;4950:118;5135:3;5124:9;5120:19;5107:33;5167:18;5159:6;5156:30;5153:117;;;5189:79;;:::i;:::-;5153:117;5302:80;5374:7;5365:6;5354:9;5350:22;5302:80;:::i;:::-;5284:98;;;;5078:314;5431:3;5458:53;5503:7;5494:6;5483:9;5479:22;5458:53;:::i;:::-;5448:63;;5402:119;5560:3;5587:51;5630:7;5621:6;5610:9;5606:22;5587:51;:::i;:::-;5577:61;;5531:117;5687:3;5714:53;5759:7;5750:6;5739:9;5735:22;5714:53;:::i;:::-;5704:63;;5658:119;5816:3;5843:53;5888:7;5879:6;5868:9;5864:22;5843:53;:::i;:::-;5833:63;;5787:119;4192:1721;;;;;;;;;;;;;:::o;5919:1199::-;6030:6;6038;6046;6054;6062;6070;6078;6127:3;6115:9;6106:7;6102:23;6098:33;6095:120;;;6134:79;;:::i;:::-;6095:120;6254:1;6279:53;6324:7;6315:6;6304:9;6300:22;6279:53;:::i;:::-;6269:63;;6225:117;6381:2;6407:53;6452:7;6443:6;6432:9;6428:22;6407:53;:::i;:::-;6397:63;;6352:118;6509:2;6535:53;6580:7;6571:6;6560:9;6556:22;6535:53;:::i;:::-;6525:63;;6480:118;6637:2;6663:53;6708:7;6699:6;6688:9;6684:22;6663:53;:::i;:::-;6653:63;;6608:118;6765:3;6792:51;6835:7;6826:6;6815:9;6811:22;6792:51;:::i;:::-;6782:61;;6736:117;6892:3;6919:53;6964:7;6955:6;6944:9;6940:22;6919:53;:::i;:::-;6909:63;;6863:119;7021:3;7048:53;7093:7;7084:6;7073:9;7069:22;7048:53;:::i;:::-;7038:63;;6992:119;5919:1199;;;;;;;;;;:::o;7124:474::-;7192:6;7200;7249:2;7237:9;7228:7;7224:23;7220:32;7217:119;;;7255:79;;:::i;:::-;7217:119;7375:1;7400:53;7445:7;7436:6;7425:9;7421:22;7400:53;:::i;:::-;7390:63;;7346:117;7502:2;7528:53;7573:7;7564:6;7553:9;7549:22;7528:53;:::i;:::-;7518:63;;7473:118;7124:474;;;;;:::o;7604:323::-;7660:6;7709:2;7697:9;7688:7;7684:23;7680:32;7677:119;;;7715:79;;:::i;:::-;7677:119;7835:1;7860:50;7902:7;7893:6;7882:9;7878:22;7860:50;:::i;:::-;7850:60;;7806:114;7604:323;;;;:::o;7933:345::-;8000:6;8049:2;8037:9;8028:7;8024:23;8020:32;8017:119;;;8055:79;;:::i;:::-;8017:119;8175:1;8200:61;8253:7;8244:6;8233:9;8229:22;8200:61;:::i;:::-;8190:71;;8146:125;7933:345;;;;:::o;8284:474::-;8352:6;8360;8409:2;8397:9;8388:7;8384:23;8380:32;8377:119;;;8415:79;;:::i;:::-;8377:119;8535:1;8560:53;8605:7;8596:6;8585:9;8581:22;8560:53;:::i;:::-;8550:63;;8506:117;8662:2;8688:53;8733:7;8724:6;8713:9;8709:22;8688:53;:::i;:::-;8678:63;;8633:118;8284:474;;;;;:::o;8764:::-;8832:6;8840;8889:2;8877:9;8868:7;8864:23;8860:32;8857:119;;;8895:79;;:::i;:::-;8857:119;9015:1;9040:53;9085:7;9076:6;9065:9;9061:22;9040:53;:::i;:::-;9030:63;;8986:117;9142:2;9168:53;9213:7;9204:6;9193:9;9189:22;9168:53;:::i;:::-;9158:63;;9113:118;8764:474;;;;;:::o;9244:329::-;9303:6;9352:2;9340:9;9331:7;9327:23;9323:32;9320:119;;;9358:79;;:::i;:::-;9320:119;9478:1;9503:53;9548:7;9539:6;9528:9;9524:22;9503:53;:::i;:::-;9493:63;;9449:117;9244:329;;;;:::o;9579:351::-;9649:6;9698:2;9686:9;9677:7;9673:23;9669:32;9666:119;;;9704:79;;:::i;:::-;9666:119;9824:1;9849:64;9905:7;9896:6;9885:9;9881:22;9849:64;:::i;:::-;9839:74;;9795:128;9579:351;;;;:::o;9936:118::-;10023:24;10041:5;10023:24;:::i;:::-;10018:3;10011:37;9936:118;;:::o;10060:157::-;10165:45;10185:24;10203:5;10185:24;:::i;:::-;10165:45;:::i;:::-;10160:3;10153:58;10060:157;;:::o;10223:109::-;10304:21;10319:5;10304:21;:::i;:::-;10299:3;10292:34;10223:109;;:::o;10338:118::-;10425:24;10443:5;10425:24;:::i;:::-;10420:3;10413:37;10338:118;;:::o;10462:157::-;10567:45;10587:24;10605:5;10587:24;:::i;:::-;10567:45;:::i;:::-;10562:3;10555:58;10462:157;;:::o;10647:849::-;10752:3;10789:5;10783:12;10818:36;10844:9;10818:36;:::i;:::-;10870:88;10951:6;10946:3;10870:88;:::i;:::-;10863:95;;10989:1;10978:9;10974:17;11005:1;11000:137;;;;11151:1;11146:344;;;;10967:523;;11000:137;11084:4;11080:9;11069;11065:25;11060:3;11053:38;11120:6;11115:3;11111:16;11104:23;;11000:137;;11146:344;11213:41;11248:5;11213:41;:::i;:::-;11276:1;11290:154;11304:6;11301:1;11298:13;11290:154;;;11378:7;11372:14;11368:1;11363:3;11359:11;11352:35;11428:1;11419:7;11415:15;11404:26;;11326:4;11323:1;11319:12;11314:17;;11290:154;;;11473:6;11468:3;11464:16;11457:23;;11153:337;;10967:523;;10756:740;;10647:849;;;;:::o;11502:157::-;11602:50;11646:5;11602:50;:::i;:::-;11597:3;11590:63;11502:157;;:::o;11665:364::-;11753:3;11781:39;11814:5;11781:39;:::i;:::-;11836:71;11900:6;11895:3;11836:71;:::i;:::-;11829:78;;11916:52;11961:6;11956:3;11949:4;11942:5;11938:16;11916:52;:::i;:::-;11993:29;12015:6;11993:29;:::i;:::-;11988:3;11984:39;11977:46;;11757:272;11665:364;;;;:::o;12035:365::-;12177:3;12198:66;12262:1;12257:3;12198:66;:::i;:::-;12191:73;;12273:93;12362:3;12273:93;:::i;:::-;12391:2;12386:3;12382:12;12375:19;;12035:365;;;:::o;12406:400::-;12566:3;12587:84;12669:1;12664:3;12587:84;:::i;:::-;12580:91;;12680:93;12769:3;12680:93;:::i;:::-;12798:1;12793:3;12789:11;12782:18;;12406:400;;;:::o;12812:365::-;12954:3;12975:66;13039:1;13034:3;12975:66;:::i;:::-;12968:73;;13050:93;13139:3;13050:93;:::i;:::-;13168:2;13163:3;13159:12;13152:19;;12812:365;;;:::o;13183:366::-;13325:3;13346:67;13410:2;13405:3;13346:67;:::i;:::-;13339:74;;13422:93;13511:3;13422:93;:::i;:::-;13540:2;13535:3;13531:12;13524:19;;13183:366;;;:::o;13555:365::-;13697:3;13718:66;13782:1;13777:3;13718:66;:::i;:::-;13711:73;;13793:93;13882:3;13793:93;:::i;:::-;13911:2;13906:3;13902:12;13895:19;;13555:365;;;:::o;13926:366::-;14068:3;14089:67;14153:2;14148:3;14089:67;:::i;:::-;14082:74;;14165:93;14254:3;14165:93;:::i;:::-;14283:2;14278:3;14274:12;14267:19;;13926:366;;;:::o;14298:::-;14440:3;14461:67;14525:2;14520:3;14461:67;:::i;:::-;14454:74;;14537:93;14626:3;14537:93;:::i;:::-;14655:2;14650:3;14646:12;14639:19;;14298:366;;;:::o;14670:118::-;14757:24;14775:5;14757:24;:::i;:::-;14752:3;14745:37;14670:118;;:::o;14794:157::-;14899:45;14919:24;14937:5;14919:24;:::i;:::-;14899:45;:::i;:::-;14894:3;14887:58;14794:157;;:::o;14957:112::-;15040:22;15056:5;15040:22;:::i;:::-;15035:3;15028:35;14957:112;;:::o;15075:397::-;15215:3;15230:75;15301:3;15292:6;15230:75;:::i;:::-;15330:2;15325:3;15321:12;15314:19;;15343:75;15414:3;15405:6;15343:75;:::i;:::-;15443:2;15438:3;15434:12;15427:19;;15463:3;15456:10;;15075:397;;;;;:::o;15478:273::-;15609:3;15631:94;15721:3;15712:6;15631:94;:::i;:::-;15624:101;;15742:3;15735:10;;15478:273;;;;:::o;15757:663::-;15998:3;16020:148;16164:3;16020:148;:::i;:::-;16013:155;;16178:75;16249:3;16240:6;16178:75;:::i;:::-;16278:2;16273:3;16269:12;16262:19;;16291:75;16362:3;16353:6;16291:75;:::i;:::-;16391:2;16386:3;16382:12;16375:19;;16411:3;16404:10;;15757:663;;;;;:::o;16426:222::-;16519:4;16557:2;16546:9;16542:18;16534:26;;16570:71;16638:1;16627:9;16623:17;16614:6;16570:71;:::i;:::-;16426:222;;;;:::o;16654:878::-;16911:4;16949:3;16938:9;16934:19;16926:27;;16963:71;17031:1;17020:9;17016:17;17007:6;16963:71;:::i;:::-;17044:72;17112:2;17101:9;17097:18;17088:6;17044:72;:::i;:::-;17126;17194:2;17183:9;17179:18;17170:6;17126:72;:::i;:::-;17208;17276:2;17265:9;17261:18;17252:6;17208:72;:::i;:::-;17290:69;17354:3;17343:9;17339:19;17330:6;17290:69;:::i;:::-;17369:73;17437:3;17426:9;17422:19;17413:6;17369:73;:::i;:::-;17452;17520:3;17509:9;17505:19;17496:6;17452:73;:::i;:::-;16654:878;;;;;;;;;;:::o;17538:332::-;17659:4;17697:2;17686:9;17682:18;17674:26;;17710:71;17778:1;17767:9;17763:17;17754:6;17710:71;:::i;:::-;17791:72;17859:2;17848:9;17844:18;17835:6;17791:72;:::i;:::-;17538:332;;;;;:::o;17876:442::-;18025:4;18063:2;18052:9;18048:18;18040:26;;18076:71;18144:1;18133:9;18129:17;18120:6;18076:71;:::i;:::-;18157:72;18225:2;18214:9;18210:18;18201:6;18157:72;:::i;:::-;18239;18307:2;18296:9;18292:18;18283:6;18239:72;:::i;:::-;17876:442;;;;;;:::o;18324:210::-;18411:4;18449:2;18438:9;18434:18;18426:26;;18462:65;18524:1;18513:9;18509:17;18500:6;18462:65;:::i;:::-;18324:210;;;;:::o;18540:222::-;18633:4;18671:2;18660:9;18656:18;18648:26;;18684:71;18752:1;18741:9;18737:17;18728:6;18684:71;:::i;:::-;18540:222;;;;:::o;18768:775::-;19001:4;19039:3;19028:9;19024:19;19016:27;;19053:71;19121:1;19110:9;19106:17;19097:6;19053:71;:::i;:::-;19134:72;19202:2;19191:9;19187:18;19178:6;19134:72;:::i;:::-;19216;19284:2;19273:9;19269:18;19260:6;19216:72;:::i;:::-;19298;19366:2;19355:9;19351:18;19342:6;19298:72;:::i;:::-;19380:73;19448:3;19437:9;19433:19;19424:6;19380:73;:::i;:::-;19463;19531:3;19520:9;19516:19;19507:6;19463:73;:::i;:::-;18768:775;;;;;;;;;:::o;19549:664::-;19754:4;19792:3;19781:9;19777:19;19769:27;;19806:71;19874:1;19863:9;19859:17;19850:6;19806:71;:::i;:::-;19887:72;19955:2;19944:9;19940:18;19931:6;19887:72;:::i;:::-;19969;20037:2;20026:9;20022:18;20013:6;19969:72;:::i;:::-;20051;20119:2;20108:9;20104:18;20095:6;20051:72;:::i;:::-;20133:73;20201:3;20190:9;20186:19;20177:6;20133:73;:::i;:::-;19549:664;;;;;;;;:::o;20219:332::-;20340:4;20378:2;20367:9;20363:18;20355:26;;20391:71;20459:1;20448:9;20444:17;20435:6;20391:71;:::i;:::-;20472:72;20540:2;20529:9;20525:18;20516:6;20472:72;:::i;:::-;20219:332;;;;;:::o;20557:545::-;20730:4;20768:3;20757:9;20753:19;20745:27;;20782:71;20850:1;20839:9;20835:17;20826:6;20782:71;:::i;:::-;20863:68;20927:2;20916:9;20912:18;20903:6;20863:68;:::i;:::-;20941:72;21009:2;20998:9;20994:18;20985:6;20941:72;:::i;:::-;21023;21091:2;21080:9;21076:18;21067:6;21023:72;:::i;:::-;20557:545;;;;;;;:::o;21108:248::-;21214:4;21252:2;21241:9;21237:18;21229:26;;21265:84;21346:1;21335:9;21331:17;21322:6;21265:84;:::i;:::-;21108:248;;;;:::o;21362:313::-;21475:4;21513:2;21502:9;21498:18;21490:26;;21562:9;21556:4;21552:20;21548:1;21537:9;21533:17;21526:47;21590:78;21663:4;21654:6;21590:78;:::i;:::-;21582:86;;21362:313;;;;:::o;21681:419::-;21847:4;21885:2;21874:9;21870:18;21862:26;;21934:9;21928:4;21924:20;21920:1;21909:9;21905:17;21898:47;21962:131;22088:4;21962:131;:::i;:::-;21954:139;;21681:419;;;:::o;22106:::-;22272:4;22310:2;22299:9;22295:18;22287:26;;22359:9;22353:4;22349:20;22345:1;22334:9;22330:17;22323:47;22387:131;22513:4;22387:131;:::i;:::-;22379:139;;22106:419;;;:::o;22531:::-;22697:4;22735:2;22724:9;22720:18;22712:26;;22784:9;22778:4;22774:20;22770:1;22759:9;22755:17;22748:47;22812:131;22938:4;22812:131;:::i;:::-;22804:139;;22531:419;;;:::o;22956:::-;23122:4;23160:2;23149:9;23145:18;23137:26;;23209:9;23203:4;23199:20;23195:1;23184:9;23180:17;23173:47;23237:131;23363:4;23237:131;:::i;:::-;23229:139;;22956:419;;;:::o;23381:::-;23547:4;23585:2;23574:9;23570:18;23562:26;;23634:9;23628:4;23624:20;23620:1;23609:9;23605:17;23598:47;23662:131;23788:4;23662:131;:::i;:::-;23654:139;;23381:419;;;:::o;23806:::-;23972:4;24010:2;23999:9;23995:18;23987:26;;24059:9;24053:4;24049:20;24045:1;24034:9;24030:17;24023:47;24087:131;24213:4;24087:131;:::i;:::-;24079:139;;23806:419;;;:::o;24231:222::-;24324:4;24362:2;24351:9;24347:18;24339:26;;24375:71;24443:1;24432:9;24428:17;24419:6;24375:71;:::i;:::-;24231:222;;;;:::o;24459:332::-;24580:4;24618:2;24607:9;24603:18;24595:26;;24631:71;24699:1;24688:9;24684:17;24675:6;24631:71;:::i;:::-;24712:72;24780:2;24769:9;24765:18;24756:6;24712:72;:::i;:::-;24459:332;;;;;:::o;24797:442::-;24946:4;24984:2;24973:9;24969:18;24961:26;;24997:71;25065:1;25054:9;25050:17;25041:6;24997:71;:::i;:::-;25078:72;25146:2;25135:9;25131:18;25122:6;25078:72;:::i;:::-;25160;25228:2;25217:9;25213:18;25204:6;25160:72;:::i;:::-;24797:442;;;;;;:::o;25245:214::-;25334:4;25372:2;25361:9;25357:18;25349:26;;25385:67;25449:1;25438:9;25434:17;25425:6;25385:67;:::i;:::-;25245:214;;;;:::o;25546:144::-;25598:4;25621:3;25613:11;;25644:3;25641:1;25634:14;25678:4;25675:1;25665:18;25657:26;;25546:144;;;:::o;25696:99::-;25748:6;25782:5;25776:12;25766:22;;25696:99;;;:::o;25801:147::-;25902:11;25939:3;25924:18;;25801:147;;;;:::o;25954:169::-;26038:11;26072:6;26067:3;26060:19;26112:4;26107:3;26103:14;26088:29;;25954:169;;;;:::o;26129:148::-;26231:11;26268:3;26253:18;;26129:148;;;;:::o;26283:305::-;26323:3;26342:20;26360:1;26342:20;:::i;:::-;26337:25;;26376:20;26394:1;26376:20;:::i;:::-;26371:25;;26530:1;26462:66;26458:74;26455:1;26452:81;26449:107;;;26536:18;;:::i;:::-;26449:107;26580:1;26577;26573:9;26566:16;;26283:305;;;;:::o;26594:185::-;26634:1;26651:20;26669:1;26651:20;:::i;:::-;26646:25;;26685:20;26703:1;26685:20;:::i;:::-;26680:25;;26724:1;26714:35;;26729:18;;:::i;:::-;26714:35;26771:1;26768;26764:9;26759:14;;26594:185;;;;:::o;26785:348::-;26825:7;26848:20;26866:1;26848:20;:::i;:::-;26843:25;;26882:20;26900:1;26882:20;:::i;:::-;26877:25;;27070:1;27002:66;26998:74;26995:1;26992:81;26987:1;26980:9;26973:17;26969:105;26966:131;;;27077:18;;:::i;:::-;26966:131;27125:1;27122;27118:9;27107:20;;26785:348;;;;:::o;27139:191::-;27179:4;27199:20;27217:1;27199:20;:::i;:::-;27194:25;;27233:20;27251:1;27233:20;:::i;:::-;27228:25;;27272:1;27269;27266:8;27263:34;;;27277:18;;:::i;:::-;27263:34;27322:1;27319;27315:9;27307:17;;27139:191;;;;:::o;27336:96::-;27373:7;27402:24;27420:5;27402:24;:::i;:::-;27391:35;;27336:96;;;:::o;27438:90::-;27472:7;27515:5;27508:13;27501:21;27490:32;;27438:90;;;:::o;27534:77::-;27571:7;27600:5;27589:16;;27534:77;;;:::o;27617:126::-;27654:7;27694:42;27687:5;27683:54;27672:65;;27617:126;;;:::o;27749:77::-;27786:7;27815:5;27804:16;;27749:77;;;:::o;27832:86::-;27867:7;27907:4;27900:5;27896:16;27885:27;;27832:86;;;:::o;27924:139::-;27987:9;28020:37;28051:5;28020:37;:::i;:::-;28007:50;;27924:139;;;:::o;28069:126::-;28119:9;28152:37;28183:5;28152:37;:::i;:::-;28139:50;;28069:126;;;:::o;28201:113::-;28251:9;28284:24;28302:5;28284:24;:::i;:::-;28271:37;;28201:113;;;:::o;28320:307::-;28388:1;28398:113;28412:6;28409:1;28406:13;28398:113;;;28497:1;28492:3;28488:11;28482:18;28478:1;28473:3;28469:11;28462:39;28434:2;28431:1;28427:10;28422:15;;28398:113;;;28529:6;28526:1;28523:13;28520:101;;;28609:1;28600:6;28595:3;28591:16;28584:27;28520:101;28369:258;28320:307;;;:::o;28633:320::-;28677:6;28714:1;28708:4;28704:12;28694:22;;28761:1;28755:4;28751:12;28782:18;28772:81;;28838:4;28830:6;28826:17;28816:27;;28772:81;28900:2;28892:6;28889:14;28869:18;28866:38;28863:84;;;28919:18;;:::i;:::-;28863:84;28684:269;28633:320;;;:::o;28959:233::-;28998:3;29021:24;29039:5;29021:24;:::i;:::-;29012:33;;29067:66;29060:5;29057:77;29054:103;;;29137:18;;:::i;:::-;29054:103;29184:1;29177:5;29173:13;29166:20;;28959:233;;;:::o;29198:100::-;29237:7;29266:26;29286:5;29266:26;:::i;:::-;29255:37;;29198:100;;;:::o;29304:79::-;29343:7;29372:5;29361:16;;29304:79;;;:::o;29389:94::-;29428:7;29457:20;29471:5;29457:20;:::i;:::-;29446:31;;29389:94;;;:::o;29489:79::-;29528:7;29557:5;29546:16;;29489:79;;;:::o;29574:180::-;29622:77;29619:1;29612:88;29719:4;29716:1;29709:15;29743:4;29740:1;29733:15;29760:180;29808:77;29805:1;29798:88;29905:4;29902:1;29895:15;29929:4;29926:1;29919:15;29946:180;29994:77;29991:1;29984:88;30091:4;30088:1;30081:15;30115:4;30112:1;30105:15;30132:180;30180:77;30177:1;30170:88;30277:4;30274:1;30267:15;30301:4;30298:1;30291:15;30318:117;30427:1;30424;30417:12;30441:117;30550:1;30547;30540:12;30564:117;30673:1;30670;30663:12;30687:117;30796:1;30793;30786:12;30810:117;30919:1;30916;30909:12;30933:102;30974:6;31025:2;31021:7;31016:2;31009:5;31005:14;31001:28;30991:38;;30933:102;;;:::o;31041:94::-;31074:8;31122:5;31118:2;31114:14;31093:35;;31041:94;;;:::o;31141:156::-;31281:8;31277:1;31269:6;31265:14;31258:32;31141:156;:::o;31303:214::-;31443:66;31439:1;31431:6;31427:14;31420:90;31303:214;:::o;31523:156::-;31663:8;31659:1;31651:6;31647:14;31640:32;31523:156;:::o;31685:170::-;31825:22;31821:1;31813:6;31809:14;31802:46;31685:170;:::o;31861:158::-;32001:10;31997:1;31989:6;31985:14;31978:34;31861:158;:::o;32025:164::-;32165:16;32161:1;32153:6;32149:14;32142:40;32025:164;:::o;32195:173::-;32335:25;32331:1;32323:6;32319:14;32312:49;32195:173;:::o;32374:122::-;32447:24;32465:5;32447:24;:::i;:::-;32440:5;32437:35;32427:63;;32486:1;32483;32476:12;32427:63;32374:122;:::o;32502:116::-;32572:21;32587:5;32572:21;:::i;:::-;32565:5;32562:32;32552:60;;32608:1;32605;32598:12;32552:60;32502:116;:::o;32624:122::-;32697:24;32715:5;32697:24;:::i;:::-;32690:5;32687:35;32677:63;;32736:1;32733;32726:12;32677:63;32624:122;:::o;32752:::-;32825:24;32843:5;32825:24;:::i;:::-;32818:5;32815:35;32805:63;;32864:1;32861;32854:12;32805:63;32752:122;:::o;32880:118::-;32951:22;32967:5;32951:22;:::i;:::-;32944:5;32941:33;32931:61;;32988:1;32985;32978:12;32931:61;32880:118;:::o

Swarm Source

ipfs://6dcdb126719391a14240e2923bde42df1d48e65eb8f3e10507f95d12755dc64c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.