ETH Price: $2,446.87 (+1.86%)

Token

Poker Dogs Club (PDGC)
 

Overview

Max Total Supply

567 PDGC

Holders

304

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
4 PDGC
0x05caad8dd79807d1d31d089ce90bde9c068dc743
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:
PokerDogsClub

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-29
*/

//SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

error NotOwner();

abstract contract LilOwnable {
    address internal _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    constructor() {
        _owner = msg.sender;
    }

    function owner() external view returns (address) {
        return _owner;
    }

    function transferOwnership(address _newOwner) external {
        if (msg.sender != _owner) revert NotOwner();

        _owner = _newOwner;
    }

    function renounceOwnership() public {
        if (msg.sender != _owner) revert NotOwner();

        _owner = address(0);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        pure
        virtual
        returns (bool)
    {
        return interfaceId == 0x7f5828d0; // ERC165 Interface ID for ERC173
    }
}


library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
}


/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
/// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC.
abstract contract ERC721 {
    /*///////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

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

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

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

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

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*///////////////////////////////////////////////////////////////
                            ERC721 STORAGE                        
    //////////////////////////////////////////////////////////////*/

    mapping(address => uint256) public balanceOf;

    mapping(uint256 => address) public ownerOf;

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

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

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*///////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            balanceOf[from]--;

            balanceOf[to]++;
        }

        ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

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

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            balanceOf[to]++;
        }

        ownerOf[id] = to;

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

    function _burn(uint256 id) internal virtual {
        address owner = ownerOf[id];

        require(ownerOf[id] != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            balanceOf[owner]--;
        }

        delete ownerOf[id];

        delete getApproved[id];

        emit Transfer(owner, address(0), id);
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 id,
        bytes calldata data
    ) external returns (bytes4);
}


/// @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
            }
        }
    }
}


/// @notice Arithmetic library with operations for fixed-point numbers.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/FixedPointMathLib.sol)
library FixedPointMathLib {
    /*///////////////////////////////////////////////////////////////
                            COMMON BASE UNITS
    //////////////////////////////////////////////////////////////*/

    uint256 internal constant YAD = 1e8;
    uint256 internal constant WAD = 1e18;
    uint256 internal constant RAY = 1e27;
    uint256 internal constant RAD = 1e45;

    /*///////////////////////////////////////////////////////////////
                         FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function fmul(
        uint256 x,
        uint256 y,
        uint256 baseUnit
    ) internal pure returns (uint256 z) {
        assembly {
            // Store x * y in z for now.
            z := mul(x, y)

            // Equivalent to require(x == 0 || (x * y) / x == y)
            if iszero(or(iszero(x), eq(div(z, x), y))) {
                revert(0, 0)
            }

            // If baseUnit is zero this will return zero instead of reverting.
            z := div(z, baseUnit)
        }
    }

    function fdiv(
        uint256 x,
        uint256 y,
        uint256 baseUnit
    ) internal pure returns (uint256 z) {
        assembly {
            // Store x * baseUnit in z for now.
            z := mul(x, baseUnit)

            // Equivalent to require(y != 0 && (x == 0 || (x * baseUnit) / x == baseUnit))
            if iszero(and(iszero(iszero(y)), or(iszero(x), eq(div(z, x), baseUnit)))) {
                revert(0, 0)
            }

            // We ensure y is not zero above, so there is never division by zero here.
            z := div(z, y)
        }
    }

    function fpow(
        uint256 x,
        uint256 n,
        uint256 baseUnit
    ) internal pure returns (uint256 z) {
        assembly {
            switch x
            case 0 {
                switch n
                case 0 {
                    // 0 ** 0 = 1
                    z := baseUnit
                }
                default {
                    // 0 ** n = 0
                    z := 0
                }
            }
            default {
                switch mod(n, 2)
                case 0 {
                    // If n is even, store baseUnit in z for now.
                    z := baseUnit
                }
                default {
                    // If n is odd, store x in z for now.
                    z := x
                }

                // Shifting right by 1 is like dividing by 2.
                let half := shr(1, baseUnit)

                for {
                    // Shift n right by 1 before looping to halve it.
                    n := shr(1, n)
                } n {
                    // Shift n right by 1 each iteration to halve it.
                    n := shr(1, n)
                } {
                    // Revert immediately if x ** 2 would overflow.
                    // Equivalent to iszero(eq(div(xx, x), x)) here.
                    if shr(128, x) {
                        revert(0, 0)
                    }

                    // Store x squared.
                    let xx := mul(x, x)

                    // Round to the nearest number.
                    let xxRound := add(xx, half)

                    // Revert if xx + half overflowed.
                    if lt(xxRound, xx) {
                        revert(0, 0)
                    }

                    // Set x to scaled xxRound.
                    x := div(xxRound, baseUnit)

                    // If n is even:
                    if mod(n, 2) {
                        // Compute z * x.
                        let zx := mul(z, x)

                        // If z * x overflowed:
                        if iszero(eq(div(zx, x), z)) {
                            // Revert if x is non-zero.
                            if iszero(iszero(x)) {
                                revert(0, 0)
                            }
                        }

                        // Round to the nearest number.
                        let zxRound := add(zx, half)

                        // Revert if zx + half overflowed.
                        if lt(zxRound, zx) {
                            revert(0, 0)
                        }

                        // Return properly scaled zxRound.
                        z := div(zxRound, baseUnit)
                    }
                }
            }
        }
    }

    /*///////////////////////////////////////////////////////////////
                        GENERAL NUMBER UTILITIES
    //////////////////////////////////////////////////////////////*/

    function sqrt(uint256 x) internal pure returns (uint256 z) {
        assembly {
            // Start off with z at 1.
            z := 1

            // Used below to help find a nearby power of 2.
            let y := x

            // Find the lowest power of 2 that is at least sqrt(x).
            if iszero(lt(y, 0x100000000000000000000000000000000)) {
                y := shr(128, y) // Like dividing by 2 ** 128.
                z := shl(64, z)
            }
            if iszero(lt(y, 0x10000000000000000)) {
                y := shr(64, y) // Like dividing by 2 ** 64.
                z := shl(32, z)
            }
            if iszero(lt(y, 0x100000000)) {
                y := shr(32, y) // Like dividing by 2 ** 32.
                z := shl(16, z)
            }
            if iszero(lt(y, 0x10000)) {
                y := shr(16, y) // Like dividing by 2 ** 16.
                z := shl(8, z)
            }
            if iszero(lt(y, 0x100)) {
                y := shr(8, y) // Like dividing by 2 ** 8.
                z := shl(4, z)
            }
            if iszero(lt(y, 0x10)) {
                y := shr(4, y) // Like dividing by 2 ** 4.
                z := shl(2, z)
            }
            if iszero(lt(y, 0x8)) {
                // Equivalent to 2 ** z.
                z := shl(1, z)
            }

            // Shifting right by 1 is like dividing by 2.
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))

            // Compute a rounded down version of z.
            let zRoundDown := div(x, z)

            // If zRoundDown is smaller, use it.
            if lt(zRoundDown, z) {
                z := zRoundDown
            }
        }
    }
}


/*
 ____       _               ____                     ____ _       _
|  _ \ ___ | | _____ _ __  |  _ \  ___   __ _ ___   / ___| |_   _| |__
| |_) / _ \| |/ / _ \ '__| | | | |/ _ \ / _` / __| | |   | | | | | '_ \
|  __/ (_) |   <  __/ |    | |_| | (_) | (_| \__ \ | |___| | |_| | |_) |
|_|   \___/|_|\_\___|_|    |____/ \___/ \__, |___/  \____|_|\__,_|_.__/
                                        |___/
*/

error DoesNotExist();
error NoTokensLeft();
error NotEnoughETH();
error TooManyMintAtOnce();
error NotOnWhitelist();
error WhitelistMintNotStarted();
error MintNotStarted();
error EmptyBalance();
error NoReserveTokensLeft();

contract PokerDogsClub is LilOwnable, ERC721 {
    using Strings for uint256;

    uint256 public constant TOTAL_SUPPLY = 7777;
    uint256 public constant PRICE_PER_WHITELIST_MINT = 0.05 ether;
    uint256 public constant PRICE_PER_PUBLIC_MINT = 0.069 ether;
    uint256 public maxWhitelistMintAmount = 10;
    uint256 public maxPublicMintAmount = 20;

    bool public whitelistMintStarted = false;
    bool public mintStarted = false;
    bool public revealed = false;

    uint256 public totalSupply;

    bytes32 private _merkleRoot;

    string public baseURI;
    string public nonRevealedURI;
    string public baseExtension = ".json";

    address[4] private _royaltyAddresses;

    mapping(address => uint256) private _royaltyShares;

    constructor(
        string memory _nonRevealedURI,
        bytes32 _initMerkleRoot,
        address[4] memory _contributorAddresses
    ) payable ERC721("Poker Dogs Club", "PDGC") {
        nonRevealedURI = _nonRevealedURI;
        _merkleRoot = _initMerkleRoot;

        _royaltyAddresses[0] = _contributorAddresses[0];
        _royaltyAddresses[1] = _contributorAddresses[1];
        _royaltyAddresses[2] = _contributorAddresses[2];
        _royaltyAddresses[3] = _contributorAddresses[3];

        _royaltyShares[_royaltyAddresses[0]] = 515;
        _royaltyShares[_royaltyAddresses[1]] = 400;
        _royaltyShares[_royaltyAddresses[2]] = 75;
        _royaltyShares[_royaltyAddresses[3]] = 10;
        for (uint256 i=0; i < 50; i++) {
            _mint(msg.sender, totalSupply + 1);
            totalSupply++;
        }
    }
    
    modifier onlyOwner() {
        require(msg.sender == _owner, "Ownable: caller is not the owner");
        _;
    }

    /// @dev    Add a hashed address to the merkle tree as a leaf
    /// @param  account Leaf address for MerkleTree
    /// @return bytes32 hashed version of the merkle leaf address
    function _leaf(address account) private pure returns (bytes32) {
        return keccak256(abi.encodePacked(account));
    }

    /// @dev    Verify the whitelist using the merkle tree
    /// @param  leaf Hashed address leaf from _leaf() to search for
    /// @param  proof Submitted root proof from MerkleTree
    /// @return bool True if address is allowed to mint
    function verifyWhitelist(bytes32 leaf, bytes32[] memory proof)
        private
        view
        returns (bool)
    {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash < proofElement) {
                computedHash = keccak256(
                    abi.encodePacked(computedHash, proofElement)
                );
            } else {
                computedHash = keccak256(
                    abi.encodePacked(proofElement, computedHash)
                );
            }
        }

        return computedHash == _merkleRoot;
    }

    function mint(uint16 amount) external payable {
        if (totalSupply + amount > TOTAL_SUPPLY) revert NoTokensLeft();
        if (!mintStarted) revert MintNotStarted();
        if (msg.value < amount * PRICE_PER_PUBLIC_MINT) revert NotEnoughETH();
        if (amount > maxPublicMintAmount) revert TooManyMintAtOnce();

        unchecked {
            for (uint16 index = 0; index < amount; index++) {
                _mint(msg.sender, totalSupply + 1);
                totalSupply++;
            }
        }
    }

    function whitelistMint(uint16 amount, bytes32[] memory _proof) external payable {
        if (totalSupply + amount > TOTAL_SUPPLY) revert NoTokensLeft();
        if (!whitelistMintStarted) revert WhitelistMintNotStarted();
        if (msg.value < amount * PRICE_PER_WHITELIST_MINT) revert NotEnoughETH();
        if (amount > maxWhitelistMintAmount) revert TooManyMintAtOnce();
        if (verifyWhitelist(_leaf(msg.sender), _proof) == false) revert NotOnWhitelist();
        
        unchecked {
            for (uint16 index = 0; index < amount; index++) {
                _mint(msg.sender, totalSupply + 1);
                totalSupply++;
            }
        }
    }

    function tokenURI(uint256 id) public view virtual override returns (string memory) {
        if (ownerOf[id] == address(0)) revert DoesNotExist();

        if (revealed == false) {
            return nonRevealedURI;
        }
        return string(abi.encodePacked(baseURI, id.toString(), baseExtension));
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function startWhitelistMint() public onlyOwner {
        whitelistMintStarted = true;
    }
    
    function startMint() public onlyOwner {
        mintStarted = true;
    }

    function pauseMint() public onlyOwner {
        whitelistMintStarted = false;
        mintStarted = false;
    }

    function reveal(string memory _baseUri) public onlyOwner {
        setBaseURI(_baseUri);
        revealed = true;
    }

    function setMerkleRoot(bytes32 _merkleRootValue) external onlyOwner returns (bytes32) {
        _merkleRoot = _merkleRootValue;
        return _merkleRoot;
    }

    function withdraw() external onlyOwner {
        if (address(this).balance == 0) revert EmptyBalance();
        uint256 balance = address(this).balance;

        for (uint256 i = 0; i < _royaltyAddresses.length; i++) {
            payable(_royaltyAddresses[i]).transfer(
                balance / 1000 * _royaltyShares[_royaltyAddresses[i]]
            );
        }
    }

    /// @dev Tells interfacing contracts what they can do with this one
    function supportsInterface(bytes4 interfaceId)
        public
        pure
        override(LilOwnable, ERC721)
        returns (bool)
    {
        return
            interfaceId == 0x7f5828d0 || // ERC165 Interface ID for ERC173
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f || // ERC165 Interface ID for ERC165
            interfaceId == 0x01ffc9a7; // ERC165 Interface ID for ERC721Metadata
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_nonRevealedURI","type":"string"},{"internalType":"bytes32","name":"_initMerkleRoot","type":"bytes32"},{"internalType":"address[4]","name":"_contributorAddresses","type":"address[4]"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"DoesNotExist","type":"error"},{"inputs":[],"name":"EmptyBalance","type":"error"},{"inputs":[],"name":"MintNotStarted","type":"error"},{"inputs":[],"name":"NoTokensLeft","type":"error"},{"inputs":[],"name":"NotEnoughETH","type":"error"},{"inputs":[],"name":"NotOnWhitelist","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"TooManyMintAtOnce","type":"error"},{"inputs":[],"name":"WhitelistMintNotStarted","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PRICE_PER_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_WHITELIST_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWhitelistMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonRevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRootValue","type":"bytes32"}],"name":"setMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"amount","type":"uint16"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a60075560146008556000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff0219169083151502179055506000600960026101000a81548160ff0219169083151502179055506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e9080519060200190620000ac9291906200081a565b5060405162004770380380620047708339818101604052810190620000d2919062000bd0565b6040518060400160405280600f81526020017f506f6b657220446f677320436c756200000000000000000000000000000000008152506040518060400160405280600481526020017f5044474300000000000000000000000000000000000000000000000000000000815250336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160019080519060200190620001969291906200081a565b508060029080519060200190620001af9291906200081a565b50505082600d9080519060200190620001ca9291906200081a565b5081600b8190555080600060048110620001e957620001e862000c4b565b5b6020020151600f60006004811062000206576200020562000c4b565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806001600481106200025c576200025b62000c4b565b5b6020020151600f60016004811062000279576200027862000c4b565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260048110620002cf57620002ce62000c4b565b5b6020020151600f600260048110620002ec57620002eb62000c4b565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060036004811062000342576200034162000c4b565b5b6020020151600f6003600481106200035f576200035e62000c4b565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061020360136000600f600060048110620003bd57620003bc62000c4b565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061019060136000600f6001600481106200043c576200043b62000c4b565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550604b60136000600f600260048110620004ba57620004b962000c4b565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600a60136000600f60036004811062000538576200053762000c4b565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b6032811015620005f757620005c7336001600a54620005bb919062000cb3565b6200060160201b60201c565b600a6000815480929190620005dc9062000d10565b91905055508080620005ee9062000d10565b9150506200059b565b5050505062000eb8565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000674576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200066b9062000dbf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000719576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007109062000e31565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054620008289062000e82565b90600052602060002090601f0160209004810192826200084c576000855562000898565b82601f106200086757805160ff191683800117855562000898565b8280016001018555821562000898579182015b82811115620008975782518255916020019190600101906200087a565b5b509050620008a79190620008ab565b5090565b5b80821115620008c6576000816000905550600101620008ac565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200093382620008e8565b810181811067ffffffffffffffff82111715620009555762000954620008f9565b5b80604052505050565b60006200096a620008ca565b905062000978828262000928565b919050565b600067ffffffffffffffff8211156200099b576200099a620008f9565b5b620009a682620008e8565b9050602081019050919050565b60005b83811015620009d3578082015181840152602081019050620009b6565b83811115620009e3576000848401525b50505050565b600062000a00620009fa846200097d565b6200095e565b90508281526020810184848401111562000a1f5762000a1e620008e3565b5b62000a2c848285620009b3565b509392505050565b600082601f83011262000a4c5762000a4b620008de565b5b815162000a5e848260208601620009e9565b91505092915050565b6000819050919050565b62000a7c8162000a67565b811462000a8857600080fd5b50565b60008151905062000a9c8162000a71565b92915050565b600067ffffffffffffffff82111562000ac05762000abf620008f9565b5b602082029050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000afd8262000ad0565b9050919050565b62000b0f8162000af0565b811462000b1b57600080fd5b50565b60008151905062000b2f8162000b04565b92915050565b600062000b4c62000b468462000aa2565b6200095e565b9050806020840283018581111562000b695762000b6862000acb565b5b835b8181101562000b96578062000b81888262000b1e565b84526020840193505060208101905062000b6b565b5050509392505050565b600082601f83011262000bb85762000bb7620008de565b5b600462000bc784828562000b35565b91505092915050565b600080600060c0848603121562000bec5762000beb620008d4565b5b600084015167ffffffffffffffff81111562000c0d5762000c0c620008d9565b5b62000c1b8682870162000a34565b935050602062000c2e8682870162000a8b565b925050604062000c418682870162000ba0565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000cc08262000c7a565b915062000ccd8362000c7a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000d055762000d0462000c84565b5b828201905092915050565b600062000d1d8262000c7a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000d535762000d5262000c84565b5b600182019050919050565b600082825260208201905092915050565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b600062000da760118362000d5e565b915062000db48262000d6f565b602082019050919050565b6000602082019050818103600083015262000dda8162000d98565b9050919050565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b600062000e19600e8362000d5e565b915062000e268262000de1565b602082019050919050565b6000602082019050818103600083015262000e4c8162000e0a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000e9b57607f821691505b6020821081141562000eb25762000eb162000e53565b5b50919050565b6138a88062000ec86000396000f3fe60806040526004361061021a5760003560e01c806369eb16a311610123578063a9722cf3116100ab578063c87b56dd1161006f578063c87b56dd1461075d578063cd85cdb51461079a578063e985e9c5146107b1578063f2fde38b146107ee578063f96407fa146108175761021a565b8063a9722cf3146106ab578063b182e818146106d6578063b70196d7146106f2578063b88d4fde14610709578063c6682862146107325761021a565b80637cb64759116100f25780637cb64759146105c45780638da5cb5b14610601578063902d55a51461062c57806395d89b4114610657578063a22cb465146106825761021a565b806369eb16a31461051a5780636c0360eb1461054557806370a0823114610570578063715018a6146105ad5761021a565b806323cf0a22116101a657806342842e0e1161017557806342842e0e146104375780634c26124714610460578063518302271461048957806355f804b3146104b45780636352211e146104dd5761021a565b806323cf0a22146103c25780632be09561146103de5780632f0d3e20146103f55780633ccfd60b146104205761021a565b8063081812fc116101ed578063081812fc146102dd578063095ea7b31461031a57806318160ddd146103435780631cfddb1f1461036e57806323b872dd146103995761021a565b806301ffc9a71461021f57806303d8acef1461025c578063055ea1411461028757806306fdde03146102b2575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612810565b610842565b6040516102539190612858565b60405180910390f35b34801561026857600080fd5b50610271610904565b60405161027e919061288c565b60405180910390f35b34801561029357600080fd5b5061029c61090a565b6040516102a99190612940565b60405180910390f35b3480156102be57600080fd5b506102c7610998565b6040516102d49190612940565b60405180910390f35b3480156102e957600080fd5b5061030460048036038101906102ff919061298e565b610a26565b60405161031191906129fc565b60405180910390f35b34801561032657600080fd5b50610341600480360381019061033c9190612a43565b610a59565b005b34801561034f57600080fd5b50610358610c42565b604051610365919061288c565b60405180910390f35b34801561037a57600080fd5b50610383610c48565b6040516103909190612858565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb9190612a83565b610c5b565b005b6103dc60048036038101906103d79190612b10565b61105b565b005b3480156103ea57600080fd5b506103f36111c3565b005b34801561040157600080fd5b5061040a61126e565b604051610417919061288c565b60405180910390f35b34801561042c57600080fd5b50610435611279565b005b34801561044357600080fd5b5061045e60048036038101906104599190612a83565b611472565b005b34801561046c57600080fd5b5061048760048036038101906104829190612c72565b6115aa565b005b34801561049557600080fd5b5061049e61165f565b6040516104ab9190612858565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190612c72565b611672565b005b3480156104e957600080fd5b5061050460048036038101906104ff919061298e565b61171a565b60405161051191906129fc565b60405180910390f35b34801561052657600080fd5b5061052f61174d565b60405161053c919061288c565b60405180910390f35b34801561055157600080fd5b5061055a611758565b6040516105679190612940565b60405180910390f35b34801561057c57600080fd5b5061059760048036038101906105929190612cbb565b6117e6565b6040516105a4919061288c565b60405180910390f35b3480156105b957600080fd5b506105c26117fe565b005b3480156105d057600080fd5b506105eb60048036038101906105e69190612d1e565b6118c6565b6040516105f89190612d5a565b60405180910390f35b34801561060d57600080fd5b50610616611968565b60405161062391906129fc565b60405180910390f35b34801561063857600080fd5b50610641611991565b60405161064e919061288c565b60405180910390f35b34801561066357600080fd5b5061066c611997565b6040516106799190612940565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a49190612da1565b611a25565b005b3480156106b757600080fd5b506106c0611b22565b6040516106cd9190612858565b60405180910390f35b6106f060048036038101906106eb9190612ea9565b611b35565b005b3480156106fe57600080fd5b50610707611cee565b005b34801561071557600080fd5b50610730600480360381019061072b9190612fa6565b611d99565b005b34801561073e57600080fd5b50610747611ed4565b6040516107549190612940565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f919061298e565b611f62565b6040516107919190612940565b60405180910390f35b3480156107a657600080fd5b506107af6120e2565b005b3480156107bd57600080fd5b506107d860048036038101906107d39190613029565b6121a8565b6040516107e59190612858565b60405180910390f35b3480156107fa57600080fd5b5061081560048036038101906108109190612cbb565b6121d7565b005b34801561082357600080fd5b5061082c61229f565b604051610839919061288c565b60405180910390f35b6000637f5828d060e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108cd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108fd57506301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60085481565b600d805461091790613098565b80601f016020809104026020016040519081016040528092919081815260200182805461094390613098565b80156109905780601f1061096557610100808354040283529160200191610990565b820191906000526020600020905b81548152906001019060200180831161097357829003601f168201915b505050505081565b600180546109a590613098565b80601f01602080910402602001604051908101604052809291908181526020018280546109d190613098565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505081565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b515750600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8790613116565b60405180910390fd5b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600a5481565b600960009054906101000a900460ff1681565b6004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf390613182565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d63906131ee565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e0457506005600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610e955750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb90613116565b60405180910390fd5b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e618161ffff16600a54611070919061323d565b11156110a8576040517f7364ba1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600960019054906101000a900460ff166110ee576040517f06290e4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b66f52322698080008161ffff166111059190613293565b34101561113e576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008548161ffff16111561117e576040517f9defc75000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8161ffff168161ffff1610156111bf576111a0336001600a54016122a5565b600a600081548092919060010191905055508080600101915050611181565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124890613339565b60405180910390fd5b6001600960016101000a81548160ff021916908315150217905550565b66f523226980800081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe90613339565b60405180910390fd5b6000471415611342576040517f2313b4b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600047905060005b600481101561146e57600f816004811061136757611366613359565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc60136000600f85600481106113ba576113b9613359565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546103e88561142591906133b7565b61142f9190613293565b9081150290604051600060405180830381858888f1935050505015801561145a573d6000803e3d6000fd5b508080611466906133e8565b91505061134a565b5050565b61147d838383610c5b565b60008273ffffffffffffffffffffffffffffffffffffffff163b1480611566575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161150293929190613468565b6020604051808303816000875af1158015611521573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154591906134c7565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b6115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c90613540565b60405180910390fd5b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90613339565b60405180910390fd5b61164181611672565b6001600960026101000a81548160ff02191690831515021790555050565b600960029054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790613339565b60405180910390fd5b80600c9080519060200190611716929190612701565b5050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b66b1a2bc2ec5000081565b600c805461176590613098565b80601f016020809104026020016040519081016040528092919081815260200182805461179190613098565b80156117de5780601f106117b3576101008083540402835291602001916117de565b820191906000526020600020905b8154815290600101906020018083116117c157829003601f168201915b505050505081565b60036020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611883576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194e90613339565b60405180910390fd5b81600b81905550600b549050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e6181565b600280546119a490613098565b80601f01602080910402602001604051908101604052809291908181526020018280546119d090613098565b8015611a1d5780601f106119f257610100808354040283529160200191611a1d565b820191906000526020600020905b815481529060010190602001808311611a0057829003601f168201915b505050505081565b80600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b169190612858565b60405180910390a35050565b600960019054906101000a900460ff1681565b611e618261ffff16600a54611b4a919061323d565b1115611b82576040517f7364ba1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600960009054906101000a900460ff16611bc8576040517fef4604b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b66b1a2bc2ec500008261ffff16611bdf9190613293565b341015611c18576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007548261ffff161115611c58576040517f9defc75000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515611c6e611c68336124b8565b836124e8565b15151415611ca8576040517f522fc3bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8261ffff168161ffff161015611ce957611cca336001600a54016122a5565b600a600081548092919060010191905055508080600101915050611cab565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390613339565b60405180910390fd5b6001600960006101000a81548160ff021916908315150217905550565b611da4848484610c5b565b60008373ffffffffffffffffffffffffffffffffffffffff163b1480611e8f575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b8152600401611e2b94939291906135a4565b6020604051808303816000875af1158015611e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6e91906134c7565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec590613540565b60405180910390fd5b50505050565b600e8054611ee190613098565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0d90613098565b8015611f5a5780601f10611f2f57610100808354040283529160200191611f5a565b820191906000526020600020905b815481529060010190602001808311611f3d57829003601f168201915b505050505081565b6060600073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ffe576040517fb0ce759100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600960029054906101000a900460ff16151514156120ac57600d805461202790613098565b80601f016020809104026020016040519081016040528092919081815260200182805461205390613098565b80156120a05780601f10612075576101008083540402835291602001916120a0565b820191906000526020600020905b81548152906001019060200180831161208357829003601f168201915b505050505090506120dd565b600c6120b7836125a0565b600e6040516020016120cb939291906136c0565b60405160208183030381529060405290505b919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216790613339565b60405180910390fd5b6000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff021916908315150217905550565b60066020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461225c576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075481565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230c906131ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ae9061373d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000816040516020016124cb91906137a5565b604051602081830303815290604052805190602001209050919050565b60008083905060005b835181101561259157600084828151811061250f5761250e613359565b5b60200260200101519050808310156125515782816040516020016125349291906137e1565b60405160208183030381529060405280519060200120925061257d565b80836040516020016125649291906137e1565b6040516020818303038152906040528051906020012092505b508080612589906133e8565b9150506124f1565b50600b54811491505092915050565b606060008214156125e8576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126fc565b600082905060005b6000821461261a578080612603906133e8565b915050600a8261261391906133b7565b91506125f0565b60008167ffffffffffffffff81111561263657612635612b47565b5b6040519080825280601f01601f1916602001820160405280156126685781602001600182028036833780820191505090505b5090505b600085146126f557600182612681919061380d565b9150600a856126909190613841565b603061269c919061323d565b60f81b8183815181106126b2576126b1613359565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126ee91906133b7565b945061266c565b8093505050505b919050565b82805461270d90613098565b90600052602060002090601f01602090048101928261272f5760008555612776565b82601f1061274857805160ff1916838001178555612776565b82800160010185558215612776579182015b8281111561277557825182559160200191906001019061275a565b5b5090506127839190612787565b5090565b5b808211156127a0576000816000905550600101612788565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127ed816127b8565b81146127f857600080fd5b50565b60008135905061280a816127e4565b92915050565b600060208284031215612826576128256127ae565b5b6000612834848285016127fb565b91505092915050565b60008115159050919050565b6128528161283d565b82525050565b600060208201905061286d6000830184612849565b92915050565b6000819050919050565b61288681612873565b82525050565b60006020820190506128a1600083018461287d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128e15780820151818401526020810190506128c6565b838111156128f0576000848401525b50505050565b6000601f19601f8301169050919050565b6000612912826128a7565b61291c81856128b2565b935061292c8185602086016128c3565b612935816128f6565b840191505092915050565b6000602082019050818103600083015261295a8184612907565b905092915050565b61296b81612873565b811461297657600080fd5b50565b60008135905061298881612962565b92915050565b6000602082840312156129a4576129a36127ae565b5b60006129b284828501612979565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129e6826129bb565b9050919050565b6129f6816129db565b82525050565b6000602082019050612a1160008301846129ed565b92915050565b612a20816129db565b8114612a2b57600080fd5b50565b600081359050612a3d81612a17565b92915050565b60008060408385031215612a5a57612a596127ae565b5b6000612a6885828601612a2e565b9250506020612a7985828601612979565b9150509250929050565b600080600060608486031215612a9c57612a9b6127ae565b5b6000612aaa86828701612a2e565b9350506020612abb86828701612a2e565b9250506040612acc86828701612979565b9150509250925092565b600061ffff82169050919050565b612aed81612ad6565b8114612af857600080fd5b50565b600081359050612b0a81612ae4565b92915050565b600060208284031215612b2657612b256127ae565b5b6000612b3484828501612afb565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b7f826128f6565b810181811067ffffffffffffffff82111715612b9e57612b9d612b47565b5b80604052505050565b6000612bb16127a4565b9050612bbd8282612b76565b919050565b600067ffffffffffffffff821115612bdd57612bdc612b47565b5b612be6826128f6565b9050602081019050919050565b82818337600083830152505050565b6000612c15612c1084612bc2565b612ba7565b905082815260208101848484011115612c3157612c30612b42565b5b612c3c848285612bf3565b509392505050565b600082601f830112612c5957612c58612b3d565b5b8135612c69848260208601612c02565b91505092915050565b600060208284031215612c8857612c876127ae565b5b600082013567ffffffffffffffff811115612ca657612ca56127b3565b5b612cb284828501612c44565b91505092915050565b600060208284031215612cd157612cd06127ae565b5b6000612cdf84828501612a2e565b91505092915050565b6000819050919050565b612cfb81612ce8565b8114612d0657600080fd5b50565b600081359050612d1881612cf2565b92915050565b600060208284031215612d3457612d336127ae565b5b6000612d4284828501612d09565b91505092915050565b612d5481612ce8565b82525050565b6000602082019050612d6f6000830184612d4b565b92915050565b612d7e8161283d565b8114612d8957600080fd5b50565b600081359050612d9b81612d75565b92915050565b60008060408385031215612db857612db76127ae565b5b6000612dc685828601612a2e565b9250506020612dd785828601612d8c565b9150509250929050565b600067ffffffffffffffff821115612dfc57612dfb612b47565b5b602082029050602081019050919050565b600080fd5b6000612e25612e2084612de1565b612ba7565b90508083825260208201905060208402830185811115612e4857612e47612e0d565b5b835b81811015612e715780612e5d8882612d09565b845260208401935050602081019050612e4a565b5050509392505050565b600082601f830112612e9057612e8f612b3d565b5b8135612ea0848260208601612e12565b91505092915050565b60008060408385031215612ec057612ebf6127ae565b5b6000612ece85828601612afb565b925050602083013567ffffffffffffffff811115612eef57612eee6127b3565b5b612efb85828601612e7b565b9150509250929050565b600067ffffffffffffffff821115612f2057612f1f612b47565b5b612f29826128f6565b9050602081019050919050565b6000612f49612f4484612f05565b612ba7565b905082815260208101848484011115612f6557612f64612b42565b5b612f70848285612bf3565b509392505050565b600082601f830112612f8d57612f8c612b3d565b5b8135612f9d848260208601612f36565b91505092915050565b60008060008060808587031215612fc057612fbf6127ae565b5b6000612fce87828801612a2e565b9450506020612fdf87828801612a2e565b9350506040612ff087828801612979565b925050606085013567ffffffffffffffff811115613011576130106127b3565b5b61301d87828801612f78565b91505092959194509250565b600080604083850312156130405761303f6127ae565b5b600061304e85828601612a2e565b925050602061305f85828601612a2e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806130b057607f821691505b602082108114156130c4576130c3613069565b5b50919050565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b6000613100600e836128b2565b915061310b826130ca565b602082019050919050565b6000602082019050818103600083015261312f816130f3565b9050919050565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b600061316c600a836128b2565b915061317782613136565b602082019050919050565b6000602082019050818103600083015261319b8161315f565b9050919050565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b60006131d86011836128b2565b91506131e3826131a2565b602082019050919050565b60006020820190508181036000830152613207816131cb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061324882612873565b915061325383612873565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132885761328761320e565b5b828201905092915050565b600061329e82612873565b91506132a983612873565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132e2576132e161320e565b5b828202905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133236020836128b2565b915061332e826132ed565b602082019050919050565b6000602082019050818103600083015261335281613316565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133c282612873565b91506133cd83612873565b9250826133dd576133dc613388565b5b828204905092915050565b60006133f382612873565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134265761342561320e565b5b600182019050919050565b600082825260208201905092915050565b50565b6000613452600083613431565b915061345d82613442565b600082019050919050565b600060808201905061347d60008301866129ed565b61348a60208301856129ed565b613497604083018461287d565b81810360608301526134a881613445565b9050949350505050565b6000815190506134c1816127e4565b92915050565b6000602082840312156134dd576134dc6127ae565b5b60006134eb848285016134b2565b91505092915050565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b600061352a6010836128b2565b9150613535826134f4565b602082019050919050565b600060208201905081810360008301526135598161351d565b9050919050565b600081519050919050565b600061357682613560565b6135808185613431565b93506135908185602086016128c3565b613599816128f6565b840191505092915050565b60006080820190506135b960008301876129ed565b6135c660208301866129ed565b6135d3604083018561287d565b81810360608301526135e5818461356b565b905095945050505050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461361d81613098565b61362781866135f0565b94506001821660008114613642576001811461365357613686565b60ff19831686528186019350613686565b61365c856135fb565b60005b8381101561367e5781548189015260018201915060208101905061365f565b838801955050505b50505092915050565b600061369a826128a7565b6136a481856135f0565b93506136b48185602086016128c3565b80840191505092915050565b60006136cc8286613610565b91506136d8828561368f565b91506136e48284613610565b9150819050949350505050565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b6000613727600e836128b2565b9150613732826136f1565b602082019050919050565b600060208201905081810360008301526137568161371a565b9050919050565b60008160601b9050919050565b60006137758261375d565b9050919050565b60006137878261376a565b9050919050565b61379f61379a826129db565b61377c565b82525050565b60006137b1828461378e565b60148201915081905092915050565b6000819050919050565b6137db6137d682612ce8565b6137c0565b82525050565b60006137ed82856137ca565b6020820191506137fd82846137ca565b6020820191508190509392505050565b600061381882612873565b915061382383612873565b9250828210156138365761383561320e565b5b828203905092915050565b600061384c82612873565b915061385783612873565b92508261386757613866613388565b5b82820690509291505056fea2646970667358221220eaa274d91fb76f502d21254f94a3b03fda734f4a8996120e843fbcd83aab23c964736f6c634300080a003300000000000000000000000000000000000000000000000000000000000000c00657b640d6221dcf61756c8a3c049416dbbfe43fcd2e03c7f1abfae400b7655f000000000000000000000000a07dae8b97e81446608876eafa76c77e10196a7c000000000000000000000000b92432b81e533c1cf8594f49a3f85656586a8b2f000000000000000000000000abeec041894dce885fdc04cbddecee09ce2c53c2000000000000000000000000264050256433fab3a38cddaa934847382f2c91b9000000000000000000000000000000000000000000000000000000000000004f68747470733a2f2f697066732e696f2f697066732f516d6147367176456b3339704648314562614e44745062794155584b3447546152505264477555346750637066482f68696464656e2e6a736f6e0000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061021a5760003560e01c806369eb16a311610123578063a9722cf3116100ab578063c87b56dd1161006f578063c87b56dd1461075d578063cd85cdb51461079a578063e985e9c5146107b1578063f2fde38b146107ee578063f96407fa146108175761021a565b8063a9722cf3146106ab578063b182e818146106d6578063b70196d7146106f2578063b88d4fde14610709578063c6682862146107325761021a565b80637cb64759116100f25780637cb64759146105c45780638da5cb5b14610601578063902d55a51461062c57806395d89b4114610657578063a22cb465146106825761021a565b806369eb16a31461051a5780636c0360eb1461054557806370a0823114610570578063715018a6146105ad5761021a565b806323cf0a22116101a657806342842e0e1161017557806342842e0e146104375780634c26124714610460578063518302271461048957806355f804b3146104b45780636352211e146104dd5761021a565b806323cf0a22146103c25780632be09561146103de5780632f0d3e20146103f55780633ccfd60b146104205761021a565b8063081812fc116101ed578063081812fc146102dd578063095ea7b31461031a57806318160ddd146103435780631cfddb1f1461036e57806323b872dd146103995761021a565b806301ffc9a71461021f57806303d8acef1461025c578063055ea1411461028757806306fdde03146102b2575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612810565b610842565b6040516102539190612858565b60405180910390f35b34801561026857600080fd5b50610271610904565b60405161027e919061288c565b60405180910390f35b34801561029357600080fd5b5061029c61090a565b6040516102a99190612940565b60405180910390f35b3480156102be57600080fd5b506102c7610998565b6040516102d49190612940565b60405180910390f35b3480156102e957600080fd5b5061030460048036038101906102ff919061298e565b610a26565b60405161031191906129fc565b60405180910390f35b34801561032657600080fd5b50610341600480360381019061033c9190612a43565b610a59565b005b34801561034f57600080fd5b50610358610c42565b604051610365919061288c565b60405180910390f35b34801561037a57600080fd5b50610383610c48565b6040516103909190612858565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb9190612a83565b610c5b565b005b6103dc60048036038101906103d79190612b10565b61105b565b005b3480156103ea57600080fd5b506103f36111c3565b005b34801561040157600080fd5b5061040a61126e565b604051610417919061288c565b60405180910390f35b34801561042c57600080fd5b50610435611279565b005b34801561044357600080fd5b5061045e60048036038101906104599190612a83565b611472565b005b34801561046c57600080fd5b5061048760048036038101906104829190612c72565b6115aa565b005b34801561049557600080fd5b5061049e61165f565b6040516104ab9190612858565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190612c72565b611672565b005b3480156104e957600080fd5b5061050460048036038101906104ff919061298e565b61171a565b60405161051191906129fc565b60405180910390f35b34801561052657600080fd5b5061052f61174d565b60405161053c919061288c565b60405180910390f35b34801561055157600080fd5b5061055a611758565b6040516105679190612940565b60405180910390f35b34801561057c57600080fd5b5061059760048036038101906105929190612cbb565b6117e6565b6040516105a4919061288c565b60405180910390f35b3480156105b957600080fd5b506105c26117fe565b005b3480156105d057600080fd5b506105eb60048036038101906105e69190612d1e565b6118c6565b6040516105f89190612d5a565b60405180910390f35b34801561060d57600080fd5b50610616611968565b60405161062391906129fc565b60405180910390f35b34801561063857600080fd5b50610641611991565b60405161064e919061288c565b60405180910390f35b34801561066357600080fd5b5061066c611997565b6040516106799190612940565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a49190612da1565b611a25565b005b3480156106b757600080fd5b506106c0611b22565b6040516106cd9190612858565b60405180910390f35b6106f060048036038101906106eb9190612ea9565b611b35565b005b3480156106fe57600080fd5b50610707611cee565b005b34801561071557600080fd5b50610730600480360381019061072b9190612fa6565b611d99565b005b34801561073e57600080fd5b50610747611ed4565b6040516107549190612940565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f919061298e565b611f62565b6040516107919190612940565b60405180910390f35b3480156107a657600080fd5b506107af6120e2565b005b3480156107bd57600080fd5b506107d860048036038101906107d39190613029565b6121a8565b6040516107e59190612858565b60405180910390f35b3480156107fa57600080fd5b5061081560048036038101906108109190612cbb565b6121d7565b005b34801561082357600080fd5b5061082c61229f565b604051610839919061288c565b60405180910390f35b6000637f5828d060e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108cd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108fd57506301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60085481565b600d805461091790613098565b80601f016020809104026020016040519081016040528092919081815260200182805461094390613098565b80156109905780601f1061096557610100808354040283529160200191610990565b820191906000526020600020905b81548152906001019060200180831161097357829003601f168201915b505050505081565b600180546109a590613098565b80601f01602080910402602001604051908101604052809291908181526020018280546109d190613098565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505081565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b515750600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8790613116565b60405180910390fd5b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600a5481565b600960009054906101000a900460ff1681565b6004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf390613182565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d63906131ee565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e0457506005600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610e955750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb90613116565b60405180910390fd5b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e618161ffff16600a54611070919061323d565b11156110a8576040517f7364ba1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600960019054906101000a900460ff166110ee576040517f06290e4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b66f52322698080008161ffff166111059190613293565b34101561113e576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008548161ffff16111561117e576040517f9defc75000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8161ffff168161ffff1610156111bf576111a0336001600a54016122a5565b600a600081548092919060010191905055508080600101915050611181565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124890613339565b60405180910390fd5b6001600960016101000a81548160ff021916908315150217905550565b66f523226980800081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe90613339565b60405180910390fd5b6000471415611342576040517f2313b4b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600047905060005b600481101561146e57600f816004811061136757611366613359565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc60136000600f85600481106113ba576113b9613359565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546103e88561142591906133b7565b61142f9190613293565b9081150290604051600060405180830381858888f1935050505015801561145a573d6000803e3d6000fd5b508080611466906133e8565b91505061134a565b5050565b61147d838383610c5b565b60008273ffffffffffffffffffffffffffffffffffffffff163b1480611566575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161150293929190613468565b6020604051808303816000875af1158015611521573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154591906134c7565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b6115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c90613540565b60405180910390fd5b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90613339565b60405180910390fd5b61164181611672565b6001600960026101000a81548160ff02191690831515021790555050565b600960029054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790613339565b60405180910390fd5b80600c9080519060200190611716929190612701565b5050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b66b1a2bc2ec5000081565b600c805461176590613098565b80601f016020809104026020016040519081016040528092919081815260200182805461179190613098565b80156117de5780601f106117b3576101008083540402835291602001916117de565b820191906000526020600020905b8154815290600101906020018083116117c157829003601f168201915b505050505081565b60036020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611883576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194e90613339565b60405180910390fd5b81600b81905550600b549050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e6181565b600280546119a490613098565b80601f01602080910402602001604051908101604052809291908181526020018280546119d090613098565b8015611a1d5780601f106119f257610100808354040283529160200191611a1d565b820191906000526020600020905b815481529060010190602001808311611a0057829003601f168201915b505050505081565b80600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b169190612858565b60405180910390a35050565b600960019054906101000a900460ff1681565b611e618261ffff16600a54611b4a919061323d565b1115611b82576040517f7364ba1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600960009054906101000a900460ff16611bc8576040517fef4604b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b66b1a2bc2ec500008261ffff16611bdf9190613293565b341015611c18576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007548261ffff161115611c58576040517f9defc75000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515611c6e611c68336124b8565b836124e8565b15151415611ca8576040517f522fc3bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8261ffff168161ffff161015611ce957611cca336001600a54016122a5565b600a600081548092919060010191905055508080600101915050611cab565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390613339565b60405180910390fd5b6001600960006101000a81548160ff021916908315150217905550565b611da4848484610c5b565b60008373ffffffffffffffffffffffffffffffffffffffff163b1480611e8f575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b8152600401611e2b94939291906135a4565b6020604051808303816000875af1158015611e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6e91906134c7565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec590613540565b60405180910390fd5b50505050565b600e8054611ee190613098565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0d90613098565b8015611f5a5780601f10611f2f57610100808354040283529160200191611f5a565b820191906000526020600020905b815481529060010190602001808311611f3d57829003601f168201915b505050505081565b6060600073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ffe576040517fb0ce759100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600960029054906101000a900460ff16151514156120ac57600d805461202790613098565b80601f016020809104026020016040519081016040528092919081815260200182805461205390613098565b80156120a05780601f10612075576101008083540402835291602001916120a0565b820191906000526020600020905b81548152906001019060200180831161208357829003601f168201915b505050505090506120dd565b600c6120b7836125a0565b600e6040516020016120cb939291906136c0565b60405160208183030381529060405290505b919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216790613339565b60405180910390fd5b6000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff021916908315150217905550565b60066020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461225c576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075481565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230c906131ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ae9061373d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000816040516020016124cb91906137a5565b604051602081830303815290604052805190602001209050919050565b60008083905060005b835181101561259157600084828151811061250f5761250e613359565b5b60200260200101519050808310156125515782816040516020016125349291906137e1565b60405160208183030381529060405280519060200120925061257d565b80836040516020016125649291906137e1565b6040516020818303038152906040528051906020012092505b508080612589906133e8565b9150506124f1565b50600b54811491505092915050565b606060008214156125e8576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126fc565b600082905060005b6000821461261a578080612603906133e8565b915050600a8261261391906133b7565b91506125f0565b60008167ffffffffffffffff81111561263657612635612b47565b5b6040519080825280601f01601f1916602001820160405280156126685781602001600182028036833780820191505090505b5090505b600085146126f557600182612681919061380d565b9150600a856126909190613841565b603061269c919061323d565b60f81b8183815181106126b2576126b1613359565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126ee91906133b7565b945061266c565b8093505050505b919050565b82805461270d90613098565b90600052602060002090601f01602090048101928261272f5760008555612776565b82601f1061274857805160ff1916838001178555612776565b82800160010185558215612776579182015b8281111561277557825182559160200191906001019061275a565b5b5090506127839190612787565b5090565b5b808211156127a0576000816000905550600101612788565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127ed816127b8565b81146127f857600080fd5b50565b60008135905061280a816127e4565b92915050565b600060208284031215612826576128256127ae565b5b6000612834848285016127fb565b91505092915050565b60008115159050919050565b6128528161283d565b82525050565b600060208201905061286d6000830184612849565b92915050565b6000819050919050565b61288681612873565b82525050565b60006020820190506128a1600083018461287d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128e15780820151818401526020810190506128c6565b838111156128f0576000848401525b50505050565b6000601f19601f8301169050919050565b6000612912826128a7565b61291c81856128b2565b935061292c8185602086016128c3565b612935816128f6565b840191505092915050565b6000602082019050818103600083015261295a8184612907565b905092915050565b61296b81612873565b811461297657600080fd5b50565b60008135905061298881612962565b92915050565b6000602082840312156129a4576129a36127ae565b5b60006129b284828501612979565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129e6826129bb565b9050919050565b6129f6816129db565b82525050565b6000602082019050612a1160008301846129ed565b92915050565b612a20816129db565b8114612a2b57600080fd5b50565b600081359050612a3d81612a17565b92915050565b60008060408385031215612a5a57612a596127ae565b5b6000612a6885828601612a2e565b9250506020612a7985828601612979565b9150509250929050565b600080600060608486031215612a9c57612a9b6127ae565b5b6000612aaa86828701612a2e565b9350506020612abb86828701612a2e565b9250506040612acc86828701612979565b9150509250925092565b600061ffff82169050919050565b612aed81612ad6565b8114612af857600080fd5b50565b600081359050612b0a81612ae4565b92915050565b600060208284031215612b2657612b256127ae565b5b6000612b3484828501612afb565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b7f826128f6565b810181811067ffffffffffffffff82111715612b9e57612b9d612b47565b5b80604052505050565b6000612bb16127a4565b9050612bbd8282612b76565b919050565b600067ffffffffffffffff821115612bdd57612bdc612b47565b5b612be6826128f6565b9050602081019050919050565b82818337600083830152505050565b6000612c15612c1084612bc2565b612ba7565b905082815260208101848484011115612c3157612c30612b42565b5b612c3c848285612bf3565b509392505050565b600082601f830112612c5957612c58612b3d565b5b8135612c69848260208601612c02565b91505092915050565b600060208284031215612c8857612c876127ae565b5b600082013567ffffffffffffffff811115612ca657612ca56127b3565b5b612cb284828501612c44565b91505092915050565b600060208284031215612cd157612cd06127ae565b5b6000612cdf84828501612a2e565b91505092915050565b6000819050919050565b612cfb81612ce8565b8114612d0657600080fd5b50565b600081359050612d1881612cf2565b92915050565b600060208284031215612d3457612d336127ae565b5b6000612d4284828501612d09565b91505092915050565b612d5481612ce8565b82525050565b6000602082019050612d6f6000830184612d4b565b92915050565b612d7e8161283d565b8114612d8957600080fd5b50565b600081359050612d9b81612d75565b92915050565b60008060408385031215612db857612db76127ae565b5b6000612dc685828601612a2e565b9250506020612dd785828601612d8c565b9150509250929050565b600067ffffffffffffffff821115612dfc57612dfb612b47565b5b602082029050602081019050919050565b600080fd5b6000612e25612e2084612de1565b612ba7565b90508083825260208201905060208402830185811115612e4857612e47612e0d565b5b835b81811015612e715780612e5d8882612d09565b845260208401935050602081019050612e4a565b5050509392505050565b600082601f830112612e9057612e8f612b3d565b5b8135612ea0848260208601612e12565b91505092915050565b60008060408385031215612ec057612ebf6127ae565b5b6000612ece85828601612afb565b925050602083013567ffffffffffffffff811115612eef57612eee6127b3565b5b612efb85828601612e7b565b9150509250929050565b600067ffffffffffffffff821115612f2057612f1f612b47565b5b612f29826128f6565b9050602081019050919050565b6000612f49612f4484612f05565b612ba7565b905082815260208101848484011115612f6557612f64612b42565b5b612f70848285612bf3565b509392505050565b600082601f830112612f8d57612f8c612b3d565b5b8135612f9d848260208601612f36565b91505092915050565b60008060008060808587031215612fc057612fbf6127ae565b5b6000612fce87828801612a2e565b9450506020612fdf87828801612a2e565b9350506040612ff087828801612979565b925050606085013567ffffffffffffffff811115613011576130106127b3565b5b61301d87828801612f78565b91505092959194509250565b600080604083850312156130405761303f6127ae565b5b600061304e85828601612a2e565b925050602061305f85828601612a2e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806130b057607f821691505b602082108114156130c4576130c3613069565b5b50919050565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b6000613100600e836128b2565b915061310b826130ca565b602082019050919050565b6000602082019050818103600083015261312f816130f3565b9050919050565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b600061316c600a836128b2565b915061317782613136565b602082019050919050565b6000602082019050818103600083015261319b8161315f565b9050919050565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b60006131d86011836128b2565b91506131e3826131a2565b602082019050919050565b60006020820190508181036000830152613207816131cb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061324882612873565b915061325383612873565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132885761328761320e565b5b828201905092915050565b600061329e82612873565b91506132a983612873565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132e2576132e161320e565b5b828202905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133236020836128b2565b915061332e826132ed565b602082019050919050565b6000602082019050818103600083015261335281613316565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133c282612873565b91506133cd83612873565b9250826133dd576133dc613388565b5b828204905092915050565b60006133f382612873565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134265761342561320e565b5b600182019050919050565b600082825260208201905092915050565b50565b6000613452600083613431565b915061345d82613442565b600082019050919050565b600060808201905061347d60008301866129ed565b61348a60208301856129ed565b613497604083018461287d565b81810360608301526134a881613445565b9050949350505050565b6000815190506134c1816127e4565b92915050565b6000602082840312156134dd576134dc6127ae565b5b60006134eb848285016134b2565b91505092915050565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b600061352a6010836128b2565b9150613535826134f4565b602082019050919050565b600060208201905081810360008301526135598161351d565b9050919050565b600081519050919050565b600061357682613560565b6135808185613431565b93506135908185602086016128c3565b613599816128f6565b840191505092915050565b60006080820190506135b960008301876129ed565b6135c660208301866129ed565b6135d3604083018561287d565b81810360608301526135e5818461356b565b905095945050505050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461361d81613098565b61362781866135f0565b94506001821660008114613642576001811461365357613686565b60ff19831686528186019350613686565b61365c856135fb565b60005b8381101561367e5781548189015260018201915060208101905061365f565b838801955050505b50505092915050565b600061369a826128a7565b6136a481856135f0565b93506136b48185602086016128c3565b80840191505092915050565b60006136cc8286613610565b91506136d8828561368f565b91506136e48284613610565b9150819050949350505050565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b6000613727600e836128b2565b9150613732826136f1565b602082019050919050565b600060208201905081810360008301526137568161371a565b9050919050565b60008160601b9050919050565b60006137758261375d565b9050919050565b60006137878261376a565b9050919050565b61379f61379a826129db565b61377c565b82525050565b60006137b1828461378e565b60148201915081905092915050565b6000819050919050565b6137db6137d682612ce8565b6137c0565b82525050565b60006137ed82856137ca565b6020820191506137fd82846137ca565b6020820191508190509392505050565b600061381882612873565b915061382383612873565b9250828210156138365761383561320e565b5b828203905092915050565b600061384c82612873565b915061385783612873565b92508261386757613866613388565b5b82820690509291505056fea2646970667358221220eaa274d91fb76f502d21254f94a3b03fda734f4a8996120e843fbcd83aab23c964736f6c634300080a0033

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

00000000000000000000000000000000000000000000000000000000000000c00657b640d6221dcf61756c8a3c049416dbbfe43fcd2e03c7f1abfae400b7655f000000000000000000000000a07dae8b97e81446608876eafa76c77e10196a7c000000000000000000000000b92432b81e533c1cf8594f49a3f85656586a8b2f000000000000000000000000abeec041894dce885fdc04cbddecee09ce2c53c2000000000000000000000000264050256433fab3a38cddaa934847382f2c91b9000000000000000000000000000000000000000000000000000000000000004f68747470733a2f2f697066732e696f2f697066732f516d6147367176456b3339704648314562614e44745062794155584b3447546152505264477555346750637066482f68696464656e2e6a736f6e0000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _nonRevealedURI (string): https://ipfs.io/ipfs/QmaG6qvEk39pFH1EbaNDtPbyAUXK4GTaRPRdGuU4gPcpfH/hidden.json
Arg [1] : _initMerkleRoot (bytes32): 0x0657b640d6221dcf61756c8a3c049416dbbfe43fcd2e03c7f1abfae400b7655f
Arg [2] : _contributorAddresses (address[4]): 0xa07dAe8B97e81446608876EAFA76c77e10196a7C,0xb92432b81E533c1Cf8594f49a3F85656586a8b2f,0xAbEec041894DCE885fdc04cbDDecEE09CE2C53c2,0x264050256433fab3a38CDdAA934847382f2C91b9

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0657b640d6221dcf61756c8a3c049416dbbfe43fcd2e03c7f1abfae400b7655f
Arg [2] : 000000000000000000000000a07dae8b97e81446608876eafa76c77e10196a7c
Arg [3] : 000000000000000000000000b92432b81e533c1cf8594f49a3f85656586a8b2f
Arg [4] : 000000000000000000000000abeec041894dce885fdc04cbddecee09ce2c53c2
Arg [5] : 000000000000000000000000264050256433fab3a38cddaa934847382f2c91b9
Arg [6] : 000000000000000000000000000000000000000000000000000000000000004f
Arg [7] : 68747470733a2f2f697066732e696f2f697066732f516d6147367176456b3339
Arg [8] : 704648314562614e44745062794155584b344754615250526447755534675063
Arg [9] : 7066482f68696464656e2e6a736f6e0000000000000000000000000000000000


Deployed Bytecode Sourcemap

28851:6230:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34600:478;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29170:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29439:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2724:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3177:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3804:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29340:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29218:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4316:764;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31861:527;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33631:75;;;;;;;;;;;;;:::i;:::-;;29055:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34139:380;;;;;;;;;;;;;:::i;:::-;;5088:409;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33837:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29303:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33414:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3126:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28987:61;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29411:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3073:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;570:130;;;;;;;;;;;;;:::i;:::-;;33967:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;325:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28937:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2751:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4101:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29265:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32396:684;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33526:93;;;;;;;;;;;;;:::i;:::-;;5505:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29474:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33088:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33714:115;;;;;;;;;;;;;:::i;:::-;;3232:68;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;414:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29121:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34600:478;34733:4;34790:10;34775:25;;:11;:25;;;;:101;;;;34866:10;34851:25;;:11;:25;;;;34775:101;:177;;;;34942:10;34927:25;;:11;:25;;;;34775:177;:253;;;;35018:10;35003:25;;:11;:25;;;;34775:253;34755:273;;34600:478;;;:::o;29170:39::-;;;;:::o;29439:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2724:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3177:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;3804:289::-;3876:13;3892:7;:11;3900:2;3892:11;;;;;;;;;;;;;;;;;;;;;3876:27;;3938:5;3924:19;;:10;:19;;;:58;;;;3947:16;:23;3964:5;3947:23;;;;;;;;;;;;;;;:35;3971:10;3947:35;;;;;;;;;;;;;;;;;;;;;;;;;3924:58;3916:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;4032:7;4014:11;:15;4026:2;4014:15;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;4082:2;4073:7;4057:28;;4066:5;4057:28;;;;;;;;;;;;3865:228;3804:289;;:::o;29340:26::-;;;;:::o;29218:40::-;;;;;;;;;;;;;:::o;4316:764::-;4452:7;:11;4460:2;4452:11;;;;;;;;;;;;;;;;;;;;;4444:19;;:4;:19;;;4436:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4513:1;4499:16;;:2;:16;;;;4491:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4586:4;4572:18;;:10;:18;;;:51;;;;4608:11;:15;4620:2;4608:15;;;;;;;;;;;;;;;;;;;;;4594:29;;:10;:29;;;4572:51;:89;;;;4627:16;:22;4644:4;4627:22;;;;;;;;;;;;;;;:34;4650:10;4627:34;;;;;;;;;;;;;;;;;;;;;;;;;4572:89;4550:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;4908:9;:15;4918:4;4908:15;;;;;;;;;;;;;;;;:17;;;;;;;;;;;;;;4942:9;:13;4952:2;4942:13;;;;;;;;;;;;;;;;:15;;;;;;;;;;;;;4995:2;4981:7;:11;4989:2;4981:11;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;5017:11;:15;5029:2;5017:15;;;;;;;;;;;;5010:22;;;;;;;;;;;5069:2;5065;5050:22;;5059:4;5050:22;;;;;;;;;;;;4316:764;;;:::o;31861:527::-;28976:4;31936:6;31922:20;;:11;;:20;;;;:::i;:::-;:35;31918:62;;;31966:14;;;;;;;;;;;;;;31918:62;31996:11;;;;;;;;;;;31991:41;;32016:16;;;;;;;;;;;;;;31991:41;29103:11;32059:6;:30;;;;;;:::i;:::-;32047:9;:42;32043:69;;;32098:14;;;;;;;;;;;;;;32043:69;32136:19;;32127:6;:28;;;32123:60;;;32164:19;;;;;;;;;;;;;;32123:60;32226:12;32221:149;32252:6;32244:14;;:5;:14;;;32221:149;;;32288:34;32294:10;32320:1;32306:11;;:15;32288:5;:34::i;:::-;32341:11;;:13;;;;;;;;;;;;;32260:7;;;;;;;32221:149;;;;31861:527;:::o;33631:75::-;30542:6;;;;;;;;;;30528:20;;:10;:20;;;30520:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33694:4:::1;33680:11;;:18;;;;;;;;;;;;;;;;;;33631:75::o:0;29055:59::-;29103:11;29055:59;:::o;34139:380::-;30542:6;;;;;;;;;;30528:20;;:10;:20;;;30520:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34218:1:::1;34193:21;:26;34189:53;;;34228:14;;;;;;;;;;;;;;34189:53;34253:15;34271:21;34253:39;;34310:9;34305:207;34329:24;34325:1;:28;34305:207;;;34383:17;34401:1;34383:20;;;;;;;:::i;:::-;;;;;;;;;;;;;34375:38;;:125;34449:14;:36;34464:17;34482:1;34464:20;;;;;;;:::i;:::-;;;;;;;;;;;;;34449:36;;;;;;;;;;;;;;;;34442:4;34432:7;:14;;;;:::i;:::-;:53;;;;:::i;:::-;34375:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;34355:3;;;;;:::i;:::-;;;;34305:207;;;;34178:341;34139:380::o:0;5088:409::-;5212:26;5225:4;5231:2;5235;5212:12;:26::i;:::-;5291:1;5273:2;:14;;;:19;:172;;;;5400:45;;;5313:132;;;5333:2;5313:40;;;5354:10;5366:4;5372:2;5313:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:132;;;;5273:172;5251:238;;;;;;;;;;;;:::i;:::-;;;;;;;;;5088:409;;;:::o;33837:122::-;30542:6;;;;;;;;;;30528:20;;:10;:20;;;30520:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33905:20:::1;33916:8;33905:10;:20::i;:::-;33947:4;33936:8;;:15;;;;;;;;;;;;;;;;;;33837:122:::0;:::o;29303:28::-;;;;;;;;;;;;;:::o;33414:104::-;30542:6;;;;;;;;;;30528:20;;:10;:20;;;30520:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33499:11:::1;33489:7;:21;;;;;;;;;;;;:::i;:::-;;33414:104:::0;:::o;3126:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;28987:61::-;29038:10;28987:61;:::o;29411:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3073:44::-;;;;;;;;;;;;;;;;;:::o;570:130::-;635:6;;;;;;;;;;621:20;;:10;:20;;;617:43;;650:10;;;;;;;;;;;;;;617:43;690:1;673:6;;:19;;;;;;;;;;;;;;;;;;570:130::o;33967:164::-;34044:7;30542:6;;;;;;;;;;;30528:20;;:10;:20;;;30520:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34078:16:::1;34064:11;:30;;;;34112:11;;34105:18;;33967:164:::0;;;:::o;325:81::-;365:7;392:6;;;;;;;;;;;385:13;;325:81;:::o;28937:43::-;28976:4;28937:43;:::o;2751:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4101:207::-;4228:8;4187:16;:28;4204:10;4187:28;;;;;;;;;;;;;;;:38;4216:8;4187:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;4281:8;4254:46;;4269:10;4254:46;;;4291:8;4254:46;;;;;;:::i;:::-;;;;;;;;4101:207;;:::o;29265:31::-;;;;;;;;;;;;;:::o;32396:684::-;28976:4;32505:6;32491:20;;:11;;:20;;;;:::i;:::-;:35;32487:62;;;32535:14;;;;;;;;;;;;;;32487:62;32565:20;;;;;;;;;;;32560:59;;32594:25;;;;;;;;;;;;;;32560:59;29038:10;32646:6;:33;;;;;;:::i;:::-;32634:9;:45;32630:72;;;32688:14;;;;;;;;;;;;;;32630:72;32726:22;;32717:6;:31;;;32713:63;;;32757:19;;;;;;;;;;;;;;32713:63;32837:5;32791:51;;:42;32807:17;32813:10;32807:5;:17::i;:::-;32826:6;32791:15;:42::i;:::-;:51;;;32787:80;;;32851:16;;;;;;;;;;;;;;32787:80;32918:12;32913:149;32944:6;32936:14;;:5;:14;;;32913:149;;;32980:34;32986:10;33012:1;32998:11;;:15;32980:5;:34::i;:::-;33033:11;;:13;;;;;;;;;;;;;32952:7;;;;;;;32913:149;;;;32396:684;;:::o;33526:93::-;30542:6;;;;;;;;;;30528:20;;:10;:20;;;30520:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33607:4:::1;33584:20;;:27;;;;;;;;;;;;;;;;;;33526:93::o:0;5505:439::-;5657:26;5670:4;5676:2;5680;5657:12;:26::i;:::-;5736:1;5718:2;:14;;;:19;:174;;;;5847:45;;;5758:134;;;5778:2;5758:40;;;5799:10;5811:4;5817:2;5821:4;5758:68;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:134;;;;5718:174;5696:240;;;;;;;;;;;;:::i;:::-;;;;;;;;;5505:439;;;;:::o;29474:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33088:318::-;33156:13;33209:1;33186:25;;:7;:11;33194:2;33186:11;;;;;;;;;;;;;;;;;;;;;:25;;;33182:52;;;33220:14;;;;;;;;;;;;;;33182:52;33263:5;33251:17;;:8;;;;;;;;;;;:17;;;33247:71;;;33292:14;33285:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33247:71;33359:7;33368:13;:2;:11;:13::i;:::-;33383;33342:55;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33328:70;;33088:318;;;;:::o;33714:115::-;30542:6;;;;;;;;;;30528:20;;:10;:20;;;30520:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33786:5:::1;33763:20;;:28;;;;;;;;;;;;;;;;;;33816:5;33802:11;;:19;;;;;;;;;;;;;;;;;;33714:115::o:0;3232:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;414:148::-;498:6;;;;;;;;;;484:20;;:10;:20;;;480:43;;513:10;;;;;;;;;;;;;;480:43;545:9;536:6;;:18;;;;;;;;;;;;;;;;;;414:148;:::o;29121:42::-;;;;:::o;6679:381::-;6768:1;6754:16;;:2;:16;;;;6746:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;6836:1;6813:25;;:7;:11;6821:2;6813:11;;;;;;;;;;;;;;;;;;;;;:25;;;6805:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;6951:9;:13;6961:2;6951:13;;;;;;;;;;;;;;;;:15;;;;;;;;;;;;;7004:2;6990:7;:11;6998:2;6990:11;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;7049:2;7045;7024:28;;7041:1;7024:28;;;;;;;;;;;;6679:381;;:::o;30800:125::-;30854:7;30908;30891:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;30881:36;;;;;;30874:43;;30800:125;;;:::o;31179:674::-;31291:4;31313:20;31336:4;31313:27;;31358:9;31353:446;31377:5;:12;31373:1;:16;31353:446;;;31411:20;31434:5;31440:1;31434:8;;;;;;;;:::i;:::-;;;;;;;;31411:31;;31478:12;31463;:27;31459:329;;;31575:12;31589;31558:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31526:95;;;;;;31511:110;;31459:329;;;31726:12;31740;31709:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31677:95;;;;;;31662:110;;31459:329;31396:403;31391:3;;;;;:::i;:::-;;;;31353:446;;;;31834:11;;31818:12;:27;31811:34;;;31179:674;;;;:::o;1046:723::-;1102:13;1332:1;1323:5;:10;1319:53;;;1350:10;;;;;;;;;;;;;;;;;;;;;1319:53;1382:12;1397:5;1382:20;;1413:14;1438:78;1453:1;1445:4;:9;1438:78;;1471:8;;;;;:::i;:::-;;;;1502:2;1494:10;;;;;:::i;:::-;;;1438:78;;;1526:19;1558:6;1548:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1526:39;;1576:154;1592:1;1583:5;:10;1576:154;;1620:1;1610:11;;;;;:::i;:::-;;;1687:2;1679:5;:10;;;;:::i;:::-;1666:2;:24;;;;:::i;:::-;1653:39;;1636:6;1643;1636:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1716:2;1707:11;;;;;:::i;:::-;;;1576:154;;;1754:6;1740:21;;;;;1046:723;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:89::-;5951:7;5991:6;5984:5;5980:18;5969:29;;5915:89;;;:::o;6010:120::-;6082:23;6099:5;6082:23;:::i;:::-;6075:5;6072:34;6062:62;;6120:1;6117;6110:12;6062:62;6010:120;:::o;6136:137::-;6181:5;6219:6;6206:20;6197:29;;6235:32;6261:5;6235:32;:::i;:::-;6136:137;;;;:::o;6279:327::-;6337:6;6386:2;6374:9;6365:7;6361:23;6357:32;6354:119;;;6392:79;;:::i;:::-;6354:119;6512:1;6537:52;6581:7;6572:6;6561:9;6557:22;6537:52;:::i;:::-;6527:62;;6483:116;6279:327;;;;:::o;6612:117::-;6721:1;6718;6711:12;6735:117;6844:1;6841;6834:12;6858:180;6906:77;6903:1;6896:88;7003:4;7000:1;6993:15;7027:4;7024:1;7017:15;7044:281;7127:27;7149:4;7127:27;:::i;:::-;7119:6;7115:40;7257:6;7245:10;7242:22;7221:18;7209:10;7206:34;7203:62;7200:88;;;7268:18;;:::i;:::-;7200:88;7308:10;7304:2;7297:22;7087:238;7044:281;;:::o;7331:129::-;7365:6;7392:20;;:::i;:::-;7382:30;;7421:33;7449:4;7441:6;7421:33;:::i;:::-;7331:129;;;:::o;7466:308::-;7528:4;7618:18;7610:6;7607:30;7604:56;;;7640:18;;:::i;:::-;7604:56;7678:29;7700:6;7678:29;:::i;:::-;7670:37;;7762:4;7756;7752:15;7744:23;;7466:308;;;:::o;7780:154::-;7864:6;7859:3;7854;7841:30;7926:1;7917:6;7912:3;7908:16;7901:27;7780:154;;;:::o;7940:412::-;8018:5;8043:66;8059:49;8101:6;8059:49;:::i;:::-;8043:66;:::i;:::-;8034:75;;8132:6;8125:5;8118:21;8170:4;8163:5;8159:16;8208:3;8199:6;8194:3;8190:16;8187:25;8184:112;;;8215:79;;:::i;:::-;8184:112;8305:41;8339:6;8334:3;8329;8305:41;:::i;:::-;8024:328;7940:412;;;;;:::o;8372:340::-;8428:5;8477:3;8470:4;8462:6;8458:17;8454:27;8444:122;;8485:79;;:::i;:::-;8444:122;8602:6;8589:20;8627:79;8702:3;8694:6;8687:4;8679:6;8675:17;8627:79;:::i;:::-;8618:88;;8434:278;8372:340;;;;:::o;8718:509::-;8787:6;8836:2;8824:9;8815:7;8811:23;8807:32;8804:119;;;8842:79;;:::i;:::-;8804:119;8990:1;8979:9;8975:17;8962:31;9020:18;9012:6;9009:30;9006:117;;;9042:79;;:::i;:::-;9006:117;9147:63;9202:7;9193:6;9182:9;9178:22;9147:63;:::i;:::-;9137:73;;8933:287;8718:509;;;;:::o;9233:329::-;9292:6;9341:2;9329:9;9320:7;9316:23;9312:32;9309:119;;;9347:79;;:::i;:::-;9309:119;9467:1;9492:53;9537:7;9528:6;9517:9;9513:22;9492:53;:::i;:::-;9482:63;;9438:117;9233:329;;;;:::o;9568:77::-;9605:7;9634:5;9623:16;;9568:77;;;:::o;9651:122::-;9724:24;9742:5;9724:24;:::i;:::-;9717:5;9714:35;9704:63;;9763:1;9760;9753:12;9704:63;9651:122;:::o;9779:139::-;9825:5;9863:6;9850:20;9841:29;;9879:33;9906:5;9879:33;:::i;:::-;9779:139;;;;:::o;9924:329::-;9983:6;10032:2;10020:9;10011:7;10007:23;10003:32;10000:119;;;10038:79;;:::i;:::-;10000:119;10158:1;10183:53;10228:7;10219:6;10208:9;10204:22;10183:53;:::i;:::-;10173:63;;10129:117;9924:329;;;;:::o;10259:118::-;10346:24;10364:5;10346:24;:::i;:::-;10341:3;10334:37;10259:118;;:::o;10383:222::-;10476:4;10514:2;10503:9;10499:18;10491:26;;10527:71;10595:1;10584:9;10580:17;10571:6;10527:71;:::i;:::-;10383:222;;;;:::o;10611:116::-;10681:21;10696:5;10681:21;:::i;:::-;10674:5;10671:32;10661:60;;10717:1;10714;10707:12;10661:60;10611:116;:::o;10733:133::-;10776:5;10814:6;10801:20;10792:29;;10830:30;10854:5;10830:30;:::i;:::-;10733:133;;;;:::o;10872:468::-;10937:6;10945;10994:2;10982:9;10973:7;10969:23;10965:32;10962:119;;;11000:79;;:::i;:::-;10962:119;11120:1;11145:53;11190:7;11181:6;11170:9;11166:22;11145:53;:::i;:::-;11135:63;;11091:117;11247:2;11273:50;11315:7;11306:6;11295:9;11291:22;11273:50;:::i;:::-;11263:60;;11218:115;10872:468;;;;;:::o;11346:311::-;11423:4;11513:18;11505:6;11502:30;11499:56;;;11535:18;;:::i;:::-;11499:56;11585:4;11577:6;11573:17;11565:25;;11645:4;11639;11635:15;11627:23;;11346:311;;;:::o;11663:117::-;11772:1;11769;11762:12;11803:710;11899:5;11924:81;11940:64;11997:6;11940:64;:::i;:::-;11924:81;:::i;:::-;11915:90;;12025:5;12054:6;12047:5;12040:21;12088:4;12081:5;12077:16;12070:23;;12141:4;12133:6;12129:17;12121:6;12117:30;12170:3;12162:6;12159:15;12156:122;;;12189:79;;:::i;:::-;12156:122;12304:6;12287:220;12321:6;12316:3;12313:15;12287:220;;;12396:3;12425:37;12458:3;12446:10;12425:37;:::i;:::-;12420:3;12413:50;12492:4;12487:3;12483:14;12476:21;;12363:144;12347:4;12342:3;12338:14;12331:21;;12287:220;;;12291:21;11905:608;;11803:710;;;;;:::o;12536:370::-;12607:5;12656:3;12649:4;12641:6;12637:17;12633:27;12623:122;;12664:79;;:::i;:::-;12623:122;12781:6;12768:20;12806:94;12896:3;12888:6;12881:4;12873:6;12869:17;12806:94;:::i;:::-;12797:103;;12613:293;12536:370;;;;:::o;12912:682::-;13004:6;13012;13061:2;13049:9;13040:7;13036:23;13032:32;13029:119;;;13067:79;;:::i;:::-;13029:119;13187:1;13212:52;13256:7;13247:6;13236:9;13232:22;13212:52;:::i;:::-;13202:62;;13158:116;13341:2;13330:9;13326:18;13313:32;13372:18;13364:6;13361:30;13358:117;;;13394:79;;:::i;:::-;13358:117;13499:78;13569:7;13560:6;13549:9;13545:22;13499:78;:::i;:::-;13489:88;;13284:303;12912:682;;;;;:::o;13600:307::-;13661:4;13751:18;13743:6;13740:30;13737:56;;;13773:18;;:::i;:::-;13737:56;13811:29;13833:6;13811:29;:::i;:::-;13803:37;;13895:4;13889;13885:15;13877:23;;13600:307;;;:::o;13913:410::-;13990:5;14015:65;14031:48;14072:6;14031:48;:::i;:::-;14015:65;:::i;:::-;14006:74;;14103:6;14096:5;14089:21;14141:4;14134:5;14130:16;14179:3;14170:6;14165:3;14161:16;14158:25;14155:112;;;14186:79;;:::i;:::-;14155:112;14276:41;14310:6;14305:3;14300;14276:41;:::i;:::-;13996:327;13913:410;;;;;:::o;14342:338::-;14397:5;14446:3;14439:4;14431:6;14427:17;14423:27;14413:122;;14454:79;;:::i;:::-;14413:122;14571:6;14558:20;14596:78;14670:3;14662:6;14655:4;14647:6;14643:17;14596:78;:::i;:::-;14587:87;;14403:277;14342:338;;;;:::o;14686:943::-;14781:6;14789;14797;14805;14854:3;14842:9;14833:7;14829:23;14825:33;14822:120;;;14861:79;;:::i;:::-;14822:120;14981:1;15006:53;15051:7;15042:6;15031:9;15027:22;15006:53;:::i;:::-;14996:63;;14952:117;15108:2;15134:53;15179:7;15170:6;15159:9;15155:22;15134:53;:::i;:::-;15124:63;;15079:118;15236:2;15262:53;15307:7;15298:6;15287:9;15283:22;15262:53;:::i;:::-;15252:63;;15207:118;15392:2;15381:9;15377:18;15364:32;15423:18;15415:6;15412:30;15409:117;;;15445:79;;:::i;:::-;15409:117;15550:62;15604:7;15595:6;15584:9;15580:22;15550:62;:::i;:::-;15540:72;;15335:287;14686:943;;;;;;;:::o;15635:474::-;15703:6;15711;15760:2;15748:9;15739:7;15735:23;15731:32;15728:119;;;15766:79;;:::i;:::-;15728:119;15886:1;15911:53;15956:7;15947:6;15936:9;15932:22;15911:53;:::i;:::-;15901:63;;15857:117;16013:2;16039:53;16084:7;16075:6;16064:9;16060:22;16039:53;:::i;:::-;16029:63;;15984:118;15635:474;;;;;:::o;16115:180::-;16163:77;16160:1;16153:88;16260:4;16257:1;16250:15;16284:4;16281:1;16274:15;16301:320;16345:6;16382:1;16376:4;16372:12;16362:22;;16429:1;16423:4;16419:12;16450:18;16440:81;;16506:4;16498:6;16494:17;16484:27;;16440:81;16568:2;16560:6;16557:14;16537:18;16534:38;16531:84;;;16587:18;;:::i;:::-;16531:84;16352:269;16301:320;;;:::o;16627:164::-;16767:16;16763:1;16755:6;16751:14;16744:40;16627:164;:::o;16797:366::-;16939:3;16960:67;17024:2;17019:3;16960:67;:::i;:::-;16953:74;;17036:93;17125:3;17036:93;:::i;:::-;17154:2;17149:3;17145:12;17138:19;;16797:366;;;:::o;17169:419::-;17335:4;17373:2;17362:9;17358:18;17350:26;;17422:9;17416:4;17412:20;17408:1;17397:9;17393:17;17386:47;17450:131;17576:4;17450:131;:::i;:::-;17442:139;;17169:419;;;:::o;17594:160::-;17734:12;17730:1;17722:6;17718:14;17711:36;17594:160;:::o;17760:366::-;17902:3;17923:67;17987:2;17982:3;17923:67;:::i;:::-;17916:74;;17999:93;18088:3;17999:93;:::i;:::-;18117:2;18112:3;18108:12;18101:19;;17760:366;;;:::o;18132:419::-;18298:4;18336:2;18325:9;18321:18;18313:26;;18385:9;18379:4;18375:20;18371:1;18360:9;18356:17;18349:47;18413:131;18539:4;18413:131;:::i;:::-;18405:139;;18132:419;;;:::o;18557:167::-;18697:19;18693:1;18685:6;18681:14;18674:43;18557:167;:::o;18730:366::-;18872:3;18893:67;18957:2;18952:3;18893:67;:::i;:::-;18886:74;;18969:93;19058:3;18969:93;:::i;:::-;19087:2;19082:3;19078:12;19071:19;;18730:366;;;:::o;19102:419::-;19268:4;19306:2;19295:9;19291:18;19283:26;;19355:9;19349:4;19345:20;19341:1;19330:9;19326:17;19319:47;19383:131;19509:4;19383:131;:::i;:::-;19375:139;;19102:419;;;:::o;19527:180::-;19575:77;19572:1;19565:88;19672:4;19669:1;19662:15;19696:4;19693:1;19686:15;19713:305;19753:3;19772:20;19790:1;19772:20;:::i;:::-;19767:25;;19806:20;19824:1;19806:20;:::i;:::-;19801:25;;19960:1;19892:66;19888:74;19885:1;19882:81;19879:107;;;19966:18;;:::i;:::-;19879:107;20010:1;20007;20003:9;19996:16;;19713:305;;;;:::o;20024:348::-;20064:7;20087:20;20105:1;20087:20;:::i;:::-;20082:25;;20121:20;20139:1;20121:20;:::i;:::-;20116:25;;20309:1;20241:66;20237:74;20234:1;20231:81;20226:1;20219:9;20212:17;20208:105;20205:131;;;20316:18;;:::i;:::-;20205:131;20364:1;20361;20357:9;20346:20;;20024:348;;;;:::o;20378:182::-;20518:34;20514:1;20506:6;20502:14;20495:58;20378:182;:::o;20566:366::-;20708:3;20729:67;20793:2;20788:3;20729:67;:::i;:::-;20722:74;;20805:93;20894:3;20805:93;:::i;:::-;20923:2;20918:3;20914:12;20907:19;;20566:366;;;:::o;20938:419::-;21104:4;21142:2;21131:9;21127:18;21119:26;;21191:9;21185:4;21181:20;21177:1;21166:9;21162:17;21155:47;21219:131;21345:4;21219:131;:::i;:::-;21211:139;;20938:419;;;:::o;21363:180::-;21411:77;21408:1;21401:88;21508:4;21505:1;21498:15;21532:4;21529:1;21522:15;21549:180;21597:77;21594:1;21587:88;21694:4;21691:1;21684:15;21718:4;21715:1;21708:15;21735:185;21775:1;21792:20;21810:1;21792:20;:::i;:::-;21787:25;;21826:20;21844:1;21826:20;:::i;:::-;21821:25;;21865:1;21855:35;;21870:18;;:::i;:::-;21855:35;21912:1;21909;21905:9;21900:14;;21735:185;;;;:::o;21926:233::-;21965:3;21988:24;22006:5;21988:24;:::i;:::-;21979:33;;22034:66;22027:5;22024:77;22021:103;;;22104:18;;:::i;:::-;22021:103;22151:1;22144:5;22140:13;22133:20;;21926:233;;;:::o;22165:168::-;22248:11;22282:6;22277:3;22270:19;22322:4;22317:3;22313:14;22298:29;;22165:168;;;;:::o;22339:114::-;;:::o;22459:362::-;22600:3;22621:65;22684:1;22679:3;22621:65;:::i;:::-;22614:72;;22695:93;22784:3;22695:93;:::i;:::-;22813:1;22808:3;22804:11;22797:18;;22459:362;;;:::o;22827:748::-;23076:4;23114:3;23103:9;23099:19;23091:27;;23128:71;23196:1;23185:9;23181:17;23172:6;23128:71;:::i;:::-;23209:72;23277:2;23266:9;23262:18;23253:6;23209:72;:::i;:::-;23291;23359:2;23348:9;23344:18;23335:6;23291:72;:::i;:::-;23410:9;23404:4;23400:20;23395:2;23384:9;23380:18;23373:48;23438:130;23563:4;23438:130;:::i;:::-;23430:138;;22827:748;;;;;;:::o;23581:141::-;23637:5;23668:6;23662:13;23653:22;;23684:32;23710:5;23684:32;:::i;:::-;23581:141;;;;:::o;23728:349::-;23797:6;23846:2;23834:9;23825:7;23821:23;23817:32;23814:119;;;23852:79;;:::i;:::-;23814:119;23972:1;23997:63;24052:7;24043:6;24032:9;24028:22;23997:63;:::i;:::-;23987:73;;23943:127;23728:349;;;;:::o;24083:166::-;24223:18;24219:1;24211:6;24207:14;24200:42;24083:166;:::o;24255:366::-;24397:3;24418:67;24482:2;24477:3;24418:67;:::i;:::-;24411:74;;24494:93;24583:3;24494:93;:::i;:::-;24612:2;24607:3;24603:12;24596:19;;24255:366;;;:::o;24627:419::-;24793:4;24831:2;24820:9;24816:18;24808:26;;24880:9;24874:4;24870:20;24866:1;24855:9;24851:17;24844:47;24908:131;25034:4;24908:131;:::i;:::-;24900:139;;24627:419;;;:::o;25052:98::-;25103:6;25137:5;25131:12;25121:22;;25052:98;;;:::o;25156:360::-;25242:3;25270:38;25302:5;25270:38;:::i;:::-;25324:70;25387:6;25382:3;25324:70;:::i;:::-;25317:77;;25403:52;25448:6;25443:3;25436:4;25429:5;25425:16;25403:52;:::i;:::-;25480:29;25502:6;25480:29;:::i;:::-;25475:3;25471:39;25464:46;;25246:270;25156:360;;;;:::o;25522:640::-;25717:4;25755:3;25744:9;25740:19;25732:27;;25769:71;25837:1;25826:9;25822:17;25813:6;25769:71;:::i;:::-;25850:72;25918:2;25907:9;25903:18;25894:6;25850:72;:::i;:::-;25932;26000:2;25989:9;25985:18;25976:6;25932:72;:::i;:::-;26051:9;26045:4;26041:20;26036:2;26025:9;26021:18;26014:48;26079:76;26150:4;26141:6;26079:76;:::i;:::-;26071:84;;25522:640;;;;;;;:::o;26168:148::-;26270:11;26307:3;26292:18;;26168:148;;;;:::o;26322:141::-;26371:4;26394:3;26386:11;;26417:3;26414:1;26407:14;26451:4;26448:1;26438:18;26430:26;;26322:141;;;:::o;26493:845::-;26596:3;26633:5;26627:12;26662:36;26688:9;26662:36;:::i;:::-;26714:89;26796:6;26791:3;26714:89;:::i;:::-;26707:96;;26834:1;26823:9;26819:17;26850:1;26845:137;;;;26996:1;26991:341;;;;26812:520;;26845:137;26929:4;26925:9;26914;26910:25;26905:3;26898:38;26965:6;26960:3;26956:16;26949:23;;26845:137;;26991:341;27058:38;27090:5;27058:38;:::i;:::-;27118:1;27132:154;27146:6;27143:1;27140:13;27132:154;;;27220:7;27214:14;27210:1;27205:3;27201:11;27194:35;27270:1;27261:7;27257:15;27246:26;;27168:4;27165:1;27161:12;27156:17;;27132:154;;;27315:6;27310:3;27306:16;27299:23;;26998:334;;26812:520;;26600:738;;26493:845;;;;:::o;27344:377::-;27450:3;27478:39;27511:5;27478:39;:::i;:::-;27533:89;27615:6;27610:3;27533:89;:::i;:::-;27526:96;;27631:52;27676:6;27671:3;27664:4;27657:5;27653:16;27631:52;:::i;:::-;27708:6;27703:3;27699:16;27692:23;;27454:267;27344:377;;;;:::o;27727:583::-;27949:3;27971:92;28059:3;28050:6;27971:92;:::i;:::-;27964:99;;28080:95;28171:3;28162:6;28080:95;:::i;:::-;28073:102;;28192:92;28280:3;28271:6;28192:92;:::i;:::-;28185:99;;28301:3;28294:10;;27727:583;;;;;;:::o;28316:164::-;28456:16;28452:1;28444:6;28440:14;28433:40;28316:164;:::o;28486:366::-;28628:3;28649:67;28713:2;28708:3;28649:67;:::i;:::-;28642:74;;28725:93;28814:3;28725:93;:::i;:::-;28843:2;28838:3;28834:12;28827:19;;28486:366;;;:::o;28858:419::-;29024:4;29062:2;29051:9;29047:18;29039:26;;29111:9;29105:4;29101:20;29097:1;29086:9;29082:17;29075:47;29139:131;29265:4;29139:131;:::i;:::-;29131:139;;28858:419;;;:::o;29283:94::-;29316:8;29364:5;29360:2;29356:14;29335:35;;29283:94;;;:::o;29383:::-;29422:7;29451:20;29465:5;29451:20;:::i;:::-;29440:31;;29383:94;;;:::o;29483:100::-;29522:7;29551:26;29571:5;29551:26;:::i;:::-;29540:37;;29483:100;;;:::o;29589:157::-;29694:45;29714:24;29732:5;29714:24;:::i;:::-;29694:45;:::i;:::-;29689:3;29682:58;29589:157;;:::o;29752:256::-;29864:3;29879:75;29950:3;29941:6;29879:75;:::i;:::-;29979:2;29974:3;29970:12;29963:19;;29999:3;29992:10;;29752:256;;;;:::o;30014:79::-;30053:7;30082:5;30071:16;;30014:79;;;:::o;30099:157::-;30204:45;30224:24;30242:5;30224:24;:::i;:::-;30204:45;:::i;:::-;30199:3;30192:58;30099:157;;:::o;30262:397::-;30402:3;30417:75;30488:3;30479:6;30417:75;:::i;:::-;30517:2;30512:3;30508:12;30501:19;;30530:75;30601:3;30592:6;30530:75;:::i;:::-;30630:2;30625:3;30621:12;30614:19;;30650:3;30643:10;;30262:397;;;;;:::o;30665:191::-;30705:4;30725:20;30743:1;30725:20;:::i;:::-;30720:25;;30759:20;30777:1;30759:20;:::i;:::-;30754:25;;30798:1;30795;30792:8;30789:34;;;30803:18;;:::i;:::-;30789:34;30848:1;30845;30841:9;30833:17;;30665:191;;;;:::o;30862:176::-;30894:1;30911:20;30929:1;30911:20;:::i;:::-;30906:25;;30945:20;30963:1;30945:20;:::i;:::-;30940:25;;30984:1;30974:35;;30989:18;;:::i;:::-;30974:35;31030:1;31027;31023:9;31018:14;;30862:176;;;;:::o

Swarm Source

ipfs://eaa274d91fb76f502d21254f94a3b03fda734f4a8996120e843fbcd83aab23c9
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.