ETH Price: $3,460.50 (+6.57%)
Gas: 6 Gwei

Token

PixelDeer (DEER)
 

Overview

Max Total Supply

0 DEER

Holders

71

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 DEER
0x370cfbf70a0a1941e79ccb18a099dd284b9ab3ac
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:
PixelDeer

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: contracts/common/meta-transactions/Initializable.sol



pragma solidity ^0.8.0;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

// File: contracts/common/meta-transactions/EIP712Base.sol



pragma solidity ^0.8.0;


contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}
// File: contracts/common/meta-transactions/ContentMixin.sol



pragma solidity ^0.8.0;

abstract contract ContextMixin {
    function msgSender()
        internal
        view
        returns (address payable sender)
    {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: contracts/common/meta-transactions/NativeMetaTransaction.sol



pragma solidity ^0.8.0;



contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @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);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/finance/PaymentSplitter.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;




/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: contracts/ERC721Tradable.sol



pragma solidity ^0.8.0;








contract OwnableDelegateProxy {}

/**
 * Used to delegate ownership of a contract to another address, to save on unneeded transactions to approve contract use for users
 */
contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

/**
 * @title ERC721Tradable
 * ERC721Tradable - ERC721 contract that whitelists a trading address, and has minting functionality.
 */
abstract contract ERC721Tradable is ERC721, ContextMixin, NativeMetaTransaction, Ownable {
    using SafeMath for uint256;
    // using Counters for Counters.Counter;

    /**
     * We rely on the OZ Counter util to keep track of the next available ID.
     * We track the nextTokenId instead of the currentTokenId to save users on gas costs. 
     * Read more about it here: https://shiny.mirror.xyz/OUampBbIz9ebEicfGnQf5At_ReMHlZy0tB4glb9xQ0E
     */ 
    // Counters.Counter private _nextTokenId;
    address proxyRegistryAddress;

    constructor(
        string memory _name,
        string memory _symbol,
        address _proxyRegistryAddress
    ) ERC721(_name, _symbol) {
        proxyRegistryAddress = _proxyRegistryAddress;
        // nextTokenId is initialized to 1, since starting at 0 leads to higher gas cost for the first minter
        // _nextTokenId.increment();
        _initializeEIP712(_name);
    }

    // /**
    //  * @dev Mints a token to an address with a tokenURI.
    //  * @param _to address of the future owner of the token
    //  */
    // function mintTo(address _to) public onlyOwner {
    //     uint256 currentTokenId = _nextTokenId.current();
    //     _nextTokenId.increment();
    //     _safeMint(_to, currentTokenId);
    // }

    // /**
    //     @dev Returns the total tokens minted so far.
    //     1 is always subtracted from the Counter since it tracks the next available tokenId.
    //  */
    // function totalSupply() public view returns (uint256) {
    //     return _nextTokenId.current() - 1;
    // }

    // Note(PixelDeers): changed from pure to view.
    function baseTokenURI() virtual public view returns (string memory);

    // Note(PixelDeers): changed from pure to view.
    function tokenURI(uint256 _tokenId) override public view returns (string memory) {
        return string(abi.encodePacked(baseTokenURI(), Strings.toString(_tokenId)));
    }

    /**
     * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator)
        override
        public
        view
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    // Note(PixelDeers): This function was overriden directly in the PixelDeers contract to avoid silly compilation errors.
    // /**
    //  * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
    //  */
    // function _msgSender()
    //     internal
    //     override
    //     view
    //     returns (address sender)
    // {
    //     return ContextMixin.msgSender();
    // }
}

// File: contracts/PixelDeer_nowhitelist.sol


pragma solidity >=0.4.22 <0.9.0;





contract PixelDeer is ERC721Tradable, PaymentSplitter {
    // !!! Token IDs are indexed starting from 1 !!!
    using Counters for Counters.Counter;

    string private currentBaseURI;

    // Minting related.
    uint256 private mintPriceWei = 0.035 ether;  // The price gets stored as an uint256 representing the price in WEI.
    uint256 private whitelistMintPriceWei = 0.025 ether;
    uint32 private maxSupplyPublic = 4_970;
    uint32 private maxSupplyTeam = 30;
    Counters.Counter private counterMintedPublic;  // Starts at 1.
    Counters.Counter private counterMintedTeam;  // Starts at 1.
    bool private mintingAllowed = false;
    bool private whitelistMintingAllowed = false;
    bool private luckyMintingAllowed = false;
    address[] public luckylist;
    mapping(address => uint256) public mintedBalance;  // How many NFTs each address has minted (different from how many it owns).
    uint256 private walletWhitelistMintLimit = 5;
    uint256 private walletLuckylistMintLimit = 5;
    uint256 private walletMintLimit = 10;

    // TODO: Replace these with the real addresses.
    // These are addresses from the Rinkeby test net.
    address constant communityAddress = 0x39Ab4e2ae2b735226b83665bB9DF9604b4f98E9D;
    address constant artistAddress = 0x339891675C4ECD57FD3429566D9CD58CD8950949;
    address constant devAddress = 0x018DB035C10ebabd0C6638F4716C867BFFd22Bf9;
    address constant marketingAddress = 0x70627DBab4830Aef56385fa2e42f5F582904A528;
    // address constant openseaProxyRegistryAddress = 0xF57B2c51dED3A29e6891aba85459d600256Cf317;  // TODO: Replace this with the Mainnet address in the contract deployment migration!!!.
    // for MainNet: address constant openseaProxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;

    modifier onlyTeam {
        require(
            msg.sender == devAddress || msg.sender == artistAddress || msg.sender == marketingAddress,
            "Only the Pixel Deers team can call this function."
        );
        _;
    }


    // The Event for picking a winner. This event will be emitted every time a winner is picked.
    // The event itself which contains the address of the winner can be seen on the block chain by anyone.
    // Events can be easily seen using www.etherscan.io.
    event PickWinner(address winner, uint timestamp);


    // ===== Constructor and OpenSea's interfaces related (baseTokenURI and _msgSender) =====
    /*
        payees = ["0x5B38Da6a701c568545dCfcB03FcB875f56beddC4", "0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2"]
        shares = [60, 40]
    */
    constructor(
            address[] memory payees, uint256[] memory shares, address proxyRegistryAddress,
            address[] memory luckyAddresses
        ) 
        ERC721Tradable("PixelDeer", "DEER", proxyRegistryAddress) 
        PaymentSplitter(payees, shares) 
        payable {
        // Check that the constructor parameters are the expected ones.
        require(
            payees.length == 4, 
            "Please provide the address of the community wallet, of the artist, of the dev and of the marketer."
        );
        require(
            shares.length == 4, 
            "Please provide the shares of the community wallet, of the artist, of the dev and of the marketer."
        );

        require(payees[0] == communityAddress, "First payee address should be of the community wallet.");
        require(payees[1] == artistAddress, "Second payee address should be of the artist.");
        require(payees[2] == devAddress, "Third payee address should be of the dev.");
        require(payees[3] == marketingAddress, "Forth payee address should be of the marketer.");

        require(shares[0] == 292, "The community wallet should receive 29.2% (292 shares).");
        require(shares[1] == shares[2] && shares[1] == shares[3], "The artist, the dev, and the marketer should receive equal shares.");
        require(shares[1] == 236, "Every team member should receive 23.6% (236 shares).");

        luckylist = luckyAddresses;

        // counterMintedPublic and counterMintedTeam are initialized to 1, since starting at 0 leads to higher gas cost
        // for the first public/team minter.
        counterMintedPublic.increment();
        counterMintedTeam.increment();

        currentBaseURI = "https://mint.pixeldeers.com/api/";  // TODO: Replace this with the actual base uri of the backend.
    }

    function baseTokenURI() override public view returns (string memory) {
        return currentBaseURI;
    }

    function setBaseURI(string memory baseURI) public onlyTeam {
        currentBaseURI = baseURI;
    }

    function _msgSender()
        internal
        override (Context)
        view
        returns (address sender)
    {
        return ContextMixin.msgSender();
    }

    // ===== Minting configurations =====
    function allowWhitelistMint() external onlyTeam {
        require(whitelistMintingAllowed == false, "Whitelist minting is already allowed.");  // Try to save some gas.
        whitelistMintingAllowed = true;
    }

    function forbidWhitelistMint() external onlyTeam {
        require(whitelistMintingAllowed == true, "Whitelist minting is already forbidden.");  // Try to save some gas.
        whitelistMintingAllowed = false;
    }

    function allowLuckyMint() external onlyTeam {
        require(luckyMintingAllowed == false, "Lucky minting is already allowed.");  // Try to save some gas.
        luckyMintingAllowed = true;
    }

    function forbidLuckyMint() external onlyTeam {
        require(luckyMintingAllowed == true, "Lucky minting is already forbidden.");  // Try to save some gas.
        luckyMintingAllowed = false;
    }

    function allowMint() external onlyTeam {
        require(mintingAllowed == false, "Minting is already allowed.");  // Try to save some gas.
        mintingAllowed = true;
    }

    function forbidMint() external onlyTeam {
        require(mintingAllowed == true, "Minting is already forbidden.");  // Try to save some gas.
        mintingAllowed = false;
    }

    function setMintPriceWei(uint256 newMintPriceWei) public onlyTeam {
        mintPriceWei = newMintPriceWei;
    }

    function setWhitelistMintPriceWei(uint256 newWhitelistMintPriceWei) public onlyTeam {
        whitelistMintPriceWei = newWhitelistMintPriceWei;
    }

    function setWalletMintLimit(uint256 newMintLimit) public onlyTeam {
        walletMintLimit = newMintLimit;
    }

    function setWalletWhitelistMintLimit(uint256 newWhitelistMintLimit) public onlyTeam {
        walletWhitelistMintLimit = newWhitelistMintLimit;
    }

    function setWalletLuckyMintLimit(uint256 newLuckyMintLimit) public onlyTeam {
        walletLuckylistMintLimit = newLuckyMintLimit;
    }

    function setLuckylist(address[] calldata newLuckylist) external onlyTeam {
        luckylist = newLuckylist;
    }

    function addToLuckylist(address newLuckylistMember) external onlyTeam {
        require(isLucky(newLuckylistMember) == false, "Address is already on the luckylist.");
        luckylist.push(newLuckylistMember);
    }

    function setMaxSupplyPublic(uint32 newMaxSupplyPublic) public onlyTeam {
        require(newMaxSupplyPublic + maxSupplyTeam <= 5000, "The absolute maximum supply can't be over 5000.");
        maxSupplyPublic = newMaxSupplyPublic;
    }


    // ===== Minting =====
    function mint(uint256 numToMint) external payable {
        // Check all minting preconditions.
        require(mintingAllowed == true, "Minting is currently not allowed.");

        require(numToMint >= 1, "At least 1 Pixel Deer must be minted.");

        uint256 numMintedPublic = counterMintedPublic.current() - 1;  // Possibly cheaper than calling getNumMintedPublic.
        require(numMintedPublic + numToMint <= maxSupplyPublic, "The requested number of Pixel Deers would go over the maximum public supply.");
        
        require(msg.value == numToMint * mintPriceWei, "Incorrect paid amount for minting the desired Pixel Deers.");

        // Enforce wallet mint limit.
        uint256 numMintedBySender = mintedBalance[msg.sender];
        require(
            numMintedBySender + numToMint <= walletMintLimit, 
            "The requested number of Pixel Deers would go over the wallet mint limit."
        );

        // The actual minting.
        uint256 nextTokenId;
        for (uint iMinted = 0; iMinted < numToMint; iMinted++) {
            nextTokenId = getNextTokenId();
            _safeMint(msg.sender, nextTokenId);
            counterMintedPublic.increment();
        }
        mintedBalance[msg.sender] += numToMint;
    }

    function mintWhitelist(uint256 numToMint) external payable {
        // Check all whitelist minting preconditions.
        require(whitelistMintingAllowed == true, "Whitelist minting is currently not allowed.");

        require(numToMint >= 1, "At least 1 Pixel Deer must be minted.");

        uint256 numMintedPublic = counterMintedPublic.current() - 1;  // Possibly cheaper than calling getNumMintedPublic.
        require(numMintedPublic + numToMint <= maxSupplyPublic, "The requested number of Pixel Deers would go over the maximum public supply.");
        
        require(msg.value == numToMint * whitelistMintPriceWei, "Incorrect paid amount for minting the desired Pixel Deers.");

        // Enforce whitelist wallet mint limit.
        uint256 numMintedBySender = mintedBalance[msg.sender];
        require(
            numMintedBySender + numToMint <= walletWhitelistMintLimit, 
            "The requested number of Pixel Deers would go over the wallet whitelist mint limit."
        );

        // The actual minting.
        uint256 nextTokenId;
        for (uint iMinted = 0; iMinted < numToMint; iMinted++) {
            nextTokenId = getNextTokenId();
            _safeMint(msg.sender, nextTokenId);
            counterMintedPublic.increment();
        }
        mintedBalance[msg.sender] += numToMint;
    }

    function mintTeam(address destination, uint256 numToMint) external onlyTeam {
        uint256 numMintedTeam = counterMintedTeam.current() - 1;  // Possibly cheaper than calling getNumMintedTeam.
        require(numMintedTeam + numToMint <= maxSupplyTeam, "The requested amount of Pixel Deers would go over the maximum team supply.");

        uint256 nextTokenId;
        for (uint iMinted = 0; iMinted < numToMint; iMinted++) {
            nextTokenId = getNextTokenId();
            _safeMint(destination, nextTokenId);
            counterMintedTeam.increment();
        }
    }

    function mintLucky(uint256 numToMint) external {
        // Check all lucky minting preconditions.
        require(luckyMintingAllowed == true, "Lucky minting is currently not allowed.");

        require(numToMint >= 1, "At least 1 Pixel Deer must be minted.");

        uint256 numMintedPublic = counterMintedPublic.current() - 1;  // Possibly cheaper than calling getNumMintedPublic.
        require(numMintedPublic + numToMint <= maxSupplyPublic, "The requested number of Pixel Deers would go over the maximum public supply.");

        // Check that the sender is a lucky winner.
        require(isLucky(msg.sender) == true, "You are not one of the lucky winners.");

        // Enforce lucky wallet mint limit.
        uint256 numMintedBySender = mintedBalance[msg.sender];
        require(
            numMintedBySender + numToMint <= walletLuckylistMintLimit, 
            "The requested number of Pixel Deers would go over the wallet lucky winner mint limit."
        );

        // The actual minting.
        uint256 nextTokenId;
        for (uint iMinted = 0; iMinted < numToMint; iMinted++) {
            nextTokenId = getNextTokenId();
            _safeMint(msg.sender, nextTokenId);
            counterMintedPublic.increment();
        }
        mintedBalance[msg.sender] += numToMint;
    }

    // ===== Getters =====
    function getMintPriceWei() public view returns (uint256) {
        return mintPriceWei;
    }

    function getWhitelistMintPriceWei() public view returns (uint256) {
        return whitelistMintPriceWei;
    }

    function getWalletMintLimit() public view returns (uint256) {
        return walletMintLimit;
    }

    function getWalletWhitelistMintLimit() public view returns (uint256) {
        return walletWhitelistMintLimit;
    }

    function getWalletLuckylistMintLimit() public view returns (uint256) {
        return walletLuckylistMintLimit;
    }

    function getNumMintedByAddress(address minter) public view returns (uint256) {
        return mintedBalance[minter];
    }

    function getNumMintedPublic() public view returns (uint256) {
        return counterMintedPublic.current() - 1;
    }

    function getNumMintedTeam() public view returns (uint256) {
        return counterMintedTeam.current() - 1;
    }

    function getNumMinted() public view returns (uint256) {
        return counterMintedPublic.current() + counterMintedTeam.current() - 2;
    }

    function getPublicSupply() public view returns (uint32) {
        return maxSupplyPublic;
    }

    function getTeamSupply() public view returns (uint32) {
        return maxSupplyTeam;
    }

    function getTotalSupply() public view returns (uint32) {
        return maxSupplyPublic + maxSupplyTeam;
    }

    function getNextTokenId() public view returns (uint256) {
        // return (counterMintedPublic.current() - 1) + (counterMintedTeam.current() - 1) + 1;
        // gets "optimized" to:
        return counterMintedPublic.current() + counterMintedTeam.current() - 1;
    }

    function getLuckylist() public view returns (address[] memory) {
        return luckylist;
    }

    function isMintingAllowed() public view returns (bool) {
        return mintingAllowed;
    }

    function isWhitelistMintingAllowed() public view returns (bool) {
        return whitelistMintingAllowed;
    }

    function isLuckyMintingAllowed() public view returns (bool) {
        return luckyMintingAllowed;
    }

    function isLucky(address user) public view returns (bool) {
        for (uint iLuckyAddress = 0; iLuckyAddress < luckylist.length; iLuckyAddress++) {
            if (luckylist[iLuckyAddress] == user) {
                return true;
            }
        }
        return false;
    }



    // ===== Picking a winner =====
    function pickRandomWinnerAddress() public onlyTeam returns (address) {
        // First, pick a random minted NFT.
        uint256 numMinted = counterMintedPublic.current() + counterMintedTeam.current() - 2; // Possibly cheaper than calling getNumMinted.
        uint256 randomTokenId = (random() % numMinted) + 1;

        // Now, figure out who owns the randomly picked Pixel Deer.
        address winner = ownerOf(randomTokenId);

        // Log on the block chain the winner address.
        emit PickWinner(winner, block.timestamp);  // Timestamp could also be figured from the block (number) itself.

        return winner;
    }

    // ===== Auxiliary =====
    function random() internal view returns (uint256) {
        return uint256(keccak256(abi.encode(block.timestamp, block.difficulty)));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"},{"internalType":"address","name":"proxyRegistryAddress","type":"address"},{"internalType":"address[]","name":"luckyAddresses","type":"address[]"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PickWinner","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":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newLuckylistMember","type":"address"}],"name":"addToLuckylist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowLuckyMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"forbidLuckyMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forbidMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forbidWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLuckylist","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPriceWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"getNumMintedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumMintedPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumMintedTeam","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTeamSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWalletLuckylistMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWalletMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWalletWhitelistMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistMintPriceWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isLucky","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLuckyMintingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistMintingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"luckylist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numToMint","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numToMint","type":"uint256"}],"name":"mintLucky","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"numToMint","type":"uint256"}],"name":"mintTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numToMint","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","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":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pickRandomWinnerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"tokenId","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newLuckylist","type":"address[]"}],"name":"setLuckylist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newMaxSupplyPublic","type":"uint32"}],"name":"setMaxSupplyPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintPriceWei","type":"uint256"}],"name":"setMintPriceWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLuckyMintLimit","type":"uint256"}],"name":"setWalletLuckyMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintLimit","type":"uint256"}],"name":"setWalletMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newWhitelistMintLimit","type":"uint256"}],"name":"setWalletWhitelistMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newWhitelistMintPriceWei","type":"uint256"}],"name":"setWhitelistMintPriceWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","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":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060408190526006805460ff19169055667c5850872380006013556658d15e17628000601455601580546001600160401b031916641e0000136a1790556018805462ffffff191690556005601b819055601c55600a601d556200553738819003908190833981016040819052620000779162000e90565b8383604051806040016040528060098152602001682834bc32b62232b2b960b91b815250604051806040016040528060048152602001632222a2a960e11b8152508582828160009080519060200190620000d392919062000cf2565b508051620000e990600190602084019062000cf2565b50505062000106620001006200092b60201b60201c565b62000947565b600a80546001600160a01b0319166001600160a01b0383161790556200012c8362000999565b5050508051825114620001a15760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620001f45760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000198565b60005b825181101562000260576200024b8382815181106200021a576200021a6200107a565b60200260200101518383815181106200023757620002376200107a565b6020026020010151620009fa60201b60201c565b80620002578162001046565b915050620001f7565b50505083516004146200030d5760405162461bcd60e51b815260206004820152606260248201527f506c656173652070726f76696465207468652061646472657373206f6620746860448201527f6520636f6d6d756e6974792077616c6c65742c206f662074686520617274697360648201527f742c206f66207468652064657620616e64206f6620746865206d61726b657465608482015261391760f11b60a482015260c40162000198565b8251600414620003b65760405162461bcd60e51b815260206004820152606160248201527f506c656173652070726f766964652074686520736861726573206f662074686560448201527f20636f6d6d756e6974792077616c6c65742c206f66207468652061727469737460648201527f2c206f66207468652064657620616e64206f6620746865206d61726b657465726084820152601760f91b60a482015260c40162000198565b7339ab4e2ae2b735226b83665bb9df9604b4f98e9d6001600160a01b031684600081518110620003ea57620003ea6200107a565b60200260200101516001600160a01b031614620004705760405162461bcd60e51b815260206004820152603660248201527f466972737420706179656520616464726573732073686f756c64206265206f6660448201527f2074686520636f6d6d756e6974792077616c6c65742e00000000000000000000606482015260840162000198565b73339891675c4ecd57fd3429566d9cd58cd89509496001600160a01b031684600181518110620004a457620004a46200107a565b60200260200101516001600160a01b0316146200051a5760405162461bcd60e51b815260206004820152602d60248201527f5365636f6e6420706179656520616464726573732073686f756c64206265206f60448201526c33103a34329030b93a34b9ba1760991b606482015260840162000198565b73018db035c10ebabd0c6638f4716c867bffd22bf96001600160a01b0316846002815181106200054e576200054e6200107a565b60200260200101516001600160a01b031614620005c05760405162461bcd60e51b815260206004820152602960248201527f546869726420706179656520616464726573732073686f756c64206265206f66604482015268103a3432903232bb1760b91b606482015260840162000198565b7370627dbab4830aef56385fa2e42f5f582904a5286001600160a01b031684600381518110620005f457620005f46200107a565b60200260200101516001600160a01b0316146200066b5760405162461bcd60e51b815260206004820152602e60248201527f466f72746820706179656520616464726573732073686f756c64206265206f6660448201526d103a34329036b0b935b2ba32b91760911b606482015260840162000198565b826000815181106200068157620006816200107a565b602002602001015161012414620007015760405162461bcd60e51b815260206004820152603760248201527f54686520636f6d6d756e6974792077616c6c65742073686f756c64207265636560448201527f6976652032392e3225202832393220736861726573292e000000000000000000606482015260840162000198565b826002815181106200071757620007176200107a565b6020026020010151836001815181106200073557620007356200107a565b6020026020010151148015620007845750826003815181106200075c576200075c6200107a565b6020026020010151836001815181106200077a576200077a6200107a565b6020026020010151145b620008035760405162461bcd60e51b815260206004820152604260248201527f546865206172746973742c20746865206465762c20616e6420746865206d617260448201527f6b657465722073686f756c64207265636569766520657175616c207368617265606482015261399760f11b608482015260a40162000198565b826001815181106200081957620008196200107a565b602002602001015160ec14620008985760405162461bcd60e51b815260206004820152603460248201527f4576657279207465616d206d656d6265722073686f756c64207265636569766560448201527f2032332e3625202832333620736861726573292e000000000000000000000000606482015260840162000198565b8051620008ad90601990602084019062000d81565b50620008c5601662000be860201b62002aad1760201c565b620008dc601762000be860201b62002aad1760201c565b6040805180820190915260208082527f68747470733a2f2f6d696e742e706978656c64656572732e636f6d2f6170692f918101918252620009209160129162000cf2565b5050505050620010a6565b60006200094262000bf160201b62002ab61760201c565b905090565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60065460ff1615620009df5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640162000198565b620009ea8162000c50565b506006805460ff19166001179055565b6001600160a01b03821662000a675760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000198565b6000811162000ab95760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000198565b6001600160a01b0382166000908152600d60205260409020541562000b355760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000198565b600f8054600181019091557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319166001600160a01b0384169081179091556000908152600d60205260409020819055600b5462000b9f90829062000fee565b600b55604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b80546001019055565b60003330141562000c4a57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b0316915062000c4d9050565b50335b90565b6040518060800160405280604f8152602001620054e8604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600755565b82805462000d009062001009565b90600052602060002090601f01602090048101928262000d24576000855562000d6f565b82601f1062000d3f57805160ff191683800117855562000d6f565b8280016001018555821562000d6f579182015b8281111562000d6f57825182559160200191906001019062000d52565b5062000d7d92915062000dd9565b5090565b82805482825590600052602060002090810192821562000d6f579160200282015b8281111562000d6f57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000da2565b5b8082111562000d7d576000815560010162000dda565b80516001600160a01b038116811462000e0857600080fd5b919050565b600082601f83011262000e1f57600080fd5b8151602062000e3862000e328362000fc8565b62000f95565b80838252828201915082860187848660051b890101111562000e5957600080fd5b60005b8581101562000e835762000e708262000df0565b8452928401929084019060010162000e5c565b5090979650505050505050565b6000806000806080858703121562000ea757600080fd5b84516001600160401b038082111562000ebf57600080fd5b62000ecd8883890162000e0d565b955060209150818701518181111562000ee557600080fd5b8701601f8101891362000ef757600080fd5b805162000f0862000e328262000fc8565b8082825285820191508584018c878560051b870101111562000f2957600080fd5b600094505b8385101562000f4e57805183526001949094019391860191860162000f2e565b50975062000f63925050506040880162000df0565b9350606087015191508082111562000f7a57600080fd5b5062000f898782880162000e0d565b91505092959194509250565b604051601f8201601f191681016001600160401b038111828210171562000fc05762000fc062001090565b604052919050565b60006001600160401b0382111562000fe45762000fe462001090565b5060051b60200190565b6000821982111562001004576200100462001064565b500190565b600181811c908216806200101e57607f821691505b602082108114156200104057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200105d576200105d62001064565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61443280620010b66000396000f3fe6080604052600436106103245760003560e01c806301ffc9a71461037057806306fdde03146103a5578063081812fc146103c757806308ed665b146103f4578063095ea7b3146104165780630c226b01146104365780630c53c51c146104565780630f7e59701461046957806315ebd1231461049657806319165587146104b65780631adcce2c146104d65780631b8dca74146104eb57806320379ee514610500578063213e5a8a1461051f57806323b872dd1461053f57806323c0f2cd1461055f5780632557fa791461057f5780632b481883146105b55780632d0335ab146105cd5780632e8889bd146106035780633408e470146106185780633726230a1461062b57806338318770146106405780633a98ef39146106555780633be10dc61461066a578063406072a91461068757806342842e0e146106a75780634618163e146106c757806348b75044146106da57806349211340146106fa57806353323bc61461071c5780635364bfad1461073c57806355f804b31461075c5780636352211e1461077c57806370517ed41461079c57806370a08231146107bc578063715018a6146107dc57806373cbd8ce146107f1578063779249601461081d5780638b83209b146108325780638da5cb5b1461085257806393f84cfe1461086757806395d89b41146108875780639852595c1461089c578063993d26ec146108bc5780639da33cb2146108d15780639f449fa1146108ef578063a0712d6814610904578063a22cb46514610917578063a8d577f914610937578063adaa0f8a14610959578063af87f43614610979578063b88d4fde1461098e578063c4e41b22146109ae578063c87b56dd146109c3578063caa0f92a146109e3578063cae9185b146109f8578063ce7c2ac214610a0d578063cebb91a014610a43578063d547cfb714610a58578063d79779b214610a6d578063e051b41614610a8d578063e33b7de314610aba578063e3a2a16814610acf578063e8ee8b7614610ae4578063e985e9c514610b04578063f2fde38b14610b24578063f66d738914610b44578063f849217814610b59578063fbd00f8814610b6e578063ff7aa51f14610b8e57600080fd5b3661036b577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770610352610ba3565b34604051610361929190613dcd565b60405180910390a1005b600080fd5b34801561037c57600080fd5b5061039061038b366004613c19565b610bb2565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b506103ba610c04565b60405161039c9190613ea5565b3480156103d357600080fd5b506103e76103e2366004613cb8565b610c96565b60405161039c9190613db9565b34801561040057600080fd5b5061041461040f366004613cea565b610d23565b005b34801561042257600080fd5b50610414610431366004613b5c565b610e26565b34801561044257600080fd5b506103e7610451366004613cb8565b610f49565b6103ba610464366004613adf565b610f73565b34801561047557600080fd5b506103ba604051806040016040528060018152602001603160f81b81525081565b3480156104a257600080fd5b506104146104b1366004613cb8565b61115c565b3480156104c257600080fd5b506104146104d13660046139af565b6111be565b3480156104e257600080fd5b506104146112cd565b3480156104f757600080fd5b5061041461138d565b34801561050c57600080fd5b506007545b60405190815260200161039c565b34801561052b57600080fd5b5061041461053a366004613cb8565b61144a565b34801561054b57600080fd5b5061041461055a366004613a05565b6114ac565b34801561056b57600080fd5b5061041461057a366004613cb8565b6114e4565b34801561058b57600080fd5b5061051161059a3660046139af565b6001600160a01b03166000908152601a602052604090205490565b3480156105c157600080fd5b5060185460ff16610390565b3480156105d957600080fd5b506105116105e83660046139af565b6001600160a01b031660009081526008602052604090205490565b34801561060f57600080fd5b50601b54610511565b34801561062457600080fd5b5046610511565b34801561063757600080fd5b50610511611546565b34801561064c57600080fd5b50601454610511565b34801561066157600080fd5b50600b54610511565b34801561067657600080fd5b50601854610100900460ff16610390565b34801561069357600080fd5b506105116106a23660046139cc565b61156a565b3480156106b357600080fd5b506104146106c2366004613a05565b611595565b6104146106d5366004613cb8565b6115b0565b3480156106e657600080fd5b506104146106f53660046139cc565b6117bd565b34801561070657600080fd5b5061070f611973565b60405161039c9190613e58565b34801561072857600080fd5b506104146107373660046139af565b6119d4565b34801561074857600080fd5b50610414610757366004613b88565b611ae5565b34801561076857600080fd5b50610414610777366004613c70565b611b4e565b34801561078857600080fd5b506103e7610797366004613cb8565b611bc2565b3480156107a857600080fd5b506104146107b7366004613cb8565b611c39565b3480156107c857600080fd5b506105116107d73660046139af565b611c9b565b3480156107e857600080fd5b50610414611d22565b3480156107fd57600080fd5b5060155463ffffffff165b60405163ffffffff909116815260200161039c565b34801561082957600080fd5b50610414611d6d565b34801561083e57600080fd5b506103e761084d366004613cb8565b611e41565b34801561085e57600080fd5b506103e7611e71565b34801561087357600080fd5b50610414610882366004613b5c565b611e80565b34801561089357600080fd5b506103ba611fdf565b3480156108a857600080fd5b506105116108b73660046139af565b611fee565b3480156108c857600080fd5b50610511612009565b3480156108dd57600080fd5b5060185462010000900460ff16610390565b3480156108fb57600080fd5b506103e7612016565b610414610912366004613cb8565b61210b565b34801561092357600080fd5b50610414610932366004613ab1565b6122d3565b34801561094357600080fd5b50601554600160201b900463ffffffff16610808565b34801561096557600080fd5b506103906109743660046139af565b6122e5565b34801561098557600080fd5b50601354610511565b34801561099a57600080fd5b506104146109a9366004613a46565b61234f565b3480156109ba57600080fd5b5061080861238e565b3480156109cf57600080fd5b506103ba6109de366004613cb8565b6123ad565b3480156109ef57600080fd5b506105116123e7565b348015610a0457600080fd5b506104146123f4565b348015610a1957600080fd5b50610511610a283660046139af565b6001600160a01b03166000908152600d602052604090205490565b348015610a4f57600080fd5b506104146124c7565b348015610a6457600080fd5b506103ba61259e565b348015610a7957600080fd5b50610511610a883660046139af565b6125ad565b348015610a9957600080fd5b50610511610aa83660046139af565b601a6020526000908152604090205481565b348015610ac657600080fd5b50600c54610511565b348015610adb57600080fd5b50601d54610511565b348015610af057600080fd5b50610414610aff366004613cb8565b6125c8565b348015610b1057600080fd5b50610390610b1f3660046139cc565b6127e6565b348015610b3057600080fd5b50610414610b3f3660046139af565b6128ba565b348015610b5057600080fd5b50601c54610511565b348015610b6557600080fd5b5061051161296a565b348015610b7a57600080fd5b50610414610b89366004613cb8565b612977565b348015610b9a57600080fd5b506104146129d9565b6000610bad612ab6565b905090565b60006001600160e01b031982166380ac58cd60e01b1480610be357506001600160e01b03198216635b5e139f60e01b145b80610bfe57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610c139061421e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3f9061421e565b8015610c8c5780601f10610c6157610100808354040283529160200191610c8c565b820191906000526020600020905b815481529060010190602001808311610c6f57829003601f168201915b5050505050905090565b6000610ca182612b12565b610d075760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b3360008051602061435d8339815191521480610d4c57503360008051602061437d833981519152145b80610d6457503360008051602061439d833981519152145b610d805760405162461bcd60e51b8152600401610cfe90614055565b60155461138890610d9e90600160201b900463ffffffff1683614189565b63ffffffff161115610e0a5760405162461bcd60e51b815260206004820152602f60248201527f546865206162736f6c757465206d6178696d756d20737570706c792063616e2760448201526e3a1031329037bb32b9101a9818181760891b6064820152608401610cfe565b6015805463ffffffff191663ffffffff92909216919091179055565b6000610e3182611bc2565b9050806001600160a01b0316836001600160a01b03161415610e9f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610cfe565b806001600160a01b0316610eb1610ba3565b6001600160a01b03161480610ecd5750610ecd81610b1f610ba3565b610f3a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610cfe565b610f448383612b2f565b505050565b60198181548110610f5957600080fd5b6000918252602090912001546001600160a01b0316905081565b60408051606081810183526001600160a01b03881660008181526008602090815290859020548452830152918101869052610fb18782878787612b9d565b6110075760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610cfe565b6001600160a01b03871660009081526008602052604090205461102b906001612c8d565b6001600160a01b0388166000908152600860205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b9061107b90899033908a90613de6565b60405180910390a1600080306001600160a01b0316888a6040516020016110a3929190613d58565b60408051601f19818403018152908290526110bd91613d3c565b6000604051808303816000865af19150503d80600081146110fa576040519150601f19603f3d011682016040523d82523d6000602084013e6110ff565b606091505b5091509150816111505760405162461bcd60e51b815260206004820152601c60248201527b119d5b98dd1a5bdb8818d85b1b081b9bdd081cdd58d8d95cdcd99d5b60221b6044820152606401610cfe565b98975050505050505050565b3360008051602061435d833981519152148061118557503360008051602061437d833981519152145b8061119d57503360008051602061439d833981519152145b6111b95760405162461bcd60e51b8152600401610cfe90614055565b601355565b6001600160a01b0381166000908152600d60205260409020546111f35760405162461bcd60e51b8152600401610cfe90613fc4565b60006111fe600c5490565b6112089047614171565b9050600061121f838361121a86611fee565b612ca0565b90508061123e5760405162461bcd60e51b8152600401610cfe9061400a565b6001600160a01b0383166000908152600e602052604081208054839290611266908490614171565b9250508190555080600c600082825461127f9190614171565b9091555061128f90508382612cde565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516112c0929190613dcd565b60405180910390a1505050565b3360008051602061435d83398151915214806112f657503360008051602061437d833981519152145b8061130e57503360008051602061439d833981519152145b61132a5760405162461bcd60e51b8152600401610cfe90614055565b60185460ff1615156001146113815760405162461bcd60e51b815260206004820152601d60248201527f4d696e74696e6720697320616c726561647920666f7262696464656e2e0000006044820152606401610cfe565b6018805460ff19169055565b3360008051602061435d83398151915214806113b657503360008051602061437d833981519152145b806113ce57503360008051602061439d833981519152145b6113ea5760405162461bcd60e51b8152600401610cfe90614055565b60185460ff161561143b5760405162461bcd60e51b815260206004820152601b60248201527a26b4b73a34b7339034b99030b63932b0b23c9030b63637bbb2b21760291b6044820152606401610cfe565b6018805460ff19166001179055565b3360008051602061435d833981519152148061147357503360008051602061437d833981519152145b8061148b57503360008051602061439d833981519152145b6114a75760405162461bcd60e51b8152600401610cfe90614055565b601b55565b6114bd6114b7610ba3565b82612df4565b6114d95760405162461bcd60e51b8152600401610cfe90614120565b610f44838383612eb6565b3360008051602061435d833981519152148061150d57503360008051602061437d833981519152145b8061152557503360008051602061439d833981519152145b6115415760405162461bcd60e51b8152600401610cfe90614055565b601c55565b6000600261155360175490565b6016546115609190614171565b610bad91906141db565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b610f448383836040518060200160405280600081525061234f565b60185460ff6101009091041615156001146116215760405162461bcd60e51b815260206004820152602b60248201527f57686974656c697374206d696e74696e672069732063757272656e746c79206e60448201526a37ba1030b63637bbb2b21760a91b6064820152608401610cfe565b60018110156116425760405162461bcd60e51b8152600401610cfe906140a6565b6000600161164f60165490565b61165991906141db565b60155490915063ffffffff1661166f8383614171565b111561168d5760405162461bcd60e51b8152600401610cfe90613f64565b60145461169a90836141bc565b34146116b85760405162461bcd60e51b8152600401610cfe90613eb8565b336000908152601a6020526040902054601b546116d58483614171565b11156117525760405162461bcd60e51b815260206004820152605260248201526000805160206143dd83398151915260448201527f65727320776f756c6420676f206f766572207468652077616c6c6574207768696064820152713a32b634b9ba1036b4b73a103634b6b4ba1760711b608482015260a401610cfe565b6000805b84811015611792576117666123e7565b91506117723383613044565b611780601680546001019055565b8061178a81614259565b915050611756565b50336000908152601a6020526040812080548692906117b2908490614171565b909155505050505050565b6001600160a01b0381166000908152600d60205260409020546117f25760405162461bcd60e51b8152600401610cfe90613fc4565b60006117fd836125ad565b6040516370a0823160e01b81526001600160a01b038516906370a0823190611829903090600401613db9565b60206040518083038186803b15801561184157600080fd5b505afa158015611855573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118799190613cd1565b6118839190614171565b90506000611896838361121a878761156a565b9050806118b55760405162461bcd60e51b8152600401610cfe9061400a565b6001600160a01b038085166000908152601160209081526040808320938716835292905290812080548392906118ec908490614171565b90915550506001600160a01b03841660009081526010602052604081208054839290611919908490614171565b9091555061192a905084848361305e565b836001600160a01b03167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611965929190613dcd565b60405180910390a250505050565b60606019805480602002602001604051908101604052809291908181526020018280548015610c8c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116119ad575050505050905090565b3360008051602061435d83398151915214806119fd57503360008051602061437d833981519152145b80611a1557503360008051602061439d833981519152145b611a315760405162461bcd60e51b8152600401610cfe90614055565b611a3a816122e5565b15611a935760405162461bcd60e51b8152602060048201526024808201527f4164647265737320697320616c7265616479206f6e20746865206c75636b796c60448201526334b9ba1760e11b6064820152608401610cfe565b601980546001810182556000919091527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950180546001600160a01b0319166001600160a01b0392909216919091179055565b3360008051602061435d8339815191521480611b0e57503360008051602061437d833981519152145b80611b2657503360008051602061439d833981519152145b611b425760405162461bcd60e51b8152600401610cfe90614055565b610f446019838361382e565b3360008051602061435d8339815191521480611b7757503360008051602061437d833981519152145b80611b8f57503360008051602061439d833981519152145b611bab5760405162461bcd60e51b8152600401610cfe90614055565b8051611bbe906012906020840190613891565b5050565b6000818152600260205260408120546001600160a01b031680610bfe5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610cfe565b3360008051602061435d8339815191521480611c6257503360008051602061437d833981519152145b80611c7a57503360008051602061439d833981519152145b611c965760405162461bcd60e51b8152600401610cfe90614055565b601d55565b60006001600160a01b038216611d065760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610cfe565b506001600160a01b031660009081526003602052604090205490565b611d2a610ba3565b6001600160a01b0316611d3b611e71565b6001600160a01b031614611d615760405162461bcd60e51b8152600401610cfe906140eb565b611d6b60006130b4565b565b3360008051602061435d8339815191521480611d9657503360008051602061437d833981519152145b80611dae57503360008051602061439d833981519152145b611dca5760405162461bcd60e51b8152600401610cfe90614055565b60185462010000900460ff161515600114611e335760405162461bcd60e51b815260206004820152602360248201527f4c75636b79206d696e74696e6720697320616c726561647920666f726269646460448201526232b71760e91b6064820152608401610cfe565b6018805462ff000019169055565b6000600f8281548110611e5657611e566142b4565b6000918252602090912001546001600160a01b031692915050565b6009546001600160a01b031690565b3360008051602061435d8339815191521480611ea957503360008051602061437d833981519152145b80611ec157503360008051602061439d833981519152145b611edd5760405162461bcd60e51b8152600401610cfe90614055565b60006001611eea60175490565b611ef491906141db565b601554909150600160201b900463ffffffff16611f118383614171565b1115611f985760405162461bcd60e51b815260206004820152604a60248201527f5468652072657175657374656420616d6f756e74206f6620506978656c20446560448201527f65727320776f756c6420676f206f76657220746865206d6178696d756d20746560648201526930b69039bab838363c9760b11b608482015260a401610cfe565b6000805b83811015611fd857611fac6123e7565b9150611fb88583613044565b611fc6601780546001019055565b80611fd081614259565b915050611f9c565b5050505050565b606060018054610c139061421e565b6001600160a01b03166000908152600e602052604090205490565b6000600161156060175490565b60003360008051602061435d833981519152148061204157503360008051602061437d833981519152145b8061205957503360008051602061439d833981519152145b6120755760405162461bcd60e51b8152600401610cfe90614055565b6000600261208260175490565b60165461208f9190614171565b61209991906141db565b90506000816120a6613106565b6120b09190614274565b6120bb906001614171565b905060006120c882611bc2565b90507fa11a9e464dd09a0c07406d9579a023cafcdba189a4855adb41614aa19b7f26e081426040516120fb929190613dcd565b60405180910390a1925050505b90565b60185460ff16151560011461216c5760405162461bcd60e51b815260206004820152602160248201527f4d696e74696e672069732063757272656e746c79206e6f7420616c6c6f7765646044820152601760f91b6064820152608401610cfe565b600181101561218d5760405162461bcd60e51b8152600401610cfe906140a6565b6000600161219a60165490565b6121a491906141db565b60155490915063ffffffff166121ba8383614171565b11156121d85760405162461bcd60e51b8152600401610cfe90613f64565b6013546121e590836141bc565b34146122035760405162461bcd60e51b8152600401610cfe90613eb8565b336000908152601a6020526040902054601d546122208483614171565b11156122935760405162461bcd60e51b815260206004820152604860248201526000805160206143dd83398151915260448201527f65727320776f756c6420676f206f766572207468652077616c6c6574206d696e6064820152673a103634b6b4ba1760c11b608482015260a401610cfe565b6000805b84811015611792576122a76123e7565b91506122b33383613044565b6122c1601680546001019055565b806122cb81614259565b915050612297565b611bbe6122de610ba3565b8383613142565b6000805b60195481101561234657826001600160a01b031660198281548110612310576123106142b4565b6000918252602090912001546001600160a01b031614156123345750600192915050565b8061233e81614259565b9150506122e9565b50600092915050565b61236061235a610ba3565b83612df4565b61237c5760405162461bcd60e51b8152600401610cfe90614120565b6123888484848461320d565b50505050565b601554600090610bad9063ffffffff600160201b820481169116614189565b60606123b761259e565b6123c083613240565b6040516020016123d1929190613d8a565b6040516020818303038152906040529050919050565b6000600161155360175490565b3360008051602061435d833981519152148061241d57503360008051602061437d833981519152145b8061243557503360008051602061439d833981519152145b6124515760405162461bcd60e51b8152600401610cfe90614055565b60185462010000900460ff16156124b45760405162461bcd60e51b815260206004820152602160248201527f4c75636b79206d696e74696e6720697320616c726561647920616c6c6f7765646044820152601760f91b6064820152608401610cfe565b6018805462ff0000191662010000179055565b3360008051602061435d83398151915214806124f057503360008051602061437d833981519152145b8061250857503360008051602061439d833981519152145b6125245760405162461bcd60e51b8152600401610cfe90614055565b60185460ff6101009091041615156001146125915760405162461bcd60e51b815260206004820152602760248201527f57686974656c697374206d696e74696e6720697320616c726561647920666f726044820152663134b23232b71760c91b6064820152608401610cfe565b6018805461ff0019169055565b606060128054610c139061421e565b6001600160a01b031660009081526010602052604090205490565b60185462010000900460ff1615156001146126355760405162461bcd60e51b815260206004820152602760248201527f4c75636b79206d696e74696e672069732063757272656e746c79206e6f742061604482015266363637bbb2b21760c91b6064820152608401610cfe565b60018110156126565760405162461bcd60e51b8152600401610cfe906140a6565b6000600161266360165490565b61266d91906141db565b60155490915063ffffffff166126838383614171565b11156126a15760405162461bcd60e51b8152600401610cfe90613f64565b6126aa336122e5565b15156001146127095760405162461bcd60e51b815260206004820152602560248201527f596f7520617265206e6f74206f6e65206f6620746865206c75636b792077696e6044820152643732b9399760d91b6064820152608401610cfe565b336000908152601a6020526040902054601c546127268483614171565b11156127a65760405162461bcd60e51b815260206004820152605560248201526000805160206143dd83398151915260448201527f65727320776f756c6420676f206f766572207468652077616c6c6574206c756360648201527435bc903bb4b73732b91036b4b73a103634b6b4ba1760591b608482015260a401610cfe565b6000805b84811015611792576127ba6123e7565b91506127c63383613044565b6127d4601680546001019055565b806127de81614259565b9150506127aa565b600a5460405163c455279160e01b81526000916001600160a01b039081169190841690829063c45527919061281f908890600401613db9565b60206040518083038186803b15801561283757600080fd5b505afa15801561284b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286f9190613c53565b6001600160a01b03161415612888576001915050610bfe565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b6128c2610ba3565b6001600160a01b03166128d3611e71565b6001600160a01b0316146128f95760405162461bcd60e51b8152600401610cfe906140eb565b6001600160a01b03811661295e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cfe565b612967816130b4565b50565b6000600161156060165490565b3360008051602061435d83398151915214806129a057503360008051602061437d833981519152145b806129b857503360008051602061439d833981519152145b6129d45760405162461bcd60e51b8152600401610cfe90614055565b601455565b3360008051602061435d8339815191521480612a0257503360008051602061437d833981519152145b80612a1a57503360008051602061439d833981519152145b612a365760405162461bcd60e51b8152600401610cfe90614055565b601854610100900460ff1615612a9c5760405162461bcd60e51b815260206004820152602560248201527f57686974656c697374206d696e74696e6720697320616c726561647920616c6c60448201526437bbb2b21760d91b6064820152608401610cfe565b6018805461ff001916610100179055565b80546001019055565b600033301415612b0d57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506121089050565b503390565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b6482611bc2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616612c035760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610cfe565b6001612c16612c118761333d565b6133ba565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612c64573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000612c998284614171565b9392505050565b600b546001600160a01b0384166000908152600d602052604081205490918391612cca90866141bc565b612cd491906141a8565b6128b291906141db565b80471015612d2e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610cfe565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612d7b576040519150601f19603f3d011682016040523d82523d6000602084013e612d80565b606091505b5050905080610f445760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726044820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b6064820152608401610cfe565b6000612dff82612b12565b612e605760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610cfe565b6000612e6b83611bc2565b9050806001600160a01b0316846001600160a01b03161480612ea65750836001600160a01b0316612e9b84610c96565b6001600160a01b0316145b806128b257506128b281856127e6565b826001600160a01b0316612ec982611bc2565b6001600160a01b031614612f315760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610cfe565b6001600160a01b038216612f935760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610cfe565b612f9e600082612b2f565b6001600160a01b0383166000908152600360205260408120805460019290612fc79084906141db565b90915550506001600160a01b0382166000908152600360205260408120805460019290612ff5908490614171565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716916000805160206143bd83398151915291a4505050565b611bbe8282604051806020016040528060008152506133ea565b610f448363a9059cbb60e01b848460405160240161307d929190613dcd565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261341d565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60004244604051602001613124929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905090565b816001600160a01b0316836001600160a01b031614156131a05760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610cfe565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613218848484612eb6565b613224848484846134ef565b6123885760405162461bcd60e51b8152600401610cfe90613f12565b6060816132645750506040805180820190915260018152600360fc1b602082015290565b8160005b811561328e578061327881614259565b91506132879050600a836141a8565b9150613268565b6000816001600160401b038111156132a8576132a86142ca565b6040519080825280601f01601f1916602001820160405280156132d2576020820181803683370190505b5090505b84156128b2576132e76001836141db565b91506132f4600a86614274565b6132ff906030614171565b60f81b818381518110613314576133146142b4565b60200101906001600160f81b031916908160001a905350613336600a866141a8565b94506132d6565b600060405180608001604052806043815260200161431a604391398051602091820120835184830151604080870151805190860120905161339d950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006133c560075490565b60405161190160f01b602082015260228101919091526042810183905260620161339d565b6133f48383613603565b61340160008484846134ef565b610f445760405162461bcd60e51b8152600401610cfe90613f12565b6000613472826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166137239092919063ffffffff16565b805190915015610f4457808060200190518101906134909190613bfc565b610f445760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cfe565b60006001600160a01b0384163b156135f857836001600160a01b031663150b7a02613518610ba3565b8786866040518563ffffffff1660e01b815260040161353a9493929190613e1b565b602060405180830381600087803b15801561355457600080fd5b505af1925050508015613584575060408051601f3d908101601f1916820190925261358191810190613c36565b60015b6135de573d8080156135b2576040519150601f19603f3d011682016040523d82523d6000602084013e6135b7565b606091505b5080516135d65760405162461bcd60e51b8152600401610cfe90613f12565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506128b2565b506001949350505050565b6001600160a01b0382166136595760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610cfe565b61366281612b12565b156136ae5760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610cfe565b6001600160a01b03821660009081526003602052604081208054600192906136d7908490614171565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392906000805160206143bd833981519152908290a45050565b60606128b2848460008585843b61377c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cfe565b600080866001600160a01b031685876040516137989190613d3c565b60006040518083038185875af1925050503d80600081146137d5576040519150601f19603f3d011682016040523d82523d6000602084013e6137da565b606091505b50915091506137ea8282866137f5565b979650505050505050565b60608315613804575081612c99565b8251156138145782518084602001fd5b8160405162461bcd60e51b8152600401610cfe9190613ea5565b828054828255906000526020600020908101928215613881579160200282015b828111156138815781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061384e565b5061388d929150613905565b5090565b82805461389d9061421e565b90600052602060002090601f0160209004810192826138bf5760008555613881565b82601f106138d857805160ff1916838001178555613881565b82800160010185558215613881579182015b828111156138815782518255916020019190600101906138ea565b5b8082111561388d5760008155600101613906565b60006001600160401b0380841115613934576139346142ca565b604051601f8501601f19908116603f0116810190828211818310171561395c5761395c6142ca565b8160405280935085815286868601111561397557600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126139a057600080fd5b612c998383356020850161391a565b6000602082840312156139c157600080fd5b8135612c99816142e0565b600080604083850312156139df57600080fd5b82356139ea816142e0565b915060208301356139fa816142e0565b809150509250929050565b600080600060608486031215613a1a57600080fd5b8335613a25816142e0565b92506020840135613a35816142e0565b929592945050506040919091013590565b60008060008060808587031215613a5c57600080fd5b8435613a67816142e0565b93506020850135613a77816142e0565b92506040850135915060608501356001600160401b03811115613a9957600080fd5b613aa58782880161398f565b91505092959194509250565b60008060408385031215613ac457600080fd5b8235613acf816142e0565b915060208301356139fa816142f5565b600080600080600060a08688031215613af757600080fd5b8535613b02816142e0565b945060208601356001600160401b03811115613b1d57600080fd5b613b298882890161398f565b9450506040860135925060608601359150608086013560ff81168114613b4e57600080fd5b809150509295509295909350565b60008060408385031215613b6f57600080fd5b8235613b7a816142e0565b946020939093013593505050565b60008060208385031215613b9b57600080fd5b82356001600160401b0380821115613bb257600080fd5b818501915085601f830112613bc657600080fd5b813581811115613bd557600080fd5b8660208260051b8501011115613bea57600080fd5b60209290920196919550909350505050565b600060208284031215613c0e57600080fd5b8151612c99816142f5565b600060208284031215613c2b57600080fd5b8135612c9981614303565b600060208284031215613c4857600080fd5b8151612c9981614303565b600060208284031215613c6557600080fd5b8151612c99816142e0565b600060208284031215613c8257600080fd5b81356001600160401b03811115613c9857600080fd5b8201601f81018413613ca957600080fd5b6128b28482356020840161391a565b600060208284031215613cca57600080fd5b5035919050565b600060208284031215613ce357600080fd5b5051919050565b600060208284031215613cfc57600080fd5b813563ffffffff81168114612c9957600080fd5b60008151808452613d288160208601602086016141f2565b601f01601f19169290920160200192915050565b60008251613d4e8184602087016141f2565b9190910192915050565b60008351613d6a8184602088016141f2565b60609390931b6001600160601b0319169190920190815260140192915050565b60008351613d9c8184602088016141f2565b835190830190613db08183602088016141f2565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03848116825283166020820152606060408201819052600090613e1290830184613d10565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613e4e90830184613d10565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613e995783516001600160a01b031683529284019291840191600101613e74565b50909695505050505050565b602081526000612c996020830184613d10565b6020808252603a908201527f496e636f7272656374207061696420616d6f756e7420666f72206d696e74696e60408201527933903a3432903232b9b4b932b2102834bc32b6102232b2b9399760311b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252604c908201526000805160206143dd83398151915260408201527f65727320776f756c6420676f206f76657220746865206d6178696d756d20707560608201526b313634b19039bab838363c9760a11b608082015260a00190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60208082526031908201527f4f6e6c792074686520506978656c204465657273207465616d2063616e2063616040820152703636103a3434b990333ab731ba34b7b71760791b606082015260800190565b60208082526025908201527f4174206c65617374203120506978656c2044656572206d757374206265206d69604082015264373a32b21760d91b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561418457614184614288565b500190565b600063ffffffff808316818516808303821115613db057613db0614288565b6000826141b7576141b761429e565b500490565b60008160001904831182151516156141d6576141d6614288565b500290565b6000828210156141ed576141ed614288565b500390565b60005b8381101561420d5781810151838201526020016141f5565b838111156123885750506000910152565b600181811c9082168061423257607f821691505b6020821081141561425357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561426d5761426d614288565b5060010190565b6000826142835761428361429e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461296757600080fd5b801515811461296757600080fd5b6001600160e01b03198116811461296757600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529000000000000000000000000018db035c10ebabd0c6638f4716c867bffd22bf9000000000000000000000000339891675c4ecd57fd3429566d9cd58cd895094900000000000000000000000070627dbab4830aef56385fa2e42f5f582904a528ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef54686520726571756573746564206e756d626572206f6620506978656c204465a2646970667358221220af0e1a458fc979f8173af6f38bc46744f6de6ed95da1c0b31d84a53ec3d2917c64736f6c63430008070033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c742900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000039ab4e2ae2b735226b83665bb9df9604b4f98e9d000000000000000000000000339891675c4ecd57fd3429566d9cd58cd8950949000000000000000000000000018db035c10ebabd0c6638f4716c867bffd22bf900000000000000000000000070627dbab4830aef56385fa2e42f5f582904a5280000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000012400000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000060000000000000000000000005f991bdcccff8a5c6c00a5a708dc4f649eb5887c000000000000000000000000e93b6fd78e1f5b82e951b48d55ab997371bc3659000000000000000000000000289f74138b18002ad2b388787f148f2e456359ef000000000000000000000000cc82a2380f9dbbc1fdd0fed9b35c391a5046934500000000000000000000000056da938600dd4c26ef493c637f93aab203c0c6860000000000000000000000000064eda2574585714fa4956c4c003d4067931880

Deployed Bytecode

0x6080604052600436106103245760003560e01c806301ffc9a71461037057806306fdde03146103a5578063081812fc146103c757806308ed665b146103f4578063095ea7b3146104165780630c226b01146104365780630c53c51c146104565780630f7e59701461046957806315ebd1231461049657806319165587146104b65780631adcce2c146104d65780631b8dca74146104eb57806320379ee514610500578063213e5a8a1461051f57806323b872dd1461053f57806323c0f2cd1461055f5780632557fa791461057f5780632b481883146105b55780632d0335ab146105cd5780632e8889bd146106035780633408e470146106185780633726230a1461062b57806338318770146106405780633a98ef39146106555780633be10dc61461066a578063406072a91461068757806342842e0e146106a75780634618163e146106c757806348b75044146106da57806349211340146106fa57806353323bc61461071c5780635364bfad1461073c57806355f804b31461075c5780636352211e1461077c57806370517ed41461079c57806370a08231146107bc578063715018a6146107dc57806373cbd8ce146107f1578063779249601461081d5780638b83209b146108325780638da5cb5b1461085257806393f84cfe1461086757806395d89b41146108875780639852595c1461089c578063993d26ec146108bc5780639da33cb2146108d15780639f449fa1146108ef578063a0712d6814610904578063a22cb46514610917578063a8d577f914610937578063adaa0f8a14610959578063af87f43614610979578063b88d4fde1461098e578063c4e41b22146109ae578063c87b56dd146109c3578063caa0f92a146109e3578063cae9185b146109f8578063ce7c2ac214610a0d578063cebb91a014610a43578063d547cfb714610a58578063d79779b214610a6d578063e051b41614610a8d578063e33b7de314610aba578063e3a2a16814610acf578063e8ee8b7614610ae4578063e985e9c514610b04578063f2fde38b14610b24578063f66d738914610b44578063f849217814610b59578063fbd00f8814610b6e578063ff7aa51f14610b8e57600080fd5b3661036b577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770610352610ba3565b34604051610361929190613dcd565b60405180910390a1005b600080fd5b34801561037c57600080fd5b5061039061038b366004613c19565b610bb2565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b506103ba610c04565b60405161039c9190613ea5565b3480156103d357600080fd5b506103e76103e2366004613cb8565b610c96565b60405161039c9190613db9565b34801561040057600080fd5b5061041461040f366004613cea565b610d23565b005b34801561042257600080fd5b50610414610431366004613b5c565b610e26565b34801561044257600080fd5b506103e7610451366004613cb8565b610f49565b6103ba610464366004613adf565b610f73565b34801561047557600080fd5b506103ba604051806040016040528060018152602001603160f81b81525081565b3480156104a257600080fd5b506104146104b1366004613cb8565b61115c565b3480156104c257600080fd5b506104146104d13660046139af565b6111be565b3480156104e257600080fd5b506104146112cd565b3480156104f757600080fd5b5061041461138d565b34801561050c57600080fd5b506007545b60405190815260200161039c565b34801561052b57600080fd5b5061041461053a366004613cb8565b61144a565b34801561054b57600080fd5b5061041461055a366004613a05565b6114ac565b34801561056b57600080fd5b5061041461057a366004613cb8565b6114e4565b34801561058b57600080fd5b5061051161059a3660046139af565b6001600160a01b03166000908152601a602052604090205490565b3480156105c157600080fd5b5060185460ff16610390565b3480156105d957600080fd5b506105116105e83660046139af565b6001600160a01b031660009081526008602052604090205490565b34801561060f57600080fd5b50601b54610511565b34801561062457600080fd5b5046610511565b34801561063757600080fd5b50610511611546565b34801561064c57600080fd5b50601454610511565b34801561066157600080fd5b50600b54610511565b34801561067657600080fd5b50601854610100900460ff16610390565b34801561069357600080fd5b506105116106a23660046139cc565b61156a565b3480156106b357600080fd5b506104146106c2366004613a05565b611595565b6104146106d5366004613cb8565b6115b0565b3480156106e657600080fd5b506104146106f53660046139cc565b6117bd565b34801561070657600080fd5b5061070f611973565b60405161039c9190613e58565b34801561072857600080fd5b506104146107373660046139af565b6119d4565b34801561074857600080fd5b50610414610757366004613b88565b611ae5565b34801561076857600080fd5b50610414610777366004613c70565b611b4e565b34801561078857600080fd5b506103e7610797366004613cb8565b611bc2565b3480156107a857600080fd5b506104146107b7366004613cb8565b611c39565b3480156107c857600080fd5b506105116107d73660046139af565b611c9b565b3480156107e857600080fd5b50610414611d22565b3480156107fd57600080fd5b5060155463ffffffff165b60405163ffffffff909116815260200161039c565b34801561082957600080fd5b50610414611d6d565b34801561083e57600080fd5b506103e761084d366004613cb8565b611e41565b34801561085e57600080fd5b506103e7611e71565b34801561087357600080fd5b50610414610882366004613b5c565b611e80565b34801561089357600080fd5b506103ba611fdf565b3480156108a857600080fd5b506105116108b73660046139af565b611fee565b3480156108c857600080fd5b50610511612009565b3480156108dd57600080fd5b5060185462010000900460ff16610390565b3480156108fb57600080fd5b506103e7612016565b610414610912366004613cb8565b61210b565b34801561092357600080fd5b50610414610932366004613ab1565b6122d3565b34801561094357600080fd5b50601554600160201b900463ffffffff16610808565b34801561096557600080fd5b506103906109743660046139af565b6122e5565b34801561098557600080fd5b50601354610511565b34801561099a57600080fd5b506104146109a9366004613a46565b61234f565b3480156109ba57600080fd5b5061080861238e565b3480156109cf57600080fd5b506103ba6109de366004613cb8565b6123ad565b3480156109ef57600080fd5b506105116123e7565b348015610a0457600080fd5b506104146123f4565b348015610a1957600080fd5b50610511610a283660046139af565b6001600160a01b03166000908152600d602052604090205490565b348015610a4f57600080fd5b506104146124c7565b348015610a6457600080fd5b506103ba61259e565b348015610a7957600080fd5b50610511610a883660046139af565b6125ad565b348015610a9957600080fd5b50610511610aa83660046139af565b601a6020526000908152604090205481565b348015610ac657600080fd5b50600c54610511565b348015610adb57600080fd5b50601d54610511565b348015610af057600080fd5b50610414610aff366004613cb8565b6125c8565b348015610b1057600080fd5b50610390610b1f3660046139cc565b6127e6565b348015610b3057600080fd5b50610414610b3f3660046139af565b6128ba565b348015610b5057600080fd5b50601c54610511565b348015610b6557600080fd5b5061051161296a565b348015610b7a57600080fd5b50610414610b89366004613cb8565b612977565b348015610b9a57600080fd5b506104146129d9565b6000610bad612ab6565b905090565b60006001600160e01b031982166380ac58cd60e01b1480610be357506001600160e01b03198216635b5e139f60e01b145b80610bfe57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610c139061421e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3f9061421e565b8015610c8c5780601f10610c6157610100808354040283529160200191610c8c565b820191906000526020600020905b815481529060010190602001808311610c6f57829003601f168201915b5050505050905090565b6000610ca182612b12565b610d075760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b3360008051602061435d8339815191521480610d4c57503360008051602061437d833981519152145b80610d6457503360008051602061439d833981519152145b610d805760405162461bcd60e51b8152600401610cfe90614055565b60155461138890610d9e90600160201b900463ffffffff1683614189565b63ffffffff161115610e0a5760405162461bcd60e51b815260206004820152602f60248201527f546865206162736f6c757465206d6178696d756d20737570706c792063616e2760448201526e3a1031329037bb32b9101a9818181760891b6064820152608401610cfe565b6015805463ffffffff191663ffffffff92909216919091179055565b6000610e3182611bc2565b9050806001600160a01b0316836001600160a01b03161415610e9f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610cfe565b806001600160a01b0316610eb1610ba3565b6001600160a01b03161480610ecd5750610ecd81610b1f610ba3565b610f3a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610cfe565b610f448383612b2f565b505050565b60198181548110610f5957600080fd5b6000918252602090912001546001600160a01b0316905081565b60408051606081810183526001600160a01b03881660008181526008602090815290859020548452830152918101869052610fb18782878787612b9d565b6110075760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610cfe565b6001600160a01b03871660009081526008602052604090205461102b906001612c8d565b6001600160a01b0388166000908152600860205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b9061107b90899033908a90613de6565b60405180910390a1600080306001600160a01b0316888a6040516020016110a3929190613d58565b60408051601f19818403018152908290526110bd91613d3c565b6000604051808303816000865af19150503d80600081146110fa576040519150601f19603f3d011682016040523d82523d6000602084013e6110ff565b606091505b5091509150816111505760405162461bcd60e51b815260206004820152601c60248201527b119d5b98dd1a5bdb8818d85b1b081b9bdd081cdd58d8d95cdcd99d5b60221b6044820152606401610cfe565b98975050505050505050565b3360008051602061435d833981519152148061118557503360008051602061437d833981519152145b8061119d57503360008051602061439d833981519152145b6111b95760405162461bcd60e51b8152600401610cfe90614055565b601355565b6001600160a01b0381166000908152600d60205260409020546111f35760405162461bcd60e51b8152600401610cfe90613fc4565b60006111fe600c5490565b6112089047614171565b9050600061121f838361121a86611fee565b612ca0565b90508061123e5760405162461bcd60e51b8152600401610cfe9061400a565b6001600160a01b0383166000908152600e602052604081208054839290611266908490614171565b9250508190555080600c600082825461127f9190614171565b9091555061128f90508382612cde565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516112c0929190613dcd565b60405180910390a1505050565b3360008051602061435d83398151915214806112f657503360008051602061437d833981519152145b8061130e57503360008051602061439d833981519152145b61132a5760405162461bcd60e51b8152600401610cfe90614055565b60185460ff1615156001146113815760405162461bcd60e51b815260206004820152601d60248201527f4d696e74696e6720697320616c726561647920666f7262696464656e2e0000006044820152606401610cfe565b6018805460ff19169055565b3360008051602061435d83398151915214806113b657503360008051602061437d833981519152145b806113ce57503360008051602061439d833981519152145b6113ea5760405162461bcd60e51b8152600401610cfe90614055565b60185460ff161561143b5760405162461bcd60e51b815260206004820152601b60248201527a26b4b73a34b7339034b99030b63932b0b23c9030b63637bbb2b21760291b6044820152606401610cfe565b6018805460ff19166001179055565b3360008051602061435d833981519152148061147357503360008051602061437d833981519152145b8061148b57503360008051602061439d833981519152145b6114a75760405162461bcd60e51b8152600401610cfe90614055565b601b55565b6114bd6114b7610ba3565b82612df4565b6114d95760405162461bcd60e51b8152600401610cfe90614120565b610f44838383612eb6565b3360008051602061435d833981519152148061150d57503360008051602061437d833981519152145b8061152557503360008051602061439d833981519152145b6115415760405162461bcd60e51b8152600401610cfe90614055565b601c55565b6000600261155360175490565b6016546115609190614171565b610bad91906141db565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b610f448383836040518060200160405280600081525061234f565b60185460ff6101009091041615156001146116215760405162461bcd60e51b815260206004820152602b60248201527f57686974656c697374206d696e74696e672069732063757272656e746c79206e60448201526a37ba1030b63637bbb2b21760a91b6064820152608401610cfe565b60018110156116425760405162461bcd60e51b8152600401610cfe906140a6565b6000600161164f60165490565b61165991906141db565b60155490915063ffffffff1661166f8383614171565b111561168d5760405162461bcd60e51b8152600401610cfe90613f64565b60145461169a90836141bc565b34146116b85760405162461bcd60e51b8152600401610cfe90613eb8565b336000908152601a6020526040902054601b546116d58483614171565b11156117525760405162461bcd60e51b815260206004820152605260248201526000805160206143dd83398151915260448201527f65727320776f756c6420676f206f766572207468652077616c6c6574207768696064820152713a32b634b9ba1036b4b73a103634b6b4ba1760711b608482015260a401610cfe565b6000805b84811015611792576117666123e7565b91506117723383613044565b611780601680546001019055565b8061178a81614259565b915050611756565b50336000908152601a6020526040812080548692906117b2908490614171565b909155505050505050565b6001600160a01b0381166000908152600d60205260409020546117f25760405162461bcd60e51b8152600401610cfe90613fc4565b60006117fd836125ad565b6040516370a0823160e01b81526001600160a01b038516906370a0823190611829903090600401613db9565b60206040518083038186803b15801561184157600080fd5b505afa158015611855573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118799190613cd1565b6118839190614171565b90506000611896838361121a878761156a565b9050806118b55760405162461bcd60e51b8152600401610cfe9061400a565b6001600160a01b038085166000908152601160209081526040808320938716835292905290812080548392906118ec908490614171565b90915550506001600160a01b03841660009081526010602052604081208054839290611919908490614171565b9091555061192a905084848361305e565b836001600160a01b03167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611965929190613dcd565b60405180910390a250505050565b60606019805480602002602001604051908101604052809291908181526020018280548015610c8c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116119ad575050505050905090565b3360008051602061435d83398151915214806119fd57503360008051602061437d833981519152145b80611a1557503360008051602061439d833981519152145b611a315760405162461bcd60e51b8152600401610cfe90614055565b611a3a816122e5565b15611a935760405162461bcd60e51b8152602060048201526024808201527f4164647265737320697320616c7265616479206f6e20746865206c75636b796c60448201526334b9ba1760e11b6064820152608401610cfe565b601980546001810182556000919091527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950180546001600160a01b0319166001600160a01b0392909216919091179055565b3360008051602061435d8339815191521480611b0e57503360008051602061437d833981519152145b80611b2657503360008051602061439d833981519152145b611b425760405162461bcd60e51b8152600401610cfe90614055565b610f446019838361382e565b3360008051602061435d8339815191521480611b7757503360008051602061437d833981519152145b80611b8f57503360008051602061439d833981519152145b611bab5760405162461bcd60e51b8152600401610cfe90614055565b8051611bbe906012906020840190613891565b5050565b6000818152600260205260408120546001600160a01b031680610bfe5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610cfe565b3360008051602061435d8339815191521480611c6257503360008051602061437d833981519152145b80611c7a57503360008051602061439d833981519152145b611c965760405162461bcd60e51b8152600401610cfe90614055565b601d55565b60006001600160a01b038216611d065760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610cfe565b506001600160a01b031660009081526003602052604090205490565b611d2a610ba3565b6001600160a01b0316611d3b611e71565b6001600160a01b031614611d615760405162461bcd60e51b8152600401610cfe906140eb565b611d6b60006130b4565b565b3360008051602061435d8339815191521480611d9657503360008051602061437d833981519152145b80611dae57503360008051602061439d833981519152145b611dca5760405162461bcd60e51b8152600401610cfe90614055565b60185462010000900460ff161515600114611e335760405162461bcd60e51b815260206004820152602360248201527f4c75636b79206d696e74696e6720697320616c726561647920666f726269646460448201526232b71760e91b6064820152608401610cfe565b6018805462ff000019169055565b6000600f8281548110611e5657611e566142b4565b6000918252602090912001546001600160a01b031692915050565b6009546001600160a01b031690565b3360008051602061435d8339815191521480611ea957503360008051602061437d833981519152145b80611ec157503360008051602061439d833981519152145b611edd5760405162461bcd60e51b8152600401610cfe90614055565b60006001611eea60175490565b611ef491906141db565b601554909150600160201b900463ffffffff16611f118383614171565b1115611f985760405162461bcd60e51b815260206004820152604a60248201527f5468652072657175657374656420616d6f756e74206f6620506978656c20446560448201527f65727320776f756c6420676f206f76657220746865206d6178696d756d20746560648201526930b69039bab838363c9760b11b608482015260a401610cfe565b6000805b83811015611fd857611fac6123e7565b9150611fb88583613044565b611fc6601780546001019055565b80611fd081614259565b915050611f9c565b5050505050565b606060018054610c139061421e565b6001600160a01b03166000908152600e602052604090205490565b6000600161156060175490565b60003360008051602061435d833981519152148061204157503360008051602061437d833981519152145b8061205957503360008051602061439d833981519152145b6120755760405162461bcd60e51b8152600401610cfe90614055565b6000600261208260175490565b60165461208f9190614171565b61209991906141db565b90506000816120a6613106565b6120b09190614274565b6120bb906001614171565b905060006120c882611bc2565b90507fa11a9e464dd09a0c07406d9579a023cafcdba189a4855adb41614aa19b7f26e081426040516120fb929190613dcd565b60405180910390a1925050505b90565b60185460ff16151560011461216c5760405162461bcd60e51b815260206004820152602160248201527f4d696e74696e672069732063757272656e746c79206e6f7420616c6c6f7765646044820152601760f91b6064820152608401610cfe565b600181101561218d5760405162461bcd60e51b8152600401610cfe906140a6565b6000600161219a60165490565b6121a491906141db565b60155490915063ffffffff166121ba8383614171565b11156121d85760405162461bcd60e51b8152600401610cfe90613f64565b6013546121e590836141bc565b34146122035760405162461bcd60e51b8152600401610cfe90613eb8565b336000908152601a6020526040902054601d546122208483614171565b11156122935760405162461bcd60e51b815260206004820152604860248201526000805160206143dd83398151915260448201527f65727320776f756c6420676f206f766572207468652077616c6c6574206d696e6064820152673a103634b6b4ba1760c11b608482015260a401610cfe565b6000805b84811015611792576122a76123e7565b91506122b33383613044565b6122c1601680546001019055565b806122cb81614259565b915050612297565b611bbe6122de610ba3565b8383613142565b6000805b60195481101561234657826001600160a01b031660198281548110612310576123106142b4565b6000918252602090912001546001600160a01b031614156123345750600192915050565b8061233e81614259565b9150506122e9565b50600092915050565b61236061235a610ba3565b83612df4565b61237c5760405162461bcd60e51b8152600401610cfe90614120565b6123888484848461320d565b50505050565b601554600090610bad9063ffffffff600160201b820481169116614189565b60606123b761259e565b6123c083613240565b6040516020016123d1929190613d8a565b6040516020818303038152906040529050919050565b6000600161155360175490565b3360008051602061435d833981519152148061241d57503360008051602061437d833981519152145b8061243557503360008051602061439d833981519152145b6124515760405162461bcd60e51b8152600401610cfe90614055565b60185462010000900460ff16156124b45760405162461bcd60e51b815260206004820152602160248201527f4c75636b79206d696e74696e6720697320616c726561647920616c6c6f7765646044820152601760f91b6064820152608401610cfe565b6018805462ff0000191662010000179055565b3360008051602061435d83398151915214806124f057503360008051602061437d833981519152145b8061250857503360008051602061439d833981519152145b6125245760405162461bcd60e51b8152600401610cfe90614055565b60185460ff6101009091041615156001146125915760405162461bcd60e51b815260206004820152602760248201527f57686974656c697374206d696e74696e6720697320616c726561647920666f726044820152663134b23232b71760c91b6064820152608401610cfe565b6018805461ff0019169055565b606060128054610c139061421e565b6001600160a01b031660009081526010602052604090205490565b60185462010000900460ff1615156001146126355760405162461bcd60e51b815260206004820152602760248201527f4c75636b79206d696e74696e672069732063757272656e746c79206e6f742061604482015266363637bbb2b21760c91b6064820152608401610cfe565b60018110156126565760405162461bcd60e51b8152600401610cfe906140a6565b6000600161266360165490565b61266d91906141db565b60155490915063ffffffff166126838383614171565b11156126a15760405162461bcd60e51b8152600401610cfe90613f64565b6126aa336122e5565b15156001146127095760405162461bcd60e51b815260206004820152602560248201527f596f7520617265206e6f74206f6e65206f6620746865206c75636b792077696e6044820152643732b9399760d91b6064820152608401610cfe565b336000908152601a6020526040902054601c546127268483614171565b11156127a65760405162461bcd60e51b815260206004820152605560248201526000805160206143dd83398151915260448201527f65727320776f756c6420676f206f766572207468652077616c6c6574206c756360648201527435bc903bb4b73732b91036b4b73a103634b6b4ba1760591b608482015260a401610cfe565b6000805b84811015611792576127ba6123e7565b91506127c63383613044565b6127d4601680546001019055565b806127de81614259565b9150506127aa565b600a5460405163c455279160e01b81526000916001600160a01b039081169190841690829063c45527919061281f908890600401613db9565b60206040518083038186803b15801561283757600080fd5b505afa15801561284b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286f9190613c53565b6001600160a01b03161415612888576001915050610bfe565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b6128c2610ba3565b6001600160a01b03166128d3611e71565b6001600160a01b0316146128f95760405162461bcd60e51b8152600401610cfe906140eb565b6001600160a01b03811661295e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cfe565b612967816130b4565b50565b6000600161156060165490565b3360008051602061435d83398151915214806129a057503360008051602061437d833981519152145b806129b857503360008051602061439d833981519152145b6129d45760405162461bcd60e51b8152600401610cfe90614055565b601455565b3360008051602061435d8339815191521480612a0257503360008051602061437d833981519152145b80612a1a57503360008051602061439d833981519152145b612a365760405162461bcd60e51b8152600401610cfe90614055565b601854610100900460ff1615612a9c5760405162461bcd60e51b815260206004820152602560248201527f57686974656c697374206d696e74696e6720697320616c726561647920616c6c60448201526437bbb2b21760d91b6064820152608401610cfe565b6018805461ff001916610100179055565b80546001019055565b600033301415612b0d57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506121089050565b503390565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b6482611bc2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616612c035760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610cfe565b6001612c16612c118761333d565b6133ba565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612c64573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000612c998284614171565b9392505050565b600b546001600160a01b0384166000908152600d602052604081205490918391612cca90866141bc565b612cd491906141a8565b6128b291906141db565b80471015612d2e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610cfe565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612d7b576040519150601f19603f3d011682016040523d82523d6000602084013e612d80565b606091505b5050905080610f445760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726044820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b6064820152608401610cfe565b6000612dff82612b12565b612e605760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610cfe565b6000612e6b83611bc2565b9050806001600160a01b0316846001600160a01b03161480612ea65750836001600160a01b0316612e9b84610c96565b6001600160a01b0316145b806128b257506128b281856127e6565b826001600160a01b0316612ec982611bc2565b6001600160a01b031614612f315760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610cfe565b6001600160a01b038216612f935760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610cfe565b612f9e600082612b2f565b6001600160a01b0383166000908152600360205260408120805460019290612fc79084906141db565b90915550506001600160a01b0382166000908152600360205260408120805460019290612ff5908490614171565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716916000805160206143bd83398151915291a4505050565b611bbe8282604051806020016040528060008152506133ea565b610f448363a9059cbb60e01b848460405160240161307d929190613dcd565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261341d565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60004244604051602001613124929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905090565b816001600160a01b0316836001600160a01b031614156131a05760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610cfe565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613218848484612eb6565b613224848484846134ef565b6123885760405162461bcd60e51b8152600401610cfe90613f12565b6060816132645750506040805180820190915260018152600360fc1b602082015290565b8160005b811561328e578061327881614259565b91506132879050600a836141a8565b9150613268565b6000816001600160401b038111156132a8576132a86142ca565b6040519080825280601f01601f1916602001820160405280156132d2576020820181803683370190505b5090505b84156128b2576132e76001836141db565b91506132f4600a86614274565b6132ff906030614171565b60f81b818381518110613314576133146142b4565b60200101906001600160f81b031916908160001a905350613336600a866141a8565b94506132d6565b600060405180608001604052806043815260200161431a604391398051602091820120835184830151604080870151805190860120905161339d950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006133c560075490565b60405161190160f01b602082015260228101919091526042810183905260620161339d565b6133f48383613603565b61340160008484846134ef565b610f445760405162461bcd60e51b8152600401610cfe90613f12565b6000613472826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166137239092919063ffffffff16565b805190915015610f4457808060200190518101906134909190613bfc565b610f445760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cfe565b60006001600160a01b0384163b156135f857836001600160a01b031663150b7a02613518610ba3565b8786866040518563ffffffff1660e01b815260040161353a9493929190613e1b565b602060405180830381600087803b15801561355457600080fd5b505af1925050508015613584575060408051601f3d908101601f1916820190925261358191810190613c36565b60015b6135de573d8080156135b2576040519150601f19603f3d011682016040523d82523d6000602084013e6135b7565b606091505b5080516135d65760405162461bcd60e51b8152600401610cfe90613f12565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506128b2565b506001949350505050565b6001600160a01b0382166136595760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610cfe565b61366281612b12565b156136ae5760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610cfe565b6001600160a01b03821660009081526003602052604081208054600192906136d7908490614171565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392906000805160206143bd833981519152908290a45050565b60606128b2848460008585843b61377c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cfe565b600080866001600160a01b031685876040516137989190613d3c565b60006040518083038185875af1925050503d80600081146137d5576040519150601f19603f3d011682016040523d82523d6000602084013e6137da565b606091505b50915091506137ea8282866137f5565b979650505050505050565b60608315613804575081612c99565b8251156138145782518084602001fd5b8160405162461bcd60e51b8152600401610cfe9190613ea5565b828054828255906000526020600020908101928215613881579160200282015b828111156138815781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061384e565b5061388d929150613905565b5090565b82805461389d9061421e565b90600052602060002090601f0160209004810192826138bf5760008555613881565b82601f106138d857805160ff1916838001178555613881565b82800160010185558215613881579182015b828111156138815782518255916020019190600101906138ea565b5b8082111561388d5760008155600101613906565b60006001600160401b0380841115613934576139346142ca565b604051601f8501601f19908116603f0116810190828211818310171561395c5761395c6142ca565b8160405280935085815286868601111561397557600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126139a057600080fd5b612c998383356020850161391a565b6000602082840312156139c157600080fd5b8135612c99816142e0565b600080604083850312156139df57600080fd5b82356139ea816142e0565b915060208301356139fa816142e0565b809150509250929050565b600080600060608486031215613a1a57600080fd5b8335613a25816142e0565b92506020840135613a35816142e0565b929592945050506040919091013590565b60008060008060808587031215613a5c57600080fd5b8435613a67816142e0565b93506020850135613a77816142e0565b92506040850135915060608501356001600160401b03811115613a9957600080fd5b613aa58782880161398f565b91505092959194509250565b60008060408385031215613ac457600080fd5b8235613acf816142e0565b915060208301356139fa816142f5565b600080600080600060a08688031215613af757600080fd5b8535613b02816142e0565b945060208601356001600160401b03811115613b1d57600080fd5b613b298882890161398f565b9450506040860135925060608601359150608086013560ff81168114613b4e57600080fd5b809150509295509295909350565b60008060408385031215613b6f57600080fd5b8235613b7a816142e0565b946020939093013593505050565b60008060208385031215613b9b57600080fd5b82356001600160401b0380821115613bb257600080fd5b818501915085601f830112613bc657600080fd5b813581811115613bd557600080fd5b8660208260051b8501011115613bea57600080fd5b60209290920196919550909350505050565b600060208284031215613c0e57600080fd5b8151612c99816142f5565b600060208284031215613c2b57600080fd5b8135612c9981614303565b600060208284031215613c4857600080fd5b8151612c9981614303565b600060208284031215613c6557600080fd5b8151612c99816142e0565b600060208284031215613c8257600080fd5b81356001600160401b03811115613c9857600080fd5b8201601f81018413613ca957600080fd5b6128b28482356020840161391a565b600060208284031215613cca57600080fd5b5035919050565b600060208284031215613ce357600080fd5b5051919050565b600060208284031215613cfc57600080fd5b813563ffffffff81168114612c9957600080fd5b60008151808452613d288160208601602086016141f2565b601f01601f19169290920160200192915050565b60008251613d4e8184602087016141f2565b9190910192915050565b60008351613d6a8184602088016141f2565b60609390931b6001600160601b0319169190920190815260140192915050565b60008351613d9c8184602088016141f2565b835190830190613db08183602088016141f2565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03848116825283166020820152606060408201819052600090613e1290830184613d10565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613e4e90830184613d10565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613e995783516001600160a01b031683529284019291840191600101613e74565b50909695505050505050565b602081526000612c996020830184613d10565b6020808252603a908201527f496e636f7272656374207061696420616d6f756e7420666f72206d696e74696e60408201527933903a3432903232b9b4b932b2102834bc32b6102232b2b9399760311b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252604c908201526000805160206143dd83398151915260408201527f65727320776f756c6420676f206f76657220746865206d6178696d756d20707560608201526b313634b19039bab838363c9760a11b608082015260a00190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60208082526031908201527f4f6e6c792074686520506978656c204465657273207465616d2063616e2063616040820152703636103a3434b990333ab731ba34b7b71760791b606082015260800190565b60208082526025908201527f4174206c65617374203120506978656c2044656572206d757374206265206d69604082015264373a32b21760d91b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561418457614184614288565b500190565b600063ffffffff808316818516808303821115613db057613db0614288565b6000826141b7576141b761429e565b500490565b60008160001904831182151516156141d6576141d6614288565b500290565b6000828210156141ed576141ed614288565b500390565b60005b8381101561420d5781810151838201526020016141f5565b838111156123885750506000910152565b600181811c9082168061423257607f821691505b6020821081141561425357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561426d5761426d614288565b5060010190565b6000826142835761428361429e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461296757600080fd5b801515811461296757600080fd5b6001600160e01b03198116811461296757600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529000000000000000000000000018db035c10ebabd0c6638f4716c867bffd22bf9000000000000000000000000339891675c4ecd57fd3429566d9cd58cd895094900000000000000000000000070627dbab4830aef56385fa2e42f5f582904a528ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef54686520726571756573746564206e756d626572206f6620506978656c204465a2646970667358221220af0e1a458fc979f8173af6f38bc46744f6de6ed95da1c0b31d84a53ec3d2917c64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000039ab4e2ae2b735226b83665bb9df9604b4f98e9d000000000000000000000000339891675c4ecd57fd3429566d9cd58cd8950949000000000000000000000000018db035c10ebabd0c6638f4716c867bffd22bf900000000000000000000000070627dbab4830aef56385fa2e42f5f582904a5280000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000012400000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000060000000000000000000000005f991bdcccff8a5c6c00a5a708dc4f649eb5887c000000000000000000000000e93b6fd78e1f5b82e951b48d55ab997371bc3659000000000000000000000000289f74138b18002ad2b388787f148f2e456359ef000000000000000000000000cc82a2380f9dbbc1fdd0fed9b35c391a5046934500000000000000000000000056da938600dd4c26ef493c637f93aab203c0c6860000000000000000000000000064eda2574585714fa4956c4c003d4067931880

-----Decoded View---------------
Arg [0] : payees (address[]): 0x39Ab4e2ae2b735226b83665bB9DF9604b4f98E9D,0x339891675C4ECD57FD3429566D9CD58CD8950949,0x018DB035C10ebabd0C6638F4716C867BFFd22Bf9,0x70627DBab4830Aef56385fa2e42f5F582904A528
Arg [1] : shares (uint256[]): 292,236,236,236
Arg [2] : proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [3] : luckyAddresses (address[]): 0x5f991BdCCCff8a5C6C00A5A708dc4f649Eb5887C,0xe93b6Fd78e1f5B82e951B48d55Ab997371BC3659,0x289F74138b18002ad2b388787f148F2E456359eF,0xcc82A2380F9dbbc1fdD0feD9b35C391A50469345,0x56da938600DD4c26eF493c637f93AaB203c0C686,0x0064eDa2574585714fA4956C4c003d4067931880

-----Encoded View---------------
21 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 00000000000000000000000039ab4e2ae2b735226b83665bb9df9604b4f98e9d
Arg [6] : 000000000000000000000000339891675c4ecd57fd3429566d9cd58cd8950949
Arg [7] : 000000000000000000000000018db035c10ebabd0c6638f4716c867bffd22bf9
Arg [8] : 00000000000000000000000070627dbab4830aef56385fa2e42f5f582904a528
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000124
Arg [11] : 00000000000000000000000000000000000000000000000000000000000000ec
Arg [12] : 00000000000000000000000000000000000000000000000000000000000000ec
Arg [13] : 00000000000000000000000000000000000000000000000000000000000000ec
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [15] : 0000000000000000000000005f991bdcccff8a5c6c00a5a708dc4f649eb5887c
Arg [16] : 000000000000000000000000e93b6fd78e1f5b82e951b48d55ab997371bc3659
Arg [17] : 000000000000000000000000289f74138b18002ad2b388787f148f2e456359ef
Arg [18] : 000000000000000000000000cc82a2380f9dbbc1fdd0fed9b35c391a50469345
Arg [19] : 00000000000000000000000056da938600dd4c26ef493c637f93aab203c0c686
Arg [20] : 0000000000000000000000000064eda2574585714fa4956c4c003d4067931880


Deployed Bytecode Sourcemap

69172:15487:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58680:40;58696:12;:10;:12::i;:::-;58710:9;58680:40;;;;;;;:::i;:::-;;;;;;;;69172:15487;;;;;42996:305;;;;;;;;;;-1:-1:-1;42996:305:0;;;;;:::i;:::-;;:::i;:::-;;;12391:14:1;;12384:22;12366:41;;12354:2;12339:18;42996:305:0;;;;;;;;43941:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45500:221::-;;;;;;;;;;-1:-1:-1;45500:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;76431:239::-;;;;;;;;;;-1:-1:-1;76431:239:0;;;;;:::i;:::-;;:::i;:::-;;45023:411;;;;;;;;;;-1:-1:-1;45023:411:0;;;;;:::i;:::-;;:::i;69931:26::-;;;;;;;;;;-1:-1:-1;69931:26:0;;;;;:::i;:::-;;:::i;11245:1151::-;;;;;;:::i;:::-;;:::i;587:43::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;587:43:0;;;;;75369:115;;;;;;;;;;-1:-1:-1;75369:115:0;;;;;:::i;:::-;;:::i;60466:566::-;;;;;;;;;;-1:-1:-1;60466:566:0;;;;;:::i;:::-;;:::i;75179:182::-;;;;;;;;;;;;;:::i;74992:179::-;;;;;;;;;;;;;:::i;1596:101::-;;;;;;;;;;-1:-1:-1;1674:15:0;;1596:101;;;12564:25:1;;;12552:2;12537:18;1596:101:0;12418:177:1;75774:151:0;;;;;;;;;;-1:-1:-1;75774:151:0;;;;;:::i;:::-;;:::i;46250:339::-;;;;;;;;;;-1:-1:-1;46250:339:0;;;;;:::i;:::-;;:::i;75933:139::-;;;;;;;;;;-1:-1:-1;75933:139:0;;;;;:::i;:::-;;:::i;81908:124::-;;;;;;;;;;-1:-1:-1;81908:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;82003:21:0;81976:7;82003:21;;;:13;:21;;;;;;;81908:124;83155:95;;;;;;;;;;-1:-1:-1;83228:14:0;;;;83155:95;;12822:107;;;;;;;;;;-1:-1:-1;12822:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;12909:12:0;12875:13;12909:12;;;:6;:12;;;;;;;12822:107;81654:119;;;;;;;;;;-1:-1:-1;81741:24:0;;81654:119;;1705:161;;;;;;;;;;-1:-1:-1;1819:9:0;1705:161;;82290:143;;;;;;;;;;;;;:::i;81424:113::-;;;;;;;;;;-1:-1:-1;81508:21:0;;81424:113;;58811:91;;;;;;;;;;-1:-1:-1;58882:12:0;;58811:91;;83258:113;;;;;;;;;;-1:-1:-1;83340:23:0;;;;;;;83258:113;;59940:135;;;;;;;;;;-1:-1:-1;59940:135:0;;;;;:::i;:::-;;:::i;46660:185::-;;;;;;;;;;-1:-1:-1;46660:185:0;;;;;:::i;:::-;;:::i;77993:1353::-;;;;;;:::i;:::-;;:::i;61300:641::-;;;;;;;;;;-1:-1:-1;61300:641:0;;;;;:::i;:::-;;:::i;83049:98::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;76204:219::-;;;;;;;;;;-1:-1:-1;76204:219:0;;;;;:::i;:::-;;:::i;76080:116::-;;;;;;;;;;-1:-1:-1;76080:116:0;;;;;:::i;:::-;;:::i;73790:102::-;;;;;;;;;;-1:-1:-1;73790:102:0;;;;;:::i;:::-;;:::i;43635:239::-;;;;;;;;;;-1:-1:-1;43635:239:0;;;;;:::i;:::-;;:::i;75651:115::-;;;;;;;;;;-1:-1:-1;75651:115:0;;;;;:::i;:::-;;:::i;43365:208::-;;;;;;;;;;-1:-1:-1;43365:208:0;;;;;:::i;:::-;;:::i;64752:103::-;;;;;;;;;;;;;:::i;82441:97::-;;;;;;;;;;-1:-1:-1;82515:15:0;;;;82441:97;;;32859:10:1;32847:23;;;32829:42;;32817:2;32802:18;82441:97:0;32685:192:1;74781:203:0;;;;;;;;;;;;;:::i;60166:100::-;;;;;;;;;;-1:-1:-1;60166:100:0;;;;;:::i;:::-;;:::i;64101:87::-;;;;;;;;;;;;;:::i;79354:590::-;;;;;;;;;;-1:-1:-1;79354:590:0;;;;;:::i;:::-;;:::i;44110:104::-;;;;;;;;;;;;;:::i;59662:109::-;;;;;;;;;;-1:-1:-1;59662:109:0;;;;;:::i;:::-;;:::i;82167:115::-;;;;;;;;;;;;;:::i;83379:105::-;;;;;;;;;;-1:-1:-1;83457:19:0;;;;;;;83379:105;;83830:647;;;;;;;;;;;;;:::i;76708:1277::-;;;;;;:::i;:::-;;:::i;45793:155::-;;;;;;;;;;-1:-1:-1;45793:155:0;;;;;:::i;:::-;;:::i;82546:93::-;;;;;;;;;;-1:-1:-1;82618:13:0;;-1:-1:-1;;;82618:13:0;;;;82546:93;;83492:289;;;;;;;;;;-1:-1:-1;83492:289:0;;;;;:::i;:::-;;:::i;81321:95::-;;;;;;;;;;-1:-1:-1;81396:12:0;;81321:95;;46916:328;;;;;;;;;;-1:-1:-1;46916:328:0;;;;;:::i;:::-;;:::i;82647:112::-;;;;;;;;;;;;;:::i;67856:175::-;;;;;;;;;;-1:-1:-1;67856:175:0;;;;;:::i;:::-;;:::i;82767:274::-;;;;;;;;;;;;;:::i;74573:200::-;;;;;;;;;;;;;:::i;59458:105::-;;;;;;;;;;-1:-1:-1;59458:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;59539:16:0;59512:7;59539:16;;;:7;:16;;;;;;;59458:105;74346:219;;;;;;;;;;;;;:::i;73673:109::-;;;;;;;;;;;;;:::i;59248:119::-;;;;;;;;;;-1:-1:-1;59248:119:0;;;;;:::i;:::-;;:::i;69964:48::-;;;;;;;;;;-1:-1:-1;69964:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;58996:95;;;;;;;;;;-1:-1:-1;59069:14:0;;58996:95;;81545:101;;;;;;;;;;-1:-1:-1;81623:15:0;;81545:101;;79952:1333;;;;;;;;;;-1:-1:-1;79952:1333:0;;;;;:::i;:::-;;:::i;68163:445::-;;;;;;;;;;-1:-1:-1;68163:445:0;;;;;:::i;:::-;;:::i;65010:201::-;;;;;;;;;;-1:-1:-1;65010:201:0;;;;;:::i;:::-;;:::i;81781:119::-;;;;;;;;;;-1:-1:-1;81868:24:0;;81781:119;;82040;;;;;;;;;;;;;:::i;75492:151::-;;;;;;;;;;-1:-1:-1;75492:151:0;;;;;:::i;:::-;;:::i;74122:216::-;;;;;;;;;;;;;:::i;73900:171::-;74000:14;74039:24;:22;:24::i;:::-;74032:31;;73900:171;:::o;42996:305::-;43098:4;-1:-1:-1;;;;;;43135:40:0;;-1:-1:-1;;;43135:40:0;;:105;;-1:-1:-1;;;;;;;43192:48:0;;-1:-1:-1;;;43192:48:0;43135:105;:158;;;-1:-1:-1;;;;;;;;;;18476:40:0;;;43257:36;43115:178;42996:305;-1:-1:-1;;42996:305:0:o;43941:100::-;43995:13;44028:5;44021:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43941:100;:::o;45500:221::-;45576:7;45604:16;45612:7;45604;:16::i;:::-;45596:73;;;;-1:-1:-1;;;45596:73:0;;28064:2:1;45596:73:0;;;28046:21:1;28103:2;28083:18;;;28076:30;28142:34;28122:18;;;28115:62;-1:-1:-1;;;28193:18:1;;;28186:42;28245:19;;45596:73:0;;;;;;;;;-1:-1:-1;45689:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45689:24:0;;45500:221::o;76431:239::-;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;76542:13:::1;::::0;76559:4:::1;::::0;76521:34:::1;::::0;-1:-1:-1;;;76542:13:0;::::1;;;76521:18:::0;:34:::1;:::i;:::-;:42;;;;76513:102;;;::::0;-1:-1:-1;;;76513:102:0;;26071:2:1;76513:102:0::1;::::0;::::1;26053:21:1::0;26110:2;26090:18;;;26083:30;26149:34;26129:18;;;26122:62;-1:-1:-1;;;26200:18:1;;;26193:45;26255:19;;76513:102:0::1;25869:411:1::0;76513:102:0::1;76626:15;:36:::0;;-1:-1:-1;;76626:36:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;76431:239::o;45023:411::-;45104:13;45120:23;45135:7;45120:14;:23::i;:::-;45104:39;;45168:5;-1:-1:-1;;;;;45162:11:0;:2;-1:-1:-1;;;;;45162:11:0;;;45154:57;;;;-1:-1:-1;;;45154:57:0;;30461:2:1;45154:57:0;;;30443:21:1;30500:2;30480:18;;;30473:30;30539:34;30519:18;;;30512:62;-1:-1:-1;;;30590:18:1;;;30583:31;30631:19;;45154:57:0;30259:397:1;45154:57:0;45262:5;-1:-1:-1;;;;;45246:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;45246:21:0;;:62;;;;45271:37;45288:5;45295:12;:10;:12::i;45271:37::-;45224:168;;;;-1:-1:-1;;;45224:168:0;;24825:2:1;45224:168:0;;;24807:21:1;24864:2;24844:18;;;24837:30;24903:34;24883:18;;;24876:62;-1:-1:-1;;;24954:18:1;;;24947:54;25018:19;;45224:168:0;24623:420:1;45224:168:0;45405:21;45414:2;45418:7;45405:8;:21::i;:::-;45093:341;45023:411;;:::o;69931:26::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;69931:26:0;;-1:-1:-1;69931:26:0;:::o;11245:1151::-;11503:152;;;11446:12;11503:152;;;;;-1:-1:-1;;;;;11541:19:0;;11471:29;11541:19;;;:6;:19;;;;;;;;;11503:152;;;;;;;;;;;11690:45;11548:11;11503:152;11718:4;11724;11730;11690:6;:45::i;:::-;11668:128;;;;-1:-1:-1;;;11668:128:0;;29248:2:1;11668:128:0;;;29230:21:1;29287:2;29267:18;;;29260:30;29326:34;29306:18;;;29299:62;-1:-1:-1;;;29377:18:1;;;29370:31;29418:19;;11668:128:0;29046:397:1;11668:128:0;-1:-1:-1;;;;;11885:19:0;;;;;;:6;:19;;;;;;:26;;11909:1;11885:23;:26::i;:::-;-1:-1:-1;;;;;11863:19:0;;;;;;:6;:19;;;;;;;:48;;;;11929:126;;;;;11870:11;;12001:10;;12027:17;;11929:126;:::i;:::-;;;;;;;;12166:12;12180:23;12215:4;-1:-1:-1;;;;;12207:18:0;12257:17;12276:11;12240:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;12240:48:0;;;;;;;;;;12207:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12165:134;;;;12318:7;12310:48;;;;-1:-1:-1;;;12310:48:0;;15738:2:1;12310:48:0;;;15720:21:1;15777:2;15757:18;;;15750:30;-1:-1:-1;;;15796:18:1;;;15789:58;15864:18;;12310:48:0;15536:352:1;12310:48:0;12378:10;11245:1151;-1:-1:-1;;;;;;;;11245:1151:0:o;75369:115::-;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;75446:12:::1;:30:::0;75369:115::o;60466:566::-;-1:-1:-1;;;;;60542:16:0;;60561:1;60542:16;;;:7;:16;;;;;;60534:71;;;;-1:-1:-1;;;60534:71:0;;;;;;;:::i;:::-;60618:21;60666:15;59069:14;;;58996:95;60666:15;60642:39;;:21;:39;:::i;:::-;60618:63;;60692:15;60710:58;60726:7;60735:13;60750:17;60759:7;60750:8;:17::i;:::-;60710:15;:58::i;:::-;60692:76;-1:-1:-1;60789:12:0;60781:68;;;;-1:-1:-1;;;60781:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60862:18:0;;;;;;:9;:18;;;;;:29;;60884:7;;60862:18;:29;;60884:7;;60862:29;:::i;:::-;;;;;;;;60920:7;60902:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;60940:35:0;;-1:-1:-1;60958:7:0;60967;60940:17;:35::i;:::-;60991:33;61007:7;61016;60991:33;;;;;;;:::i;:::-;;;;;;;;60523:509;;60466:566;:::o;75179:182::-;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;75238:14:::1;::::0;::::1;;:22;;:14:::0;:22:::1;75230:64;;;::::0;-1:-1:-1;;;75230:64:0;;23643:2:1;75230:64:0::1;::::0;::::1;23625:21:1::0;23682:2;23662:18;;;23655:30;23721:31;23701:18;;;23694:59;23770:18;;75230:64:0::1;23441:353:1::0;75230:64:0::1;75331:14;:22:::0;;-1:-1:-1;;75331:22:0::1;::::0;;75179:182::o;74992:179::-;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;75050:14:::1;::::0;::::1;;:23;75042:63;;;::::0;-1:-1:-1;;;75042:63:0;;16860:2:1;75042:63:0::1;::::0;::::1;16842:21:1::0;16899:2;16879:18;;;16872:30;-1:-1:-1;;;16918:18:1;;;16911:57;16985:18;;75042:63:0::1;16658:351:1::0;75042:63:0::1;75142:14;:21:::0;;-1:-1:-1;;75142:21:0::1;75159:4;75142:21;::::0;;74992:179::o;75774:151::-;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;75869:24:::1;:48:::0;75774:151::o;46250:339::-;46445:41;46464:12;:10;:12::i;:::-;46478:7;46445:18;:41::i;:::-;46437:103;;;;-1:-1:-1;;;46437:103:0;;;;;;;:::i;:::-;46553:28;46563:4;46569:2;46573:7;46553:9;:28::i;75933:139::-;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;76020:24:::1;:44:::0;75933:139::o;82290:143::-;82335:7;82424:1;82394:27;:17;25170:14;;25078:114;82394:27;82362:19;25170:14;82362:59;;;;:::i;:::-;:63;;;;:::i;59940:135::-;-1:-1:-1;;;;;60037:21:0;;;60010:7;60037:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;59940:135::o;46660:185::-;46798:39;46815:4;46821:2;46825:7;46798:39;;;;;;;;;;;;:16;:39::i;77993:1353::-;78126:23;;;;;;;;:31;;:23;:31;78118:87;;;;-1:-1:-1;;;78118:87:0;;14073:2:1;78118:87:0;;;14055:21:1;14112:2;14092:18;;;14085:30;14151:34;14131:18;;;14124:62;-1:-1:-1;;;14202:18:1;;;14195:41;14253:19;;78118:87:0;13871:407:1;78118:87:0;78239:1;78226:9;:14;;78218:64;;;;-1:-1:-1;;;78218:64:0;;;;;;;:::i;:::-;78295:23;78353:1;78321:29;:19;25170:14;;25078:114;78321:29;:33;;;;:::i;:::-;78458:15;;78295:59;;-1:-1:-1;78458:15:0;;78427:27;78445:9;78295:59;78427:27;:::i;:::-;:46;;78419:135;;;;-1:-1:-1;;;78419:135:0;;;;;;;:::i;:::-;78608:21;;78596:33;;:9;:33;:::i;:::-;78583:9;:46;78575:117;;;;-1:-1:-1;;;78575:117:0;;;;;;;:::i;:::-;78796:10;78754:25;78782;;;:13;:25;;;;;;78873:24;;78840:29;78860:9;78782:25;78840:29;:::i;:::-;:57;;78818:190;;;;-1:-1:-1;;;78818:190:0;;18109:2:1;78818:190:0;;;18091:21:1;18148:2;18128:18;;;18121:30;-1:-1:-1;;;;;;;;;;;18167:18:1;;;18160:62;18258:34;18238:18;;;18231:62;-1:-1:-1;;;18309:19:1;;;18302:49;18368:19;;78818:190:0;17907:486:1;78818:190:0;79053:19;;79083:207;79116:9;79106:7;:19;79083:207;;;79167:16;:14;:16::i;:::-;79153:30;;79198:34;79208:10;79220:11;79198:9;:34::i;:::-;79247:31;:19;25289;;25307:1;25289:19;;;25200:127;79247:31;79127:9;;;;:::i;:::-;;;;79083:207;;;-1:-1:-1;79314:10:0;79300:25;;;;:13;:25;;;;;:38;;79329:9;;79300:25;:38;;79329:9;;79300:38;:::i;:::-;;;;-1:-1:-1;;;;;;77993:1353:0:o;61300:641::-;-1:-1:-1;;;;;61382:16:0;;61401:1;61382:16;;;:7;:16;;;;;;61374:71;;;;-1:-1:-1;;;61374:71:0;;;;;;;:::i;:::-;61458:21;61515:20;61529:5;61515:13;:20::i;:::-;61482:30;;-1:-1:-1;;;61482:30:0;;-1:-1:-1;;;;;61482:15:0;;;;;:30;;61506:4;;61482:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;61458:77;;61546:15;61564:65;61580:7;61589:13;61604:24;61613:5;61620:7;61604:8;:24::i;61564:65::-;61546:83;-1:-1:-1;61650:12:0;61642:68;;;;-1:-1:-1;;;61642:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61723:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;61757:7;;61723:21;:41;;61757:7;;61723:41;:::i;:::-;;;;-1:-1:-1;;;;;;;61775:26:0;;;;;;:19;:26;;;;;:37;;61805:7;;61775:26;:37;;61805:7;;61775:37;:::i;:::-;;;;-1:-1:-1;61825:47:0;;-1:-1:-1;61848:5:0;61855:7;61864;61825:22;:47::i;:::-;61909:5;-1:-1:-1;;;;;61888:45:0;;61916:7;61925;61888:45;;;;;;;:::i;:::-;;;;;;;;61363:578;;61300:641;;:::o;83049:98::-;83094:16;83130:9;83123:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;83123:16:0;;;;;;;;;;;;;;;;;;;;;;83049:98;:::o;76204:219::-;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;76293:27:::1;76301:18;76293:7;:27::i;:::-;:36;76285:85;;;::::0;-1:-1:-1;;;76285:85:0;;30056:2:1;76285:85:0::1;::::0;::::1;30038:21:1::0;30095:2;30075:18;;;30068:30;30134:34;30114:18;;;30107:62;-1:-1:-1;;;30185:18:1;;;30178:34;30229:19;;76285:85:0::1;29854:400:1::0;76285:85:0::1;76381:9;:34:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;76381:34:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;76381:34:0::1;-1:-1:-1::0;;;;;76381:34:0;;;::::1;::::0;;;::::1;::::0;;76204:219::o;76080:116::-;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;76164:24:::1;:9;76176:12:::0;;76164:24:::1;:::i;73790:102::-:0;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;73860:24;;::::1;::::0;:14:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;:::-;;73790:102:::0;:::o;43635:239::-;43707:7;43743:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43743:16:0;43778:19;43770:73;;;;-1:-1:-1;;;43770:73:0;;25661:2:1;43770:73:0;;;25643:21:1;25700:2;25680:18;;;25673:30;25739:34;25719:18;;;25712:62;-1:-1:-1;;;25790:18:1;;;25783:39;25839:19;;43770:73:0;25459:405:1;75651:115:0;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;75728:15:::1;:30:::0;75651:115::o;43365:208::-;43437:7;-1:-1:-1;;;;;43465:19:0;;43457:74;;;;-1:-1:-1;;;43457:74:0;;25250:2:1;43457:74:0;;;25232:21:1;25289:2;25269:18;;;25262:30;25328:34;25308:18;;;25301:62;-1:-1:-1;;;25379:18:1;;;25372:40;25429:19;;43457:74:0;25048:406:1;43457:74:0;-1:-1:-1;;;;;;43549:16:0;;;;;:9;:16;;;;;;;43365:208::o;64752:103::-;64332:12;:10;:12::i;:::-;-1:-1:-1;;;;;64321:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;64321:23:0;;64313:68;;;;-1:-1:-1;;;64313:68:0;;;;;;;:::i;:::-;64817:30:::1;64844:1;64817:18;:30::i;:::-;64752:103::o:0;74781:203::-;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;74845:19:::1;::::0;;;::::1;;;:27;;74868:4;74845:27;74837:75;;;::::0;-1:-1:-1;;;74837:75:0;;26487:2:1;74837:75:0::1;::::0;::::1;26469:21:1::0;26526:2;26506:18;;;26499:30;26565:34;26545:18;;;26538:62;-1:-1:-1;;;26616:18:1;;;26609:33;26659:19;;74837:75:0::1;26285:399:1::0;74837:75:0::1;74949:19;:27:::0;;-1:-1:-1;;74949:27:0::1;::::0;;74781:203::o;60166:100::-;60217:7;60244;60252:5;60244:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;60244:14:0;;60166:100;-1:-1:-1;;60166:100:0:o;64101:87::-;64174:6;;-1:-1:-1;;;;;64174:6:0;;64101:87::o;79354:590::-;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;79441:21:::1;79495:1;79465:27;:17;25170:14:::0;;25078:114;79465:27:::1;:31;;;;:::i;:::-;79596:13;::::0;79441:55;;-1:-1:-1;;;;79596:13:0;::::1;;;79567:25;79583:9:::0;79441:55;79567:25:::1;:::i;:::-;:42;;79559:129;;;::::0;-1:-1:-1;;;79559:129:0;;20595:2:1;79559:129:0::1;::::0;::::1;20577:21:1::0;20634:2;20614:18;;;20607:30;20673:34;20653:18;;;20646:62;20744:34;20724:18;;;20717:62;-1:-1:-1;;;20795:19:1;;;20788:41;20846:19;;79559:129:0::1;20393:478:1::0;79559:129:0::1;79701:19;::::0;79731:206:::1;79764:9;79754:7;:19;79731:206;;;79815:16;:14;:16::i;:::-;79801:30;;79846:35;79856:11;79869;79846:9;:35::i;:::-;79896:29;:17;25289:19:::0;;25307:1;25289:19;;;25200:127;79896:29:::1;79775:9:::0;::::1;::::0;::::1;:::i;:::-;;;;79731:206;;;;79430:514;;79354:590:::0;;:::o;44110:104::-;44166:13;44199:7;44192:14;;;;;:::i;59662:109::-;-1:-1:-1;;;;;59745:18:0;59718:7;59745:18;;;:9;:18;;;;;;;59662:109::o;82167:115::-;82216:7;82273:1;82243:27;:17;25170:14;;25078:114;83830:647;83890:7;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;83955:17:::1;84037:1;84007:27;:17;25170:14:::0;;25078:114;84007:27:::1;83975:19;25170:14:::0;83975:59:::1;;;;:::i;:::-;:63;;;;:::i;:::-;83955:83;;84096:21;84132:9;84121:8;:6;:8::i;:::-;:20;;;;:::i;:::-;84120:26;::::0;84145:1:::1;84120:26;:::i;:::-;84096:50;;84228:14;84245:22;84253:13;84245:7;:22::i;:::-;84228:39;;84340:35;84351:6;84359:15;84340:35;;;;;;;:::i;:::-;;;;;;;;84463:6:::0;-1:-1:-1;;;71212:1:0::1;83830:647:::0;:::o;76708:1277::-;76822:14;;;;:22;;:14;:22;76814:68;;;;-1:-1:-1;;;76814:68:0;;19766:2:1;76814:68:0;;;19748:21:1;19805:2;19785:18;;;19778:30;19844:34;19824:18;;;19817:62;-1:-1:-1;;;19895:18:1;;;19888:31;19936:19;;76814:68:0;19564:397:1;76814:68:0;76916:1;76903:9;:14;;76895:64;;;;-1:-1:-1;;;76895:64:0;;;;;;;:::i;:::-;76972:23;77030:1;76998:29;:19;25170:14;;25078:114;76998:29;:33;;;;:::i;:::-;77135:15;;76972:59;;-1:-1:-1;77135:15:0;;77104:27;77122:9;76972:59;77104:27;:::i;:::-;:46;;77096:135;;;;-1:-1:-1;;;77096:135:0;;;;;;;:::i;:::-;77285:12;;77273:24;;:9;:24;:::i;:::-;77260:9;:37;77252:108;;;;-1:-1:-1;;;77252:108:0;;;;;;;:::i;:::-;77454:10;77412:25;77440;;;:13;:25;;;;;;77531:15;;77498:29;77518:9;77440:25;77498:29;:::i;:::-;:48;;77476:171;;;;-1:-1:-1;;;77476:171:0;;22668:2:1;77476:171:0;;;22650:21:1;22707:2;22687:18;;;22680:30;-1:-1:-1;;;;;;;;;;;22726:18:1;;;22719:62;22817:34;22797:18;;;22790:62;-1:-1:-1;;;22868:19:1;;;22861:39;22917:19;;77476:171:0;22466:476:1;77476:171:0;77692:19;;77722:207;77755:9;77745:7;:19;77722:207;;;77806:16;:14;:16::i;:::-;77792:30;;77837:34;77847:10;77859:11;77837:9;:34::i;:::-;77886:31;:19;25289;;25307:1;25289:19;;;25200:127;77886:31;77766:9;;;;:::i;:::-;;;;77722:207;;45793:155;45888:52;45907:12;:10;:12::i;:::-;45921:8;45931;45888:18;:52::i;83492:289::-;83544:4;;83561:190;83606:9;:16;83590:32;;83561:190;;;83688:4;-1:-1:-1;;;;;83660:32:0;:9;83670:13;83660:24;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;83660:24:0;:32;83656:84;;;-1:-1:-1;83720:4:0;;83492:289;-1:-1:-1;;83492:289:0:o;83656:84::-;83624:15;;;;:::i;:::-;;;;83561:190;;;-1:-1:-1;83768:5:0;;83492:289;-1:-1:-1;;83492:289:0:o;46916:328::-;47091:41;47110:12;:10;:12::i;:::-;47124:7;47091:18;:41::i;:::-;47083:103;;;;-1:-1:-1;;;47083:103:0;;;;;;;:::i;:::-;47197:39;47211:4;47217:2;47221:7;47230:5;47197:13;:39::i;:::-;46916:328;;;;:::o;82647:112::-;82738:13;;82694:6;;82720:31;;82738:13;-1:-1:-1;;;82738:13:0;;;;;82720:15;:31;:::i;67856:175::-;67922:13;67979:14;:12;:14::i;:::-;67995:26;68012:8;67995:16;:26::i;:::-;67962:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67948:75;;67856:175;;;:::o;82767:274::-;82814:7;83032:1;83002:27;:17;25170:14;;25078:114;74573:200;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;74636:19:::1;::::0;;;::::1;;;:28;74628:74;;;::::0;-1:-1:-1;;;74628:74:0;;31639:2:1;74628:74:0::1;::::0;::::1;31621:21:1::0;31678:2;31658:18;;;31651:30;31717:34;31697:18;;;31690:62;-1:-1:-1;;;31768:18:1;;;31761:31;31809:19;;74628:74:0::1;31437:397:1::0;74628:74:0::1;74739:19;:26:::0;;-1:-1:-1;;74739:26:0::1;::::0;::::1;::::0;;74573:200::o;74346:219::-;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;74414:23:::1;::::0;::::1;;::::0;;::::1;;:31;;:23;:31;74406:83;;;::::0;-1:-1:-1;;;74406:83:0;;16452:2:1;74406:83:0::1;::::0;::::1;16434:21:1::0;16491:2;16471:18;;;16464:30;16530:34;16510:18;;;16503:62;-1:-1:-1;;;16581:18:1;;;16574:37;16628:19;;74406:83:0::1;16250:403:1::0;74406:83:0::1;74526:23;:31:::0;;-1:-1:-1;;74526:31:0::1;::::0;;74346:219::o;73673:109::-;73727:13;73760:14;73753:21;;;;;:::i;59248:119::-;-1:-1:-1;;;;;59333:26:0;59306:7;59333:26;;;:19;:26;;;;;;;59248:119::o;79952:1333::-;80069:19;;;;;;;:27;;80092:4;80069:27;80061:79;;;;-1:-1:-1;;;80061:79:0;;17216:2:1;80061:79:0;;;17198:21:1;17255:2;17235:18;;;17228:30;17294:34;17274:18;;;17267:62;-1:-1:-1;;;17345:18:1;;;17338:37;17392:19;;80061:79:0;17014:403:1;80061:79:0;80174:1;80161:9;:14;;80153:64;;;;-1:-1:-1;;;80153:64:0;;;;;;;:::i;:::-;80230:23;80288:1;80256:29;:19;25170:14;;25078:114;80256:29;:33;;;;:::i;:::-;80393:15;;80230:59;;-1:-1:-1;80393:15:0;;80362:27;80380:9;80230:59;80362:27;:::i;:::-;:46;;80354:135;;;;-1:-1:-1;;;80354:135:0;;;;;;;:::i;:::-;80563:19;80571:10;80563:7;:19::i;:::-;:27;;80586:4;80563:27;80555:77;;;;-1:-1:-1;;;80555:77:0;;26891:2:1;80555:77:0;;;26873:21:1;26930:2;26910:18;;;26903:30;26969:34;26949:18;;;26942:62;-1:-1:-1;;;27020:18:1;;;27013:35;27065:19;;80555:77:0;26689:401:1;80555:77:0;80732:10;80690:25;80718;;;:13;:25;;;;;;80809:24;;80776:29;80796:9;80718:25;80776:29;:::i;:::-;:57;;80754:193;;;;-1:-1:-1;;;80754:193:0;;23149:2:1;80754:193:0;;;23131:21:1;23188:2;23168:18;;;23161:30;-1:-1:-1;;;;;;;;;;;23207:18:1;;;23200:62;23298:34;23278:18;;;23271:62;-1:-1:-1;;;23349:19:1;;;23342:52;23411:19;;80754:193:0;22947:489:1;80754:193:0;80992:19;;81022:207;81055:9;81045:7;:19;81022:207;;;81106:16;:14;:16::i;:::-;81092:30;;81137:34;81147:10;81159:11;81137:9;:34::i;:::-;81186:31;:19;25289;;25307:1;25289:19;;;25200:127;81186:31;81066:9;;;;:::i;:::-;;;;81022:207;;68163:445;68417:20;;68461:28;;-1:-1:-1;;;68461:28:0;;68288:4;;-1:-1:-1;;;;;68417:20:0;;;;68453:49;;;;68417:20;;68461:21;;:28;;68483:5;;68461:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;68453:49:0;;68449:93;;;68526:4;68519:11;;;;;68449:93;-1:-1:-1;;;;;46140:25:0;;;46116:4;46140:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;68561:39;68554:46;68163:445;-1:-1:-1;;;;68163:445:0:o;65010:201::-;64332:12;:10;:12::i;:::-;-1:-1:-1;;;;;64321:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;64321:23:0;;64313:68;;;;-1:-1:-1;;;64313:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65099:22:0;::::1;65091:73;;;::::0;-1:-1:-1;;;65091:73:0;;15331:2:1;65091:73:0::1;::::0;::::1;15313:21:1::0;15370:2;15350:18;;;15343:30;15409:34;15389:18;;;15382:62;-1:-1:-1;;;15460:18:1;;;15453:36;15506:19;;65091:73:0::1;15129:402:1::0;65091:73:0::1;65175:28;65194:8;65175:18;:28::i;:::-;65010:201:::0;:::o;82040:119::-;82091:7;82150:1;82118:29;:19;25170:14;;25078:114;75492:151;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;75587:21:::1;:48:::0;75492:151::o;74122:216::-;71035:10;-1:-1:-1;;;;;;;;;;;71035:24:0;;:55;;-1:-1:-1;71063:10:0;-1:-1:-1;;;;;;;;;;;71063:27:0;71035:55;:89;;;-1:-1:-1;71094:10:0;-1:-1:-1;;;;;;;;;;;71094:30:0;71035:89;71013:188;;;;-1:-1:-1;;;71013:188:0;;;;;;;:::i;:::-;74189:23:::1;::::0;::::1;::::0;::::1;;;:32;74181:82;;;::::0;-1:-1:-1;;;74181:82:0;;29650:2:1;74181:82:0::1;::::0;::::1;29632:21:1::0;29689:2;29669:18;;;29662:30;29728:34;29708:18;;;29701:62;-1:-1:-1;;;29779:18:1;;;29772:35;29824:19;;74181:82:0::1;29448:401:1::0;74181:82:0::1;74300:23;:30:::0;;-1:-1:-1;;74300:30:0::1;;;::::0;;74122:216::o;25200:127::-;25289:19;;25307:1;25289:19;;;25200:127::o;2631:650::-;2702:22;2746:10;2768:4;2746:27;2742:508;;;2790:18;2811:8;;2790:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;2850:8:0;3061:17;3055:24;-1:-1:-1;;;;;3029:134:0;;-1:-1:-1;2742:508:0;;-1:-1:-1;2742:508:0;;-1:-1:-1;3227:10:0;2631:650;:::o;48754:127::-;48819:4;48843:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48843:16:0;:30;;;48754:127::o;52736:174::-;52811:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;52811:29:0;-1:-1:-1;;;;;52811:29:0;;;;;;;;:24;;52865:23;52811:24;52865:14;:23::i;:::-;-1:-1:-1;;;;;52856:46:0;;;;;;;;;;;52736:174;;:::o;12937:486::-;13115:4;-1:-1:-1;;;;;13140:20:0;;13132:70;;;;-1:-1:-1;;;13132:70:0;;24001:2:1;13132:70:0;;;23983:21:1;24040:2;24020:18;;;24013:30;24079:34;24059:18;;;24052:62;-1:-1:-1;;;24130:18:1;;;24123:35;24175:19;;13132:70:0;23799:401:1;13132:70:0;13256:159;13284:47;13303:27;13323:6;13303:19;:27::i;:::-;13284:18;:47::i;:::-;13256:159;;;;;;;;;;;;13249:25:1;;;;13322:4;13310:17;;13290:18;;;13283:45;13344:18;;;13337:34;;;13387:18;;;13380:34;;;13221:19;;13256:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13233:182:0;:6;-1:-1:-1;;;;;13233:182:0;;13213:202;;12937:486;;;;;;;:::o;6150:98::-;6208:7;6235:5;6239:1;6235;:5;:::i;:::-;6228:12;6150:98;-1:-1:-1;;;6150:98:0:o;62119:248::-;62329:12;;-1:-1:-1;;;;;62309:16:0;;62265:7;62309:16;;;:7;:16;;;;;;62265:7;;62344:15;;62293:32;;:13;:32;:::i;:::-;62292:49;;;;:::i;:::-;:67;;;;:::i;27813:317::-;27928:6;27903:21;:31;;27895:73;;;;-1:-1:-1;;;27895:73:0;;21078:2:1;27895:73:0;;;21060:21:1;21117:2;21097:18;;;21090:30;21156:31;21136:18;;;21129:59;21205:18;;27895:73:0;20876:353:1;27895:73:0;27982:12;28000:9;-1:-1:-1;;;;;28000:14:0;28022:6;28000:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27981:52;;;28052:7;28044:78;;;;-1:-1:-1;;;28044:78:0;;20168:2:1;28044:78:0;;;20150:21:1;20207:2;20187:18;;;20180:30;20246:34;20226:18;;;20219:62;-1:-1:-1;;;20297:18:1;;;20290:56;20363:19;;28044:78:0;19966:422:1;49048:348:0;49141:4;49166:16;49174:7;49166;:16::i;:::-;49158:73;;;;-1:-1:-1;;;49158:73:0;;21843:2:1;49158:73:0;;;21825:21:1;21882:2;21862:18;;;21855:30;21921:34;21901:18;;;21894:62;-1:-1:-1;;;21972:18:1;;;21965:42;22024:19;;49158:73:0;21641:408:1;49158:73:0;49242:13;49258:23;49273:7;49258:14;:23::i;:::-;49242:39;;49311:5;-1:-1:-1;;;;;49300:16:0;:7;-1:-1:-1;;;;;49300:16:0;;:51;;;;49344:7;-1:-1:-1;;;;;49320:31:0;:20;49332:7;49320:11;:20::i;:::-;-1:-1:-1;;;;;49320:31:0;;49300:51;:87;;;;49355:32;49372:5;49379:7;49355:16;:32::i;52040:578::-;52199:4;-1:-1:-1;;;;;52172:31:0;:23;52187:7;52172:14;:23::i;:::-;-1:-1:-1;;;;;52172:31:0;;52164:85;;;;-1:-1:-1;;;52164:85:0;;28838:2:1;52164:85:0;;;28820:21:1;28877:2;28857:18;;;28850:30;28916:34;28896:18;;;28889:62;-1:-1:-1;;;28967:18:1;;;28960:39;29016:19;;52164:85:0;28636:405:1;52164:85:0;-1:-1:-1;;;;;52268:16:0;;52260:65;;;;-1:-1:-1;;;52260:65:0;;19007:2:1;52260:65:0;;;18989:21:1;19046:2;19026:18;;;19019:30;19085:34;19065:18;;;19058:62;-1:-1:-1;;;19136:18:1;;;19129:34;19180:19;;52260:65:0;18805:400:1;52260:65:0;52442:29;52459:1;52463:7;52442:8;:29::i;:::-;-1:-1:-1;;;;;52484:15:0;;;;;;:9;:15;;;;;:20;;52503:1;;52484:15;:20;;52503:1;;52484:20;:::i;:::-;;;;-1:-1:-1;;;;;;;52515:13:0;;;;;;:9;:13;;;;;:18;;52532:1;;52515:13;:18;;52532:1;;52515:18;:::i;:::-;;;;-1:-1:-1;;52544:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;52544:21:0;-1:-1:-1;;;;;52544:21:0;;;;;;;;;52583:27;;52544:16;;52583:27;;;;-1:-1:-1;;;;;;;;;;;52583:27:0;;52040:578;;;:::o;49738:110::-;49814:26;49824:2;49828:7;49814:26;;;;;;;;;;;;:9;:26::i;37415:211::-;37532:86;37552:5;37582:23;;;37607:2;37611:5;37559:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;37559:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;37559:58:0;-1:-1:-1;;;;;;37559:58:0;;;;;;;;;;37532:19;:86::i;65371:191::-;65464:6;;;-1:-1:-1;;;;;65481:17:0;;;-1:-1:-1;;;;;;65481:17:0;;;;;;;65514:40;;65464:6;;;65481:17;65464:6;;65514:40;;65445:16;;65514:40;65434:128;65371:191;:::o;84515:141::-;84556:7;84612:15;84629:16;84601:45;;;;;;;;32606:25:1;;;32662:2;32647:18;;32640:34;32594:2;32579:18;;32432:248;84601:45:0;;;;;;;;;;;;;84591:56;;;;;;84583:65;;84576:72;;84515:141;:::o;53052:315::-;53207:8;-1:-1:-1;;;;;53198:17:0;:5;-1:-1:-1;;;;;53198:17:0;;;53190:55;;;;-1:-1:-1;;;53190:55:0;;19412:2:1;53190:55:0;;;19394:21:1;19451:2;19431:18;;;19424:30;-1:-1:-1;;;19470:18:1;;;19463:55;19535:18;;53190:55:0;19210:349:1;53190:55:0;-1:-1:-1;;;;;53256:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;53256:46:0;;;;;;;;;;53318:41;;12366::1;;;53318::0;;12339:18:1;53318:41:0;;;;;;;53052:315;;;:::o;48126:::-;48283:28;48293:4;48299:2;48303:7;48283:9;:28::i;:::-;48330:48;48353:4;48359:2;48363:7;48372:5;48330:22;:48::i;:::-;48322:111;;;;-1:-1:-1;;;48322:111:0;;;;;;;:::i;13795:723::-;13851:13;14072:10;14068:53;;-1:-1:-1;;14099:10:0;;;;;;;;;;;;-1:-1:-1;;;14099:10:0;;;;;13795:723::o;14068:53::-;14146:5;14131:12;14187:78;14194:9;;14187:78;;14220:8;;;;:::i;:::-;;-1:-1:-1;14243:10:0;;-1:-1:-1;14251:2:0;14243:10;;:::i;:::-;;;14187:78;;;14275:19;14307:6;-1:-1:-1;;;;;14297:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14297:17:0;;14275:39;;14325:154;14332:10;;14325:154;;14359:11;14369:1;14359:11;;:::i;:::-;;-1:-1:-1;14428:10:0;14436:2;14428:5;:10;:::i;:::-;14415:24;;:2;:24;:::i;:::-;14402:39;;14385:6;14392;14385:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;14385:56:0;;;;;;;;-1:-1:-1;14456:11:0;14465:2;14456:11;;:::i;:::-;;;14325:154;;12404:410;12514:7;10581:100;;;;;;;;;;;;;;;;;10561:127;;;;;;;12668:12;;12703:11;;;;12747:24;;;;;12737:35;;;;;;12587:204;;;;;12831:25:1;;;12887:2;12872:18;;12865:34;;;;-1:-1:-1;;;;;12935:32:1;12930:2;12915:18;;12908:60;12999:2;12984:18;;12977:34;12818:3;12803:19;;12600:417;12587:204:0;;;;;;;;;;;;;12559:247;;;;;;12539:267;;12404:410;;;:::o;2235:258::-;2334:7;2436:20;1674:15;;;1596:101;2436:20;2407:63;;-1:-1:-1;;;2407:63:0;;;9511:27:1;9554:11;;;9547:27;;;;9590:12;;;9583:28;;;9627:12;;2407:63:0;9253:392:1;50075:321:0;50205:18;50211:2;50215:7;50205:5;:18::i;:::-;50256:54;50287:1;50291:2;50295:7;50304:5;50256:22;:54::i;:::-;50234:154;;;;-1:-1:-1;;;50234:154:0;;;;;;;:::i;39988:716::-;40412:23;40438:69;40466:4;40438:69;;;;;;;;;;;;;;;;;40446:5;-1:-1:-1;;;;;40438:27:0;;;:69;;;;;:::i;:::-;40522:17;;40412:95;;-1:-1:-1;40522:21:0;40518:179;;40619:10;40608:30;;;;;;;;;;;;:::i;:::-;40600:85;;;;-1:-1:-1;;;40600:85:0;;32041:2:1;40600:85:0;;;32023:21:1;32080:2;32060:18;;;32053:30;32119:34;32099:18;;;32092:62;-1:-1:-1;;;32170:18:1;;;32163:40;32220:19;;40600:85:0;31839:406:1;53932:799:0;54087:4;-1:-1:-1;;;;;54108:13:0;;26814:20;26862:8;54104:620;;54160:2;-1:-1:-1;;;;;54144:36:0;;54181:12;:10;:12::i;:::-;54195:4;54201:7;54210:5;54144:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54144:72:0;;;;;;;;-1:-1:-1;;54144:72:0;;;;;;;;;;;;:::i;:::-;;;54140:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54386:13:0;;54382:272;;54429:60;;-1:-1:-1;;;54429:60:0;;;;;;;:::i;54382:272::-;54604:6;54598:13;54589:6;54585:2;54581:15;54574:38;54140:529;-1:-1:-1;;;;;;54267:51:0;-1:-1:-1;;;54267:51:0;;-1:-1:-1;54260:58:0;;54104:620;-1:-1:-1;54708:4:0;53932:799;;;;;;:::o;50732:382::-;-1:-1:-1;;;;;50812:16:0;;50804:61;;;;-1:-1:-1;;;50804:61:0;;27703:2:1;50804:61:0;;;27685:21:1;;;27722:18;;;27715:30;27781:34;27761:18;;;27754:62;27833:18;;50804:61:0;27501:356:1;50804:61:0;50885:16;50893:7;50885;:16::i;:::-;50884:17;50876:58;;;;-1:-1:-1;;;50876:58:0;;16095:2:1;50876:58:0;;;16077:21:1;16134:2;16114:18;;;16107:30;-1:-1:-1;;;16153:18:1;;;16146:58;16221:18;;50876:58:0;15893:352:1;50876:58:0;-1:-1:-1;;;;;51005:13:0;;;;;;:9;:13;;;;;:18;;51022:1;;51005:13;:18;;51022:1;;51005:18;:::i;:::-;;;;-1:-1:-1;;51034:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;51034:21:0;-1:-1:-1;;;;;51034:21:0;;;;;;;;51073:33;;51034:16;;;-1:-1:-1;;;;;;;;;;;51073:33:0;51034:16;;51073:33;50732:382;;:::o;29297:229::-;29434:12;29466:52;29488:6;29496:4;29502:1;29505:12;29434;26814:20;;30704:60;;;;-1:-1:-1;;;30704:60:0;;31281:2:1;30704:60:0;;;31263:21:1;31320:2;31300:18;;;31293:30;31359:31;31339:18;;;31332:59;31408:18;;30704:60:0;31079:353:1;30704:60:0;30778:12;30792:23;30819:6;-1:-1:-1;;;;;30819:11:0;30838:5;30845:4;30819:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30777:73;;;;30868:51;30885:7;30894:10;30906:12;30868:16;:51::i;:::-;30861:58;30417:510;-1:-1:-1;;;;;;;30417:510:0:o;33103:712::-;33253:12;33282:7;33278:530;;;-1:-1:-1;33313:10:0;33306:17;;33278:530;33427:17;;:21;33423:374;;33625:10;33619:17;33686:15;33673:10;33669:2;33665:19;33658:44;33423:374;33768:12;33761:20;;-1:-1:-1;;;33761:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;138:14:1;;;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:220::-;692:5;745:3;738:4;730:6;726:17;722:27;712:55;;763:1;760;753:12;712:55;785:79;860:3;851:6;838:20;831:4;823:6;819:17;785:79;:::i;875:247::-;934:6;987:2;975:9;966:7;962:23;958:32;955:52;;;1003:1;1000;993:12;955:52;1042:9;1029:23;1061:31;1086:5;1061:31;:::i;1387:388::-;1455:6;1463;1516:2;1504:9;1495:7;1491:23;1487:32;1484:52;;;1532:1;1529;1522:12;1484:52;1571:9;1558:23;1590:31;1615:5;1590:31;:::i;:::-;1640:5;-1:-1:-1;1697:2:1;1682:18;;1669:32;1710:33;1669:32;1710:33;:::i;:::-;1762:7;1752:17;;;1387:388;;;;;:::o;1780:456::-;1857:6;1865;1873;1926:2;1914:9;1905:7;1901:23;1897:32;1894:52;;;1942:1;1939;1932:12;1894:52;1981:9;1968:23;2000:31;2025:5;2000:31;:::i;:::-;2050:5;-1:-1:-1;2107:2:1;2092:18;;2079:32;2120:33;2079:32;2120:33;:::i;:::-;1780:456;;2172:7;;-1:-1:-1;;;2226:2:1;2211:18;;;;2198:32;;1780:456::o;2241:665::-;2336:6;2344;2352;2360;2413:3;2401:9;2392:7;2388:23;2384:33;2381:53;;;2430:1;2427;2420:12;2381:53;2469:9;2456:23;2488:31;2513:5;2488:31;:::i;:::-;2538:5;-1:-1:-1;2595:2:1;2580:18;;2567:32;2608:33;2567:32;2608:33;:::i;:::-;2660:7;-1:-1:-1;2714:2:1;2699:18;;2686:32;;-1:-1:-1;2769:2:1;2754:18;;2741:32;-1:-1:-1;;;;;2785:30:1;;2782:50;;;2828:1;2825;2818:12;2782:50;2851:49;2892:7;2883:6;2872:9;2868:22;2851:49;:::i;:::-;2841:59;;;2241:665;;;;;;;:::o;2911:382::-;2976:6;2984;3037:2;3025:9;3016:7;3012:23;3008:32;3005:52;;;3053:1;3050;3043:12;3005:52;3092:9;3079:23;3111:31;3136:5;3111:31;:::i;:::-;3161:5;-1:-1:-1;3218:2:1;3203:18;;3190:32;3231:30;3190:32;3231:30;:::i;3298:758::-;3400:6;3408;3416;3424;3432;3485:3;3473:9;3464:7;3460:23;3456:33;3453:53;;;3502:1;3499;3492:12;3453:53;3541:9;3528:23;3560:31;3585:5;3560:31;:::i;:::-;3610:5;-1:-1:-1;3666:2:1;3651:18;;3638:32;-1:-1:-1;;;;;3682:30:1;;3679:50;;;3725:1;3722;3715:12;3679:50;3748:49;3789:7;3780:6;3769:9;3765:22;3748:49;:::i;:::-;3738:59;;;3844:2;3833:9;3829:18;3816:32;3806:42;;3895:2;3884:9;3880:18;3867:32;3857:42;;3951:3;3940:9;3936:19;3923:33;4000:4;3991:7;3987:18;3978:7;3975:31;3965:59;;4020:1;4017;4010:12;3965:59;4043:7;4033:17;;;3298:758;;;;;;;;:::o;4061:315::-;4129:6;4137;4190:2;4178:9;4169:7;4165:23;4161:32;4158:52;;;4206:1;4203;4196:12;4158:52;4245:9;4232:23;4264:31;4289:5;4264:31;:::i;:::-;4314:5;4366:2;4351:18;;;;4338:32;;-1:-1:-1;;;4061:315:1:o;4381:615::-;4467:6;4475;4528:2;4516:9;4507:7;4503:23;4499:32;4496:52;;;4544:1;4541;4534:12;4496:52;4571:23;;-1:-1:-1;;;;;4643:14:1;;;4640:34;;;4670:1;4667;4660:12;4640:34;4708:6;4697:9;4693:22;4683:32;;4753:7;4746:4;4742:2;4738:13;4734:27;4724:55;;4775:1;4772;4765:12;4724:55;4815:2;4802:16;4841:2;4833:6;4830:14;4827:34;;;4857:1;4854;4847:12;4827:34;4910:7;4905:2;4895:6;4892:1;4888:14;4884:2;4880:23;4876:32;4873:45;4870:65;;;4931:1;4928;4921:12;4870:65;4962:2;4954:11;;;;;4984:6;;-1:-1:-1;4381:615:1;;-1:-1:-1;;;;4381:615:1:o;5001:245::-;5068:6;5121:2;5109:9;5100:7;5096:23;5092:32;5089:52;;;5137:1;5134;5127:12;5089:52;5169:9;5163:16;5188:28;5210:5;5188:28;:::i;5251:245::-;5309:6;5362:2;5350:9;5341:7;5337:23;5333:32;5330:52;;;5378:1;5375;5368:12;5330:52;5417:9;5404:23;5436:30;5460:5;5436:30;:::i;5501:249::-;5570:6;5623:2;5611:9;5602:7;5598:23;5594:32;5591:52;;;5639:1;5636;5629:12;5591:52;5671:9;5665:16;5690:30;5714:5;5690:30;:::i;6430:280::-;6529:6;6582:2;6570:9;6561:7;6557:23;6553:32;6550:52;;;6598:1;6595;6588:12;6550:52;6630:9;6624:16;6649:31;6674:5;6649:31;:::i;6715:450::-;6784:6;6837:2;6825:9;6816:7;6812:23;6808:32;6805:52;;;6853:1;6850;6843:12;6805:52;6880:23;;-1:-1:-1;;;;;6915:30:1;;6912:50;;;6958:1;6955;6948:12;6912:50;6981:22;;7034:4;7026:13;;7022:27;-1:-1:-1;7012:55:1;;7063:1;7060;7053:12;7012:55;7086:73;7151:7;7146:2;7133:16;7128:2;7124;7120:11;7086:73;:::i;7170:180::-;7229:6;7282:2;7270:9;7261:7;7257:23;7253:32;7250:52;;;7298:1;7295;7288:12;7250:52;-1:-1:-1;7321:23:1;;7170:180;-1:-1:-1;7170:180:1:o;7355:184::-;7425:6;7478:2;7466:9;7457:7;7453:23;7449:32;7446:52;;;7494:1;7491;7484:12;7446:52;-1:-1:-1;7517:16:1;;7355:184;-1:-1:-1;7355:184:1:o;7544:276::-;7602:6;7655:2;7643:9;7634:7;7630:23;7626:32;7623:52;;;7671:1;7668;7661:12;7623:52;7710:9;7697:23;7760:10;7753:5;7749:22;7742:5;7739:33;7729:61;;7786:1;7783;7776:12;7825:257;7866:3;7904:5;7898:12;7931:6;7926:3;7919:19;7947:63;8003:6;7996:4;7991:3;7987:14;7980:4;7973:5;7969:16;7947:63;:::i;:::-;8064:2;8043:15;-1:-1:-1;;8039:29:1;8030:39;;;;8071:4;8026:50;;7825:257;-1:-1:-1;;7825:257:1:o;8087:274::-;8216:3;8254:6;8248:13;8270:53;8316:6;8311:3;8304:4;8296:6;8292:17;8270:53;:::i;:::-;8339:16;;;;;8087:274;-1:-1:-1;;8087:274:1:o;8366:407::-;8523:3;8561:6;8555:13;8577:53;8623:6;8618:3;8611:4;8603:6;8599:17;8577:53;:::i;:::-;8724:2;8695:15;;;;-1:-1:-1;;;;;;8691:45:1;8652:16;;;;8677:60;;;8764:2;8753:14;;8366:407;-1:-1:-1;;8366:407:1:o;8778:470::-;8957:3;8995:6;8989:13;9011:53;9057:6;9052:3;9045:4;9037:6;9033:17;9011:53;:::i;:::-;9127:13;;9086:16;;;;9149:57;9127:13;9086:16;9183:4;9171:17;;9149:57;:::i;:::-;9222:20;;8778:470;-1:-1:-1;;;;8778:470:1:o;9860:203::-;-1:-1:-1;;;;;10024:32:1;;;;10006:51;;9994:2;9979:18;;9860:203::o;10068:282::-;-1:-1:-1;;;;;10268:32:1;;;;10250:51;;10332:2;10317:18;;10310:34;10238:2;10223:18;;10068:282::o;10355:431::-;-1:-1:-1;;;;;10612:15:1;;;10594:34;;10664:15;;10659:2;10644:18;;10637:43;10716:2;10711;10696:18;;10689:30;;;10537:4;;10736:44;;10761:18;;10753:6;10736:44;:::i;:::-;10728:52;10355:431;-1:-1:-1;;;;;10355:431:1:o;10791:488::-;-1:-1:-1;;;;;11060:15:1;;;11042:34;;11112:15;;11107:2;11092:18;;11085:43;11159:2;11144:18;;11137:34;;;11207:3;11202:2;11187:18;;11180:31;;;10985:4;;11228:45;;11253:19;;11245:6;11228:45;:::i;:::-;11220:53;10791:488;-1:-1:-1;;;;;;10791:488:1:o;11563:658::-;11734:2;11786:21;;;11856:13;;11759:18;;;11878:22;;;11705:4;;11734:2;11957:15;;;;11931:2;11916:18;;;11705:4;12000:195;12014:6;12011:1;12008:13;12000:195;;;12079:13;;-1:-1:-1;;;;;12075:39:1;12063:52;;12170:15;;;;12135:12;;;;12111:1;12029:9;12000:195;;;-1:-1:-1;12212:3:1;;11563:658;-1:-1:-1;;;;;;11563:658:1:o;13425:217::-;13572:2;13561:9;13554:21;13535:4;13592:44;13632:2;13621:9;13617:18;13609:6;13592:44;:::i;14283:422::-;14485:2;14467:21;;;14524:2;14504:18;;;14497:30;14563:34;14558:2;14543:18;;14536:62;-1:-1:-1;;;14629:2:1;14614:18;;14607:56;14695:3;14680:19;;14283:422::o;14710:414::-;14912:2;14894:21;;;14951:2;14931:18;;;14924:30;14990:34;14985:2;14970:18;;14963:62;-1:-1:-1;;;15056:2:1;15041:18;;15034:48;15114:3;15099:19;;14710:414::o;17422:480::-;17624:2;17606:21;;;17663:2;17643:18;;;17636:30;-1:-1:-1;;;;;;;;;;;17697:2:1;17682:18;;17675:62;17773:34;17768:2;17753:18;;17746:62;-1:-1:-1;;;17839:3:1;17824:19;;17817:43;17892:3;17877:19;;17422:480::o;18398:402::-;18600:2;18582:21;;;18639:2;18619:18;;;18612:30;18678:34;18673:2;18658:18;;18651:62;-1:-1:-1;;;18744:2:1;18729:18;;18722:36;18790:3;18775:19;;18398:402::o;22054:407::-;22256:2;22238:21;;;22295:2;22275:18;;;22268:30;22334:34;22329:2;22314:18;;22307:62;-1:-1:-1;;;22400:2:1;22385:18;;22378:41;22451:3;22436:19;;22054:407::o;24205:413::-;24407:2;24389:21;;;24446:2;24426:18;;;24419:30;24485:34;24480:2;24465:18;;24458:62;-1:-1:-1;;;24551:2:1;24536:18;;24529:47;24608:3;24593:19;;24205:413::o;27095:401::-;27297:2;27279:21;;;27336:2;27316:18;;;27309:30;27375:34;27370:2;27355:18;;27348:62;-1:-1:-1;;;27441:2:1;27426:18;;27419:35;27486:3;27471:19;;27095:401::o;28275:356::-;28477:2;28459:21;;;28496:18;;;28489:30;28555:34;28550:2;28535:18;;28528:62;28622:2;28607:18;;28275:356::o;30661:413::-;30863:2;30845:21;;;30902:2;30882:18;;;30875:30;30941:34;30936:2;30921:18;;30914:62;-1:-1:-1;;;31007:2:1;30992:18;;30985:47;31064:3;31049:19;;30661:413::o;32882:128::-;32922:3;32953:1;32949:6;32946:1;32943:13;32940:39;;;32959:18;;:::i;:::-;-1:-1:-1;32995:9:1;;32882:128::o;33015:228::-;33054:3;33082:10;33119:2;33116:1;33112:10;33149:2;33146:1;33142:10;33180:3;33176:2;33172:12;33167:3;33164:21;33161:47;;;33188:18;;:::i;33248:120::-;33288:1;33314;33304:35;;33319:18;;:::i;:::-;-1:-1:-1;33353:9:1;;33248:120::o;33373:168::-;33413:7;33479:1;33475;33471:6;33467:14;33464:1;33461:21;33456:1;33449:9;33442:17;33438:45;33435:71;;;33486:18;;:::i;:::-;-1:-1:-1;33526:9:1;;33373:168::o;33546:125::-;33586:4;33614:1;33611;33608:8;33605:34;;;33619:18;;:::i;:::-;-1:-1:-1;33656:9:1;;33546:125::o;33676:258::-;33748:1;33758:113;33772:6;33769:1;33766:13;33758:113;;;33848:11;;;33842:18;33829:11;;;33822:39;33794:2;33787:10;33758:113;;;33889:6;33886:1;33883:13;33880:48;;;-1:-1:-1;;33924:1:1;33906:16;;33899:27;33676:258::o;33939:380::-;34018:1;34014:12;;;;34061;;;34082:61;;34136:4;34128:6;34124:17;34114:27;;34082:61;34189:2;34181:6;34178:14;34158:18;34155:38;34152:161;;;34235:10;34230:3;34226:20;34223:1;34216:31;34270:4;34267:1;34260:15;34298:4;34295:1;34288:15;34152:161;;33939:380;;;:::o;34324:135::-;34363:3;-1:-1:-1;;34384:17:1;;34381:43;;;34404:18;;:::i;:::-;-1:-1:-1;34451:1:1;34440:13;;34324:135::o;34464:112::-;34496:1;34522;34512:35;;34527:18;;:::i;:::-;-1:-1:-1;34561:9:1;;34464:112::o;34581:127::-;34642:10;34637:3;34633:20;34630:1;34623:31;34673:4;34670:1;34663:15;34697:4;34694:1;34687:15;34713:127;34774:10;34769:3;34765:20;34762:1;34755:31;34805:4;34802:1;34795:15;34829:4;34826:1;34819:15;34845:127;34906:10;34901:3;34897:20;34894:1;34887:31;34937:4;34934:1;34927:15;34961:4;34958:1;34951:15;34977:127;35038:10;35033:3;35029:20;35026:1;35019:31;35069:4;35066:1;35059:15;35093:4;35090:1;35083:15;35109:131;-1:-1:-1;;;;;35184:31:1;;35174:42;;35164:70;;35230:1;35227;35220:12;35245:118;35331:5;35324:13;35317:21;35310:5;35307:32;35297:60;;35353:1;35350;35343:12;35368:131;-1:-1:-1;;;;;;35442:32:1;;35432:43;;35422:71;;35489:1;35486;35479:12

Swarm Source

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