ETH Price: $2,404.59 (+1.36%)

Token

AtomicAntz (AAZ)
 

Overview

Max Total Supply

555 AAZ

Holders

236

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 AAZ
0x982b046b9cf3c3ac5d400da0803b40c6d690c61b
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:
AtomicAntz

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 11000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-30
*/

// SPDX-License-Identifier: MIT
// produced by the Solididy File Flattener (c) David Appleton 2018 - 2020 and beyond
// contact : [email protected]
// source  : https://github.com/DaveAppleton/SolidityFlattery
// released under Apache 2.0 licence
// input  C:\Users\slive\Documents\NFT_Projects\Projects\AtomicAntz\contracts\AtomicAntz.sol
// flattened :  Monday, 30-Aug-21 18:25:57 UTC
pragma solidity 0.8.6;

interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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);
            }
        }
    }
}

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);
}

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);
}

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;
        }
    }
}

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);
    }
}

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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;
}

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);
}

abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(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;

    /**
     * @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 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 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 = (totalReceived * _shares[account]) / _totalShares - _released[account];

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

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

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

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

interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 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 {}
}

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

/************************************************************************************
*                                  ATOMIC    ANTZ                                   *
************************************************************************************/
contract AtomicAntz is ERC721Enumerable, PaymentSplitter, AccessControl {
    uint256 public tokenPrice = 80000000000000000;   // .08 ETH
    uint256 private _reserve = 715;
    string private _metadataURI = "https://atomicantz.com/api/metadata.php?TokenID=";
    address[] private _team = [
        0xc03D1E2D94dc8fBCD7b015FD8bA1267245cFf2af, // Alina ~ 10%
        0x7e7837E605BbEAdd43068d61De924CCBf5411B2b, // Colonel Tux ~ 45%
        0x12403CdDaBaFdA1c850f58c48156B477614d5453  // SargentZ ~ 45%
    ];
    uint256[] private _team_shares = [10, 45, 45];
    bool public saleActive = false;
    bytes32 public constant DEV_ROLE = keccak256("DEV");
    string public provenance = "7B8A877D8752BCE9EF234A207394E4E4BA92263CB29A8BDE202854AC896D46BB";
    /**
    * @dev Emitted when `saleActive` switches.
    */
    event SalesFlipped( bool saleActive );

    constructor( ) ERC721( "AtomicAntz", "AAZ" ) PaymentSplitter( _team, _team_shares ) {
        _setupRole( DEV_ROLE, _team[0] );
        _setupRole( DEV_ROLE, _team[1] );
        _setupRole( DEV_ROLE, _team[2] );
        _setupRole( DEFAULT_ADMIN_ROLE, _team[1] );
        _setupRole( DEFAULT_ADMIN_ROLE, _team[2] );
    }
    modifier onlyDev( ) {
        require( hasRole( DEV_ROLE, _msgSender( ) ), "Roles: caller does not have the DEV role" );
        _;
    }
    modifier onlyAdmin( ) {
        require( hasRole( DEFAULT_ADMIN_ROLE, _msgSender( ) ), "Roles: caller does not have the ADMIN role" );
        _;
    }
    function mintAnt( uint quantity ) public payable {
        require( saleActive, "Sale must be active to mint an ant" );
        require( quantity < 21, "Can only mint 20 tokens at a time" );
        uint totalSupply = totalSupply();
        require( totalSupply + quantity < 10001, "Purchase would exceed max supply of ants");
        require( msg.value == tokenPrice * quantity, "Ether value sent is not correct" );
        for( uint i = 0; i < quantity; i++ ) {
            uint mintIndex = totalSupply + i;
            _safeMint( _msgSender( ), mintIndex );
        }
    }
    function airdropAnt( address recipient, uint quantity ) public onlyAdmin( ) {
        require( quantity < _reserve + 1, "Not enough ants left in reserve" );
        uint totalSupply = totalSupply( );
        require( totalSupply + quantity < 11001, "Purchase would exceed max supply of ants" );
        for( uint i = 0; i < quantity; i++ ) {
            uint mintIndex = totalSupply + i;
            _safeMint( recipient, mintIndex );
        }
        _reserve -= quantity;
    }
    function withdraw( ) public onlyAdmin( ) {
        for ( uint256 i = 0; i < _team.length; i++ ) {
            address payable wallet = payable( _team[i] );
            release( wallet );
        }
    }
    function flipSales( ) public onlyDev( ) {
        saleActive = !saleActive;
        emit SalesFlipped(saleActive);
    }
    function setBaseURI( string memory baseURI ) public onlyDev( ) {
        _metadataURI = baseURI;
    }
    function setProvenance( string memory new_povenance ) public onlyDev( ) {
        provenance = new_povenance;
    }
    function _baseURI( ) internal override view returns ( string memory ) {
        return _metadataURI;
    }
    /**
    * @dev See {IERC165-supportsInterface}.
    * Needs to be overridden here as two or more parent classes define it.
    */
    function supportsInterface( bytes4 interfaceId ) public pure override( AccessControl, ERC721Enumerable ) returns ( bool ) {
        bool isIAccessControl = interfaceId == type( IAccessControl ).interfaceId;
        bool isIERC721Enumerable = interfaceId == type( IERC721Enumerable ).interfaceId;
        bool isIERC721 = interfaceId == type( IERC721 ).interfaceId;
        bool isIERC721Metadata = interfaceId == type( IERC721Metadata ).interfaceId;
        bool isIERC165 = interfaceId == type( IERC165 ).interfaceId;
        return isIERC165 || isIERC721 || isIERC721Metadata || isIERC721Enumerable || isIAccessControl;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","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":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":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"saleActive","type":"bool"}],"name":"SalesFlipped","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEV_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdropAnt","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":"flipSales","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":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"quantity","type":"uint256"}],"name":"mintAnt","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"string","name":"new_povenance","type":"string"}],"name":"setProvenance","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":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

67011c37937e0800006010556102cb60115560e0604052603060808181529062003cf260a03980516200003b91601291602090910190620006e7565b506040805160608101825273c03d1e2d94dc8fbcd7b015fd8ba1267245cff2af8152737e7837e605bbeadd43068d61de924ccbf5411b2b60208201527312403cddabafda1c850f58c48156b477614d545391810191909152620000a390601390600362000776565b5060408051606081018252600a8152602d6020820181905291810191909152620000d2906014906003620007ce565b506015805460ff19169055604080516060810182528181529062003c92602083013980516200010a91601691602090910190620006e7565b503480156200011857600080fd5b5060138054806020026020016040519081016040528092919081815260200182805480156200017157602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000152575b50505050506014805480602002602001604051908101604052809291908181526020018280548015620001c457602002820191906000526020600020905b815481526020019060010190808311620001af575b5050604080518082018252600a81526920ba37b6b4b1a0b73a3d60b11b60208083019182528351808501909452600384526220a0ad60e91b90840152815191955091935062000218925060009190620006e7565b5080516200022e906001906020840190620006e7565b5050508051825114620002a35760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620002f65760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f2070617965657300000000000060448201526064016200029a565b60005b825181101562000362576200034d8382815181106200031c576200031c620008b4565b6020026020010151838381518110620003395762000339620008b4565b60200260200101516200044560201b60201c565b80620003598162000880565b915050620002f9565b505050620003ab60008051602062003cd28339815191526013600081548110620003905762000390620008b4565b6000918252602090912001546001600160a01b031662000633565b620003d660008051602062003cd28339815191526013600181548110620003905762000390620008b4565b6200040160008051602062003cd28339815191526013600281548110620003905762000390620008b4565b620004206000801b6013600181548110620003905762000390620008b4565b6200043f6000801b6013600281548110620003905762000390620008b4565b620008ca565b6001600160a01b038216620004b25760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b60648201526084016200029a565b60008111620005045760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a2073686172657320617265203000000060448201526064016200029a565b6001600160a01b0382166000908152600c602052604090205415620005805760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b60648201526084016200029a565b600e8054600181019091557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319166001600160a01b0384169081179091556000908152600c60205260409020819055600a54620005ea90829062000828565b600a55604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b6200063f828262000643565b5050565b6000828152600f602090815260408083206001600160a01b038516845290915290205460ff166200063f576000828152600f602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620006a33390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b828054620006f59062000843565b90600052602060002090601f01602090048101928262000719576000855562000764565b82601f106200073457805160ff191683800117855562000764565b8280016001018555821562000764579182015b828111156200076457825182559160200191906001019062000747565b506200077292915062000811565b5090565b82805482825590600052602060002090810192821562000764579160200282015b828111156200076457825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000797565b82805482825590600052602060002090810192821562000764579160200282015b8281111562000764578251829060ff16905591602001919060010190620007ef565b5b8082111562000772576000815560010162000812565b600082198211156200083e576200083e6200089e565b500190565b600181811c908216806200085857607f821691505b602082108114156200087a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200089757620008976200089e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6133b880620008da6000396000f3fe6080604052600436106102895760003560e01c806368428a1b11610153578063a22cb465116100cb578063d547741f1161007f578063e985e9c511610064578063e985e9c51461075f578063fcf0f0d3146107a8578063ffe630b5146107dc57600080fd5b8063d547741f1461072a578063e33b7de31461074a57600080fd5b8063ba524ff4116100b0578063ba524ff4146106c1578063c87b56dd146106d4578063ce7c2ac2146106f457600080fd5b8063a22cb46514610681578063b88d4fde146106a157600080fd5b80638b83209b1161012257806395d89b411161010757806395d89b41146106215780639852595c14610636578063a217fddf1461066c57600080fd5b80638b83209b146105bb57806391d14854146105db57600080fd5b806368428a1b1461055657806370a082311461057057806372d5916d146105905780637ff9b596146105a557600080fd5b80632f2ff15d1161020157806342842e0e116101b557806355f804b31161019a57806355f804b3146104f65780635bf12028146105165780636352211e1461053657600080fd5b806342842e0e146104b65780634f6ccce7146104d657600080fd5b806336568abe116101e657806336568abe1461046c5780633a98ef391461048c5780633ccfd60b146104a157600080fd5b80632f2ff15d1461042c5780632f745c591461044c57600080fd5b80630f7309e811610258578063191655871161023d57806319165587146103bc57806323b872dd146103dc578063248a9ca3146103fc57600080fd5b80630f7309e81461038857806318160ddd1461039d57600080fd5b806301ffc9a7146102d757806306fdde031461030c578063081812fc1461032e578063095ea7b31461036657600080fd5b366102d2577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156102e357600080fd5b506102f76102f2366004612f06565b6107fc565b60405190151581526020015b60405180910390f35b34801561031857600080fd5b506103216108ff565b60405161030391906130bf565b34801561033a57600080fd5b5061034e610349366004612ec8565b610991565b6040516001600160a01b039091168152602001610303565b34801561037257600080fd5b50610386610381366004612e9c565b610a3c565b005b34801561039457600080fd5b50610321610b6e565b3480156103a957600080fd5b506008545b604051908152602001610303565b3480156103c857600080fd5b506103866103d7366004612d52565b610bfc565b3480156103e857600080fd5b506103866103f7366004612da8565b610df6565b34801561040857600080fd5b506103ae610417366004612ec8565b6000908152600f602052604090206001015490565b34801561043857600080fd5b50610386610447366004612ee1565b610e7d565b34801561045857600080fd5b506103ae610467366004612e9c565b610ea3565b34801561047857600080fd5b50610386610487366004612ee1565b610f4b565b34801561049857600080fd5b50600a546103ae565b3480156104ad57600080fd5b50610386610fd7565b3480156104c257600080fd5b506103866104d1366004612da8565b6110ac565b3480156104e257600080fd5b506103ae6104f1366004612ec8565b6110c7565b34801561050257600080fd5b50610386610511366004612f40565b61116b565b34801561052257600080fd5b50610386610531366004612e9c565b61121a565b34801561054257600080fd5b5061034e610551366004612ec8565b6113d3565b34801561056257600080fd5b506015546102f79060ff1681565b34801561057c57600080fd5b506103ae61058b366004612d52565b611464565b34801561059c57600080fd5b506103866114fe565b3480156105b157600080fd5b506103ae60105481565b3480156105c757600080fd5b5061034e6105d6366004612ec8565b611605565b3480156105e757600080fd5b506102f76105f6366004612ee1565b6000918252600f602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561062d57600080fd5b50610321611635565b34801561064257600080fd5b506103ae610651366004612d52565b6001600160a01b03166000908152600d602052604090205490565b34801561067857600080fd5b506103ae600081565b34801561068d57600080fd5b5061038661069c366004612e69565b611644565b3480156106ad57600080fd5b506103866106bc366004612de9565b611727565b6103866106cf366004612ec8565b6117b5565b3480156106e057600080fd5b506103216106ef366004612ec8565b6119c2565b34801561070057600080fd5b506103ae61070f366004612d52565b6001600160a01b03166000908152600c602052604090205490565b34801561073657600080fd5b50610386610745366004612ee1565b611aab565b34801561075657600080fd5b50600b546103ae565b34801561076b57600080fd5b506102f761077a366004612d6f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107b457600080fd5b506103ae7fb1e380c01db319c0153ea3bb4fbd0ab6639cc088e3bf8cd5319b128f33a2f9e881565b3480156107e857600080fd5b506103866107f7366004612f40565b611ad1565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000008114907f780e9d63000000000000000000000000000000000000000000000000000000008114907f80ac58cd000000000000000000000000000000000000000000000000000000008114907f5b5e139f000000000000000000000000000000000000000000000000000000008114907f01ffc9a7000000000000000000000000000000000000000000000000000000001480806108dc5750825b806108e45750815b806108ec5750835b806108f45750845b979650505050505050565b60606000805461090e906131b3565b80601f016020809104026020016040519081016040528092919081815260200182805461093a906131b3565b80156109875780601f1061095c57610100808354040283529160200191610987565b820191906000526020600020905b81548152906001019060200180831161096a57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a205760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a47826113d3565b9050806001600160a01b0316836001600160a01b03161415610ad15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a17565b336001600160a01b0382161480610aed5750610aed813361077a565b610b5f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a17565b610b698383611b80565b505050565b60168054610b7b906131b3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba7906131b3565b8015610bf45780601f10610bc957610100808354040283529160200191610bf4565b820191906000526020600020905b815481529060010190602001808311610bd757829003601f168201915b505050505081565b6001600160a01b0381166000908152600c6020526040902054610c875760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201527f73686172657300000000000000000000000000000000000000000000000000006064820152608401610a17565b6000600b5447610c9791906130d2565b6001600160a01b0383166000908152600d6020908152604080832054600a54600c909352908320549394509192610cce90856130fe565b610cd891906130ea565b610ce2919061313b565b905080610d575760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201527f647565207061796d656e740000000000000000000000000000000000000000006064820152608401610a17565b6001600160a01b0383166000908152600d6020526040902054610d7b9082906130d2565b6001600160a01b0384166000908152600d6020526040902055600b54610da29082906130d2565b600b55610daf8382611c06565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610e003382611d1f565b610e725760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a17565b610b69838383611e27565b6000828152600f6020526040902060010154610e998133612017565b610b6983836120b5565b6000610eae83611464565b8210610f225760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a17565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381163314610fc95760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610a17565b610fd38282612175565b5050565b610fe26000336105f6565b6110545760405162461bcd60e51b815260206004820152602a60248201527f526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652060448201527f41444d494e20726f6c65000000000000000000000000000000000000000000006064820152608401610a17565b60005b6013548110156110a957600060138281548110611076576110766132e1565b6000918252602090912001546001600160a01b0316905061109681610bfc565b50806110a181613207565b915050611057565b50565b610b6983838360405180602001604052806000815250611727565b60006110d260085490565b82106111465760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610a17565b60088281548110611159576111596132e1565b90600052602060002001549050919050565b6111957fb1e380c01db319c0153ea3bb4fbd0ab6639cc088e3bf8cd5319b128f33a2f9e8336105f6565b6112075760405162461bcd60e51b815260206004820152602860248201527f526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652060448201527f44455620726f6c650000000000000000000000000000000000000000000000006064820152608401610a17565b8051610fd3906012906020840190612c25565b6112256000336105f6565b6112975760405162461bcd60e51b815260206004820152602a60248201527f526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652060448201527f41444d494e20726f6c65000000000000000000000000000000000000000000006064820152608401610a17565b6011546112a59060016130d2565b81106112f35760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420656e6f75676820616e7473206c65667420696e2072657365727665006044820152606401610a17565b60006112fe60085490565b9050612af961130d83836130d2565b106113805760405162461bcd60e51b815260206004820152602860248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201527f206f6620616e74730000000000000000000000000000000000000000000000006064820152608401610a17565b60005b828110156113b657600061139782846130d2565b90506113a38582612216565b50806113ae81613207565b915050611383565b5081601160008282546113c9919061313b565b9091555050505050565b6000818152600260205260408120546001600160a01b03168061145e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a17565b92915050565b60006001600160a01b0382166114e25760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a17565b506001600160a01b031660009081526003602052604090205490565b6115287fb1e380c01db319c0153ea3bb4fbd0ab6639cc088e3bf8cd5319b128f33a2f9e8336105f6565b61159a5760405162461bcd60e51b815260206004820152602860248201527f526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652060448201527f44455620726f6c650000000000000000000000000000000000000000000000006064820152608401610a17565b6015805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921682179092556040519116151581527f1db43677b707321cdfccafe0b6f6f87857b1670eee73e6b93786e18c6136d85c9060200160405180910390a1565b6000600e828154811061161a5761161a6132e1565b6000918252602090912001546001600160a01b031692915050565b60606001805461090e906131b3565b6001600160a01b03821633141561169d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a17565b3360008181526005602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6117313383611d1f565b6117a35760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a17565b6117af84848484612230565b50505050565b60155460ff1661182d5760405162461bcd60e51b815260206004820152602260248201527f53616c65206d7573742062652061637469766520746f206d696e7420616e206160448201527f6e740000000000000000000000000000000000000000000000000000000000006064820152608401610a17565b601581106118a35760405162461bcd60e51b815260206004820152602160248201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610a17565b60006118ae60085490565b90506127116118bd83836130d2565b106119305760405162461bcd60e51b815260206004820152602860248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201527f206f6620616e74730000000000000000000000000000000000000000000000006064820152608401610a17565b8160105461193e91906130fe565b341461198c5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610a17565b60005b82811015610b695760006119a382846130d2565b90506119af3382612216565b50806119ba81613207565b91505061198f565b6000818152600260205260409020546060906001600160a01b0316611a4f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a17565b6000611a596122b9565b90506000815111611a795760405180602001604052806000815250611aa4565b80611a83846122c8565b604051602001611a94929190612fd3565b6040516020818303038152906040525b9392505050565b6000828152600f6020526040902060010154611ac78133612017565b610b698383612175565b611afb7fb1e380c01db319c0153ea3bb4fbd0ab6639cc088e3bf8cd5319b128f33a2f9e8336105f6565b611b6d5760405162461bcd60e51b815260206004820152602860248201527f526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652060448201527f44455620726f6c650000000000000000000000000000000000000000000000006064820152608401610a17565b8051610fd3906016906020840190612c25565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190611bcd826113d3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015611c565760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a17565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ca3576040519150601f19603f3d011682016040523d82523d6000602084013e611ca8565b606091505b5050905080610b695760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a17565b6000818152600260205260408120546001600160a01b0316611da95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a17565b6000611db4836113d3565b9050806001600160a01b0316846001600160a01b03161480611def5750836001600160a01b0316611de484610991565b6001600160a01b0316145b80611e1f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611e3a826113d3565b6001600160a01b031614611eb65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a17565b6001600160a01b038216611f315760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a17565b611f3c8383836123fa565b611f47600082611b80565b6001600160a01b0383166000908152600360205260408120805460019290611f7090849061313b565b90915550506001600160a01b0382166000908152600360205260408120805460019290611f9e9084906130d2565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000828152600f602090815260408083206001600160a01b038516845290915290205460ff16610fd357612055816001600160a01b031660146124b2565b6120608360206124b2565b604051602001612071929190613002565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262461bcd60e51b8252610a17916004016130bf565b6000828152600f602090815260408083206001600160a01b038516845290915290205460ff16610fd3576000828152600f602090815260408083206001600160a01b0385168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556121313390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152600f602090815260408083206001600160a01b038516845290915290205460ff1615610fd3576000828152600f602090815260408083206001600160a01b038516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610fd38282604051806020016040528060008152506126db565b61223b848484611e27565b61224784848484612764565b6117af5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a17565b60606012805461090e906131b3565b60608161230857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612332578061231c81613207565b915061232b9050600a836130ea565b915061230c565b60008167ffffffffffffffff81111561234d5761234d613310565b6040519080825280601f01601f191660200182016040528015612377576020820181803683370190505b5090505b8415611e1f5761238c60018361313b565b9150612399600a86613240565b6123a49060306130d2565b60f81b8183815181106123b9576123b96132e1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506123f3600a866130ea565b945061237b565b6001600160a01b0383166124555761245081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612478565b816001600160a01b0316836001600160a01b03161461247857612478838261292f565b6001600160a01b03821661248f57610b69816129cc565b826001600160a01b0316826001600160a01b031614610b6957610b698282612a7b565b606060006124c18360026130fe565b6124cc9060026130d2565b67ffffffffffffffff8111156124e4576124e4613310565b6040519080825280601f01601f19166020018201604052801561250e576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612545576125456132e1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106125a8576125a86132e1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006125e48460026130fe565b6125ef9060016130d2565b90505b600181111561268c577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110612630576126306132e1565b1a60f81b828281518110612646576126466132e1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936126858161317e565b90506125f2565b508315611aa45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a17565b6126e58383612abf565b6126f26000848484612764565b610b695760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a17565b60006001600160a01b0384163b15612924576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906127c1903390899088908890600401613083565b602060405180830381600087803b1580156127db57600080fd5b505af1925050508015612829575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261282691810190612f23565b60015b6128d9573d808015612857576040519150601f19603f3d011682016040523d82523d6000602084013e61285c565b606091505b5080516128d15760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a17565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611e1f565b506001949350505050565b6000600161293c84611464565b612946919061313b565b600083815260076020526040902054909150808214612999576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906129de9060019061313b565b60008381526009602052604081205460088054939450909284908110612a0657612a066132e1565b906000526020600020015490508060088381548110612a2757612a276132e1565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612a5f57612a5f6132b2565b6001900381819060005260206000200160009055905550505050565b6000612a8683611464565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612b155760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a17565b6000818152600260205260409020546001600160a01b031615612b7a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a17565b612b86600083836123fa565b6001600160a01b0382166000908152600360205260408120805460019290612baf9084906130d2565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612c31906131b3565b90600052602060002090601f016020900481019282612c535760008555612c99565b82601f10612c6c57805160ff1916838001178555612c99565b82800160010185558215612c99579182015b82811115612c99578251825591602001919060010190612c7e565b50612ca5929150612ca9565b5090565b5b80821115612ca55760008155600101612caa565b600067ffffffffffffffff80841115612cd957612cd9613310565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612d1f57612d1f613310565b81604052809350858152868686011115612d3857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612d6457600080fd5b8135611aa48161333f565b60008060408385031215612d8257600080fd5b8235612d8d8161333f565b91506020830135612d9d8161333f565b809150509250929050565b600080600060608486031215612dbd57600080fd5b8335612dc88161333f565b92506020840135612dd88161333f565b929592945050506040919091013590565b60008060008060808587031215612dff57600080fd5b8435612e0a8161333f565b93506020850135612e1a8161333f565b925060408501359150606085013567ffffffffffffffff811115612e3d57600080fd5b8501601f81018713612e4e57600080fd5b612e5d87823560208401612cbe565b91505092959194509250565b60008060408385031215612e7c57600080fd5b8235612e878161333f565b915060208301358015158114612d9d57600080fd5b60008060408385031215612eaf57600080fd5b8235612eba8161333f565b946020939093013593505050565b600060208284031215612eda57600080fd5b5035919050565b60008060408385031215612ef457600080fd5b823591506020830135612d9d8161333f565b600060208284031215612f1857600080fd5b8135611aa481613354565b600060208284031215612f3557600080fd5b8151611aa481613354565b600060208284031215612f5257600080fd5b813567ffffffffffffffff811115612f6957600080fd5b8201601f81018413612f7a57600080fd5b611e1f84823560208401612cbe565b60008151808452612fa1816020860160208601613152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008351612fe5818460208801613152565b835190830190612ff9818360208801613152565b01949350505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161303a816017850160208801613152565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351613077816028840160208801613152565b01602801949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526130b56080830184612f89565b9695505050505050565b602081526000611aa46020830184612f89565b600082198211156130e5576130e5613254565b500190565b6000826130f9576130f9613283565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561313657613136613254565b500290565b60008282101561314d5761314d613254565b500390565b60005b8381101561316d578181015183820152602001613155565b838111156117af5750506000910152565b60008161318d5761318d613254565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c908216806131c757607f821691505b60208210811415613201577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561323957613239613254565b5060010190565b60008261324f5761324f613283565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b03811681146110a957600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146110a957600080fdfea2646970667358221220be278a32eca396ce85a9aff4831e54cb84a4d58024b8b18948a5ae265d3631ff64736f6c6343000806003337423841383737443837353242434539454632333441323037333934453445344241393232363343423239413842444532303238353441433839364434364242b1e380c01db319c0153ea3bb4fbd0ab6639cc088e3bf8cd5319b128f33a2f9e868747470733a2f2f61746f6d6963616e747a2e636f6d2f6170692f6d657461646174612e7068703f546f6b656e49443d

Deployed Bytecode

0x6080604052600436106102895760003560e01c806368428a1b11610153578063a22cb465116100cb578063d547741f1161007f578063e985e9c511610064578063e985e9c51461075f578063fcf0f0d3146107a8578063ffe630b5146107dc57600080fd5b8063d547741f1461072a578063e33b7de31461074a57600080fd5b8063ba524ff4116100b0578063ba524ff4146106c1578063c87b56dd146106d4578063ce7c2ac2146106f457600080fd5b8063a22cb46514610681578063b88d4fde146106a157600080fd5b80638b83209b1161012257806395d89b411161010757806395d89b41146106215780639852595c14610636578063a217fddf1461066c57600080fd5b80638b83209b146105bb57806391d14854146105db57600080fd5b806368428a1b1461055657806370a082311461057057806372d5916d146105905780637ff9b596146105a557600080fd5b80632f2ff15d1161020157806342842e0e116101b557806355f804b31161019a57806355f804b3146104f65780635bf12028146105165780636352211e1461053657600080fd5b806342842e0e146104b65780634f6ccce7146104d657600080fd5b806336568abe116101e657806336568abe1461046c5780633a98ef391461048c5780633ccfd60b146104a157600080fd5b80632f2ff15d1461042c5780632f745c591461044c57600080fd5b80630f7309e811610258578063191655871161023d57806319165587146103bc57806323b872dd146103dc578063248a9ca3146103fc57600080fd5b80630f7309e81461038857806318160ddd1461039d57600080fd5b806301ffc9a7146102d757806306fdde031461030c578063081812fc1461032e578063095ea7b31461036657600080fd5b366102d2577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156102e357600080fd5b506102f76102f2366004612f06565b6107fc565b60405190151581526020015b60405180910390f35b34801561031857600080fd5b506103216108ff565b60405161030391906130bf565b34801561033a57600080fd5b5061034e610349366004612ec8565b610991565b6040516001600160a01b039091168152602001610303565b34801561037257600080fd5b50610386610381366004612e9c565b610a3c565b005b34801561039457600080fd5b50610321610b6e565b3480156103a957600080fd5b506008545b604051908152602001610303565b3480156103c857600080fd5b506103866103d7366004612d52565b610bfc565b3480156103e857600080fd5b506103866103f7366004612da8565b610df6565b34801561040857600080fd5b506103ae610417366004612ec8565b6000908152600f602052604090206001015490565b34801561043857600080fd5b50610386610447366004612ee1565b610e7d565b34801561045857600080fd5b506103ae610467366004612e9c565b610ea3565b34801561047857600080fd5b50610386610487366004612ee1565b610f4b565b34801561049857600080fd5b50600a546103ae565b3480156104ad57600080fd5b50610386610fd7565b3480156104c257600080fd5b506103866104d1366004612da8565b6110ac565b3480156104e257600080fd5b506103ae6104f1366004612ec8565b6110c7565b34801561050257600080fd5b50610386610511366004612f40565b61116b565b34801561052257600080fd5b50610386610531366004612e9c565b61121a565b34801561054257600080fd5b5061034e610551366004612ec8565b6113d3565b34801561056257600080fd5b506015546102f79060ff1681565b34801561057c57600080fd5b506103ae61058b366004612d52565b611464565b34801561059c57600080fd5b506103866114fe565b3480156105b157600080fd5b506103ae60105481565b3480156105c757600080fd5b5061034e6105d6366004612ec8565b611605565b3480156105e757600080fd5b506102f76105f6366004612ee1565b6000918252600f602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561062d57600080fd5b50610321611635565b34801561064257600080fd5b506103ae610651366004612d52565b6001600160a01b03166000908152600d602052604090205490565b34801561067857600080fd5b506103ae600081565b34801561068d57600080fd5b5061038661069c366004612e69565b611644565b3480156106ad57600080fd5b506103866106bc366004612de9565b611727565b6103866106cf366004612ec8565b6117b5565b3480156106e057600080fd5b506103216106ef366004612ec8565b6119c2565b34801561070057600080fd5b506103ae61070f366004612d52565b6001600160a01b03166000908152600c602052604090205490565b34801561073657600080fd5b50610386610745366004612ee1565b611aab565b34801561075657600080fd5b50600b546103ae565b34801561076b57600080fd5b506102f761077a366004612d6f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107b457600080fd5b506103ae7fb1e380c01db319c0153ea3bb4fbd0ab6639cc088e3bf8cd5319b128f33a2f9e881565b3480156107e857600080fd5b506103866107f7366004612f40565b611ad1565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000008114907f780e9d63000000000000000000000000000000000000000000000000000000008114907f80ac58cd000000000000000000000000000000000000000000000000000000008114907f5b5e139f000000000000000000000000000000000000000000000000000000008114907f01ffc9a7000000000000000000000000000000000000000000000000000000001480806108dc5750825b806108e45750815b806108ec5750835b806108f45750845b979650505050505050565b60606000805461090e906131b3565b80601f016020809104026020016040519081016040528092919081815260200182805461093a906131b3565b80156109875780601f1061095c57610100808354040283529160200191610987565b820191906000526020600020905b81548152906001019060200180831161096a57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a205760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a47826113d3565b9050806001600160a01b0316836001600160a01b03161415610ad15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a17565b336001600160a01b0382161480610aed5750610aed813361077a565b610b5f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a17565b610b698383611b80565b505050565b60168054610b7b906131b3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba7906131b3565b8015610bf45780601f10610bc957610100808354040283529160200191610bf4565b820191906000526020600020905b815481529060010190602001808311610bd757829003601f168201915b505050505081565b6001600160a01b0381166000908152600c6020526040902054610c875760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201527f73686172657300000000000000000000000000000000000000000000000000006064820152608401610a17565b6000600b5447610c9791906130d2565b6001600160a01b0383166000908152600d6020908152604080832054600a54600c909352908320549394509192610cce90856130fe565b610cd891906130ea565b610ce2919061313b565b905080610d575760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201527f647565207061796d656e740000000000000000000000000000000000000000006064820152608401610a17565b6001600160a01b0383166000908152600d6020526040902054610d7b9082906130d2565b6001600160a01b0384166000908152600d6020526040902055600b54610da29082906130d2565b600b55610daf8382611c06565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610e003382611d1f565b610e725760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a17565b610b69838383611e27565b6000828152600f6020526040902060010154610e998133612017565b610b6983836120b5565b6000610eae83611464565b8210610f225760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a17565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381163314610fc95760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610a17565b610fd38282612175565b5050565b610fe26000336105f6565b6110545760405162461bcd60e51b815260206004820152602a60248201527f526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652060448201527f41444d494e20726f6c65000000000000000000000000000000000000000000006064820152608401610a17565b60005b6013548110156110a957600060138281548110611076576110766132e1565b6000918252602090912001546001600160a01b0316905061109681610bfc565b50806110a181613207565b915050611057565b50565b610b6983838360405180602001604052806000815250611727565b60006110d260085490565b82106111465760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610a17565b60088281548110611159576111596132e1565b90600052602060002001549050919050565b6111957fb1e380c01db319c0153ea3bb4fbd0ab6639cc088e3bf8cd5319b128f33a2f9e8336105f6565b6112075760405162461bcd60e51b815260206004820152602860248201527f526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652060448201527f44455620726f6c650000000000000000000000000000000000000000000000006064820152608401610a17565b8051610fd3906012906020840190612c25565b6112256000336105f6565b6112975760405162461bcd60e51b815260206004820152602a60248201527f526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652060448201527f41444d494e20726f6c65000000000000000000000000000000000000000000006064820152608401610a17565b6011546112a59060016130d2565b81106112f35760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420656e6f75676820616e7473206c65667420696e2072657365727665006044820152606401610a17565b60006112fe60085490565b9050612af961130d83836130d2565b106113805760405162461bcd60e51b815260206004820152602860248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201527f206f6620616e74730000000000000000000000000000000000000000000000006064820152608401610a17565b60005b828110156113b657600061139782846130d2565b90506113a38582612216565b50806113ae81613207565b915050611383565b5081601160008282546113c9919061313b565b9091555050505050565b6000818152600260205260408120546001600160a01b03168061145e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a17565b92915050565b60006001600160a01b0382166114e25760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a17565b506001600160a01b031660009081526003602052604090205490565b6115287fb1e380c01db319c0153ea3bb4fbd0ab6639cc088e3bf8cd5319b128f33a2f9e8336105f6565b61159a5760405162461bcd60e51b815260206004820152602860248201527f526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652060448201527f44455620726f6c650000000000000000000000000000000000000000000000006064820152608401610a17565b6015805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921682179092556040519116151581527f1db43677b707321cdfccafe0b6f6f87857b1670eee73e6b93786e18c6136d85c9060200160405180910390a1565b6000600e828154811061161a5761161a6132e1565b6000918252602090912001546001600160a01b031692915050565b60606001805461090e906131b3565b6001600160a01b03821633141561169d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a17565b3360008181526005602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6117313383611d1f565b6117a35760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a17565b6117af84848484612230565b50505050565b60155460ff1661182d5760405162461bcd60e51b815260206004820152602260248201527f53616c65206d7573742062652061637469766520746f206d696e7420616e206160448201527f6e740000000000000000000000000000000000000000000000000000000000006064820152608401610a17565b601581106118a35760405162461bcd60e51b815260206004820152602160248201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610a17565b60006118ae60085490565b90506127116118bd83836130d2565b106119305760405162461bcd60e51b815260206004820152602860248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201527f206f6620616e74730000000000000000000000000000000000000000000000006064820152608401610a17565b8160105461193e91906130fe565b341461198c5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610a17565b60005b82811015610b695760006119a382846130d2565b90506119af3382612216565b50806119ba81613207565b91505061198f565b6000818152600260205260409020546060906001600160a01b0316611a4f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a17565b6000611a596122b9565b90506000815111611a795760405180602001604052806000815250611aa4565b80611a83846122c8565b604051602001611a94929190612fd3565b6040516020818303038152906040525b9392505050565b6000828152600f6020526040902060010154611ac78133612017565b610b698383612175565b611afb7fb1e380c01db319c0153ea3bb4fbd0ab6639cc088e3bf8cd5319b128f33a2f9e8336105f6565b611b6d5760405162461bcd60e51b815260206004820152602860248201527f526f6c65733a2063616c6c657220646f6573206e6f742068617665207468652060448201527f44455620726f6c650000000000000000000000000000000000000000000000006064820152608401610a17565b8051610fd3906016906020840190612c25565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190611bcd826113d3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015611c565760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a17565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ca3576040519150601f19603f3d011682016040523d82523d6000602084013e611ca8565b606091505b5050905080610b695760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a17565b6000818152600260205260408120546001600160a01b0316611da95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a17565b6000611db4836113d3565b9050806001600160a01b0316846001600160a01b03161480611def5750836001600160a01b0316611de484610991565b6001600160a01b0316145b80611e1f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611e3a826113d3565b6001600160a01b031614611eb65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a17565b6001600160a01b038216611f315760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a17565b611f3c8383836123fa565b611f47600082611b80565b6001600160a01b0383166000908152600360205260408120805460019290611f7090849061313b565b90915550506001600160a01b0382166000908152600360205260408120805460019290611f9e9084906130d2565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000828152600f602090815260408083206001600160a01b038516845290915290205460ff16610fd357612055816001600160a01b031660146124b2565b6120608360206124b2565b604051602001612071929190613002565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262461bcd60e51b8252610a17916004016130bf565b6000828152600f602090815260408083206001600160a01b038516845290915290205460ff16610fd3576000828152600f602090815260408083206001600160a01b0385168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556121313390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152600f602090815260408083206001600160a01b038516845290915290205460ff1615610fd3576000828152600f602090815260408083206001600160a01b038516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610fd38282604051806020016040528060008152506126db565b61223b848484611e27565b61224784848484612764565b6117af5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a17565b60606012805461090e906131b3565b60608161230857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612332578061231c81613207565b915061232b9050600a836130ea565b915061230c565b60008167ffffffffffffffff81111561234d5761234d613310565b6040519080825280601f01601f191660200182016040528015612377576020820181803683370190505b5090505b8415611e1f5761238c60018361313b565b9150612399600a86613240565b6123a49060306130d2565b60f81b8183815181106123b9576123b96132e1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506123f3600a866130ea565b945061237b565b6001600160a01b0383166124555761245081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612478565b816001600160a01b0316836001600160a01b03161461247857612478838261292f565b6001600160a01b03821661248f57610b69816129cc565b826001600160a01b0316826001600160a01b031614610b6957610b698282612a7b565b606060006124c18360026130fe565b6124cc9060026130d2565b67ffffffffffffffff8111156124e4576124e4613310565b6040519080825280601f01601f19166020018201604052801561250e576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612545576125456132e1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106125a8576125a86132e1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006125e48460026130fe565b6125ef9060016130d2565b90505b600181111561268c577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110612630576126306132e1565b1a60f81b828281518110612646576126466132e1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936126858161317e565b90506125f2565b508315611aa45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a17565b6126e58383612abf565b6126f26000848484612764565b610b695760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a17565b60006001600160a01b0384163b15612924576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906127c1903390899088908890600401613083565b602060405180830381600087803b1580156127db57600080fd5b505af1925050508015612829575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261282691810190612f23565b60015b6128d9573d808015612857576040519150601f19603f3d011682016040523d82523d6000602084013e61285c565b606091505b5080516128d15760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a17565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611e1f565b506001949350505050565b6000600161293c84611464565b612946919061313b565b600083815260076020526040902054909150808214612999576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906129de9060019061313b565b60008381526009602052604081205460088054939450909284908110612a0657612a066132e1565b906000526020600020015490508060088381548110612a2757612a276132e1565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612a5f57612a5f6132b2565b6001900381819060005260206000200160009055905550505050565b6000612a8683611464565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612b155760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a17565b6000818152600260205260409020546001600160a01b031615612b7a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a17565b612b86600083836123fa565b6001600160a01b0382166000908152600360205260408120805460019290612baf9084906130d2565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612c31906131b3565b90600052602060002090601f016020900481019282612c535760008555612c99565b82601f10612c6c57805160ff1916838001178555612c99565b82800160010185558215612c99579182015b82811115612c99578251825591602001919060010190612c7e565b50612ca5929150612ca9565b5090565b5b80821115612ca55760008155600101612caa565b600067ffffffffffffffff80841115612cd957612cd9613310565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612d1f57612d1f613310565b81604052809350858152868686011115612d3857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612d6457600080fd5b8135611aa48161333f565b60008060408385031215612d8257600080fd5b8235612d8d8161333f565b91506020830135612d9d8161333f565b809150509250929050565b600080600060608486031215612dbd57600080fd5b8335612dc88161333f565b92506020840135612dd88161333f565b929592945050506040919091013590565b60008060008060808587031215612dff57600080fd5b8435612e0a8161333f565b93506020850135612e1a8161333f565b925060408501359150606085013567ffffffffffffffff811115612e3d57600080fd5b8501601f81018713612e4e57600080fd5b612e5d87823560208401612cbe565b91505092959194509250565b60008060408385031215612e7c57600080fd5b8235612e878161333f565b915060208301358015158114612d9d57600080fd5b60008060408385031215612eaf57600080fd5b8235612eba8161333f565b946020939093013593505050565b600060208284031215612eda57600080fd5b5035919050565b60008060408385031215612ef457600080fd5b823591506020830135612d9d8161333f565b600060208284031215612f1857600080fd5b8135611aa481613354565b600060208284031215612f3557600080fd5b8151611aa481613354565b600060208284031215612f5257600080fd5b813567ffffffffffffffff811115612f6957600080fd5b8201601f81018413612f7a57600080fd5b611e1f84823560208401612cbe565b60008151808452612fa1816020860160208601613152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008351612fe5818460208801613152565b835190830190612ff9818360208801613152565b01949350505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161303a816017850160208801613152565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351613077816028840160208801613152565b01602801949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526130b56080830184612f89565b9695505050505050565b602081526000611aa46020830184612f89565b600082198211156130e5576130e5613254565b500190565b6000826130f9576130f9613283565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561313657613136613254565b500290565b60008282101561314d5761314d613254565b500390565b60005b8381101561316d578181015183820152602001613155565b838111156117af5750506000910152565b60008161318d5761318d613254565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c908216806131c757607f821691505b60208210811415613201577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561323957613239613254565b5060010190565b60008261324f5761324f613283565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b03811681146110a957600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146110a957600080fdfea2646970667358221220be278a32eca396ce85a9aff4831e54cb84a4d58024b8b18948a5ae265d3631ff64736f6c63430008060033

Deployed Bytecode Sourcemap

56947:4070:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33605:40;3331:10;33605:40;;;-1:-1:-1;;;;;7492:55:1;;;7474:74;;33635:9:0;7579:2:1;7564:18;;7557:34;7447:18;33605:40:0;;;;;;;56947:4070;;;;;60380:634;;;;;;;;;;-1:-1:-1;60380:634:0;;;;;:::i;:::-;;:::i;:::-;;;8585:14:1;;8578:22;8560:41;;8548:2;8533:18;60380:634:0;;;;;;;;38751:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40310:221::-;;;;;;;;;;-1:-1:-1;40310:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7225:55:1;;;7207:74;;7195:2;7180:18;40310:221:0;7162:125:1;39833:411:0;;;;;;;;;;-1:-1:-1;39833:411:0;;;;;:::i;:::-;;:::i;:::-;;57616:93;;;;;;;;;;;;;:::i;51178:113::-;;;;;;;;;;-1:-1:-1;51266:10:0;:17;51178:113;;;8758:25:1;;;8746:2;8731:18;51178:113:0;8713:76:1;34811:613:0;;;;;;;;;;-1:-1:-1;34811:613:0;;;;;:::i;:::-;;:::i;41200:339::-;;;;;;;;;;-1:-1:-1;41200:339:0;;;;;:::i;:::-;;:::i;28676:123::-;;;;;;;;;;-1:-1:-1;28676:123:0;;;;;:::i;:::-;28742:7;28769:12;;;:6;:12;;;;;:22;;;;28676:123;29061:147;;;;;;;;;;-1:-1:-1;29061:147:0;;;;;:::i;:::-;;:::i;50846:256::-;;;;;;;;;;-1:-1:-1;50846:256:0;;;;;:::i;:::-;;:::i;30109:218::-;;;;;;;;;;-1:-1:-1;30109:218:0;;;;;:::i;:::-;;:::i;33736:91::-;;;;;;;;;;-1:-1:-1;33807:12:0;;33736:91;;59553:207;;;;;;;;;;;;;:::i;41610:185::-;;;;;;;;;;-1:-1:-1;41610:185:0;;;;;:::i;:::-;;:::i;51368:233::-;;;;;;;;;;-1:-1:-1;51368:233:0;;;;;:::i;:::-;;:::i;59895:104::-;;;;;;;;;;-1:-1:-1;59895:104:0;;;;;:::i;:::-;;:::i;59058:489::-;;;;;;;;;;-1:-1:-1;59058:489:0;;;;;:::i;:::-;;:::i;38445:239::-;;;;;;;;;;-1:-1:-1;38445:239:0;;;;;:::i;:::-;;:::i;57521:30::-;;;;;;;;;;-1:-1:-1;57521:30:0;;;;;;;;38175:208;;;;;;;;;;-1:-1:-1;38175:208:0;;;;;:::i;:::-;;:::i;59766:123::-;;;;;;;;;;;;;:::i;57026:45::-;;;;;;;;;;;;;;;;34511:100;;;;;;;;;;-1:-1:-1;34511:100:0;;;;;:::i;:::-;;:::i;27561:139::-;;;;;;;;;;-1:-1:-1;27561:139:0;;;;;:::i;:::-;27639:4;27663:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;27663:29:0;;;;;;;;;;;;;;;27561:139;38920:104;;;;;;;;;;;;;:::i;34311:109::-;;;;;;;;;;-1:-1:-1;34311:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;34394:18:0;34367:7;34394:18;;;:9;:18;;;;;;;34311:109;26652:49;;;;;;;;;;-1:-1:-1;26652:49:0;26697:4;26652:49;;40603:295;;;;;;;;;;-1:-1:-1;40603:295:0;;;;;:::i;:::-;;:::i;41866:328::-;;;;;;;;;;-1:-1:-1;41866:328:0;;;;;:::i;:::-;;:::i;58466:586::-;;;;;;:::i;:::-;;:::i;39095:334::-;;;;;;;;;;-1:-1:-1;39095:334:0;;;;;:::i;:::-;;:::i;34107:105::-;;;;;;;;;;-1:-1:-1;34107:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;34188:16:0;34161:7;34188:16;;;:7;:16;;;;;;;34107:105;29453:149;;;;;;;;;;-1:-1:-1;29453:149:0;;;;;:::i;:::-;;:::i;33921:95::-;;;;;;;;;;-1:-1:-1;33994:14:0;;33921:95;;40969:164;;;;;;;;;;-1:-1:-1;40969:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;41090:25:0;;;41066:4;41090:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40969:164;57558:51;;;;;;;;;;;;57593:16;57558:51;;60005:117;;;;;;;;;;-1:-1:-1;60005:117:0;;;;;:::i;:::-;;:::i;60380:634::-;60495:4;60537:49;;;60552:34;60537:49;;;60639:37;60624:52;;;60719:27;60704:42;;;60797:35;60782:50;;;60875:27;60860:42;;;60920:22;;;60933:9;60920:22;:43;;;;60946:17;60920:43;:66;;;;60967:19;60920:66;:86;;;;60990:16;60920:86;60913:93;60380:634;-1:-1:-1;;;;;;;60380:634:0:o;38751:100::-;38805:13;38838:5;38831:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38751:100;:::o;40310:221::-;40386:7;43793:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43793:16:0;40406:73;;;;-1:-1:-1;;;40406:73:0;;17143:2:1;40406:73:0;;;17125:21:1;17182:2;17162:18;;;17155:30;17221:34;17201:18;;;17194:62;17292:14;17272:18;;;17265:42;17324:19;;40406:73:0;;;;;;;;;-1:-1:-1;40499:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;40499:24:0;;40310:221::o;39833:411::-;39914:13;39930:23;39945:7;39930:14;:23::i;:::-;39914:39;;39978:5;-1:-1:-1;;;;;39972:11:0;:2;-1:-1:-1;;;;;39972:11:0;;;39964:57;;;;-1:-1:-1;;;39964:57:0;;18742:2:1;39964:57:0;;;18724:21:1;18781:2;18761:18;;;18754:30;18820:34;18800:18;;;18793:62;18891:3;18871:18;;;18864:31;18912:19;;39964:57:0;18714:223:1;39964:57:0;3331:10;-1:-1:-1;;;;;40056:21:0;;;;:62;;-1:-1:-1;40081:37:0;40098:5;3331:10;40969:164;:::i;40081:37::-;40034:168;;;;-1:-1:-1;;;40034:168:0;;14716:2:1;40034:168:0;;;14698:21:1;14755:2;14735:18;;;14728:30;14794:34;14774:18;;;14767:62;14865:26;14845:18;;;14838:54;14909:19;;40034:168:0;14688:246:1;40034:168:0;40215:21;40224:2;40228:7;40215:8;:21::i;:::-;39903:341;39833:411;;:::o;57616:93::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34811:613::-;-1:-1:-1;;;;;34887:16:0;;34906:1;34887:16;;;:7;:16;;;;;;34879:71;;;;-1:-1:-1;;;34879:71:0;;11178:2:1;34879:71:0;;;11160:21:1;11217:2;11197:18;;;11190:30;11256:34;11236:18;;;11229:62;11327:8;11307:18;;;11300:36;11353:19;;34879:71:0;11150:228:1;34879:71:0;34963:21;35011:14;;34987:21;:38;;;;:::i;:::-;-1:-1:-1;;;;;35106:18:0;;35036:15;35106:18;;;:9;:18;;;;;;;;;35091:12;;35071:7;:16;;;;;;;34963:62;;-1:-1:-1;35036:15:0;;35055:32;;34963:62;35055:32;:::i;:::-;35054:49;;;;:::i;:::-;:70;;;;:::i;:::-;35036:88;-1:-1:-1;35145:12:0;35137:68;;;;-1:-1:-1;;;35137:68:0;;13902:2:1;35137:68:0;;;13884:21:1;13941:2;13921:18;;;13914:30;13980:34;13960:18;;;13953:62;14051:13;14031:18;;;14024:41;14082:19;;35137:68:0;13874:233:1;35137:68:0;-1:-1:-1;;;;;35239:18:0;;;;;;:9;:18;;;;;;:28;;35260:7;;35239:28;:::i;:::-;-1:-1:-1;;;;;35218:18:0;;;;;;:9;:18;;;;;:49;35295:14;;:24;;35312:7;;35295:24;:::i;:::-;35278:14;:41;35332:35;35350:7;35359;35332:17;:35::i;:::-;35383:33;;;-1:-1:-1;;;;;7492:55:1;;7474:74;;7579:2;7564:18;;7557:34;;;35383:33:0;;7447:18:1;35383:33:0;;;;;;;34868:556;;34811:613;:::o;41200:339::-;41395:41;3331:10;41428:7;41395:18;:41::i;:::-;41387:103;;;;-1:-1:-1;;;41387:103:0;;19144:2:1;41387:103:0;;;19126:21:1;19183:2;19163:18;;;19156:30;19222:34;19202:18;;;19195:62;19293:19;19273:18;;;19266:47;19330:19;;41387:103:0;19116:239:1;41387:103:0;41503:28;41513:4;41519:2;41523:7;41503:9;:28::i;29061:147::-;28742:7;28769:12;;;:6;:12;;;;;:22;;;27143:30;27154:4;3331:10;27143;:30::i;:::-;29175:25:::1;29186:4;29192:7;29175:10;:25::i;50846:256::-:0;50943:7;50979:23;50996:5;50979:16;:23::i;:::-;50971:5;:31;50963:87;;;;-1:-1:-1;;;50963:87:0;;9990:2:1;50963:87:0;;;9972:21:1;10029:2;10009:18;;;10002:30;10068:34;10048:18;;;10041:62;10139:13;10119:18;;;10112:41;10170:19;;50963:87:0;9962:233:1;50963:87:0;-1:-1:-1;;;;;;51068:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;50846:256::o;30109:218::-;-1:-1:-1;;;;;30205:23:0;;3331:10;30205:23;30197:83;;;;-1:-1:-1;;;30197:83:0;;20378:2:1;30197:83:0;;;20360:21:1;20417:2;20397:18;;;20390:30;20456:34;20436:18;;;20429:62;20527:17;20507:18;;;20500:45;20562:19;;30197:83:0;20350:237:1;30197:83:0;30293:26;30305:4;30311:7;30293:11;:26::i;:::-;30109:218;;:::o;59553:207::-;58348:44;26697:4;3331:10;27561:139;:::i;58348:44::-;58339:101;;;;-1:-1:-1;;;58339:101:0;;16371:2:1;58339:101:0;;;16353:21:1;16410:2;16390:18;;;16383:30;16449:34;16429:18;;;16422:62;16520:12;16500:18;;;16493:40;16550:19;;58339:101:0;16343:232:1;58339:101:0;59611:9:::1;59605:148;59630:5;:12:::0;59626:16;::::1;59605:148;;;59665:22;59699:5;59705:1;59699:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;59699:8:0::1;::::0;-1:-1:-1;59724:17:0::1;59699:8:::0;59724:7:::1;:17::i;:::-;-1:-1:-1::0;59644:3:0;::::1;::::0;::::1;:::i;:::-;;;;59605:148;;;;59553:207::o:0;41610:185::-;41748:39;41765:4;41771:2;41775:7;41748:39;;;;;;;;;;;;:16;:39::i;51368:233::-;51443:7;51479:30;51266:10;:17;;51178:113;51479:30;51471:5;:38;51463:95;;;;-1:-1:-1;;;51463:95:0;;19562:2:1;51463:95:0;;;19544:21:1;19601:2;19581:18;;;19574:30;19640:34;19620:18;;;19613:62;19711:14;19691:18;;;19684:42;19743:19;;51463:95:0;19534:234:1;51463:95:0;51576:10;51587:5;51576:17;;;;;;;;:::i;:::-;;;;;;;;;51569:24;;51368:233;;;:::o;59895:104::-;58200:34;57593:16;3331:10;27561:139;:::i;58200:34::-;58191:89;;;;-1:-1:-1;;;58191:89:0;;15962:2:1;58191:89:0;;;15944:21:1;16001:2;15981:18;;;15974:30;16040:34;16020:18;;;16013:62;16111:10;16091:18;;;16084:38;16139:19;;58191:89:0;15934:230:1;58191:89:0;59969:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;59058:489::-:0;58348:44;26697:4;3331:10;27561:139;:::i;58348:44::-;58339:101;;;;-1:-1:-1;;;58339:101:0;;16371:2:1;58339:101:0;;;16353:21:1;16410:2;16390:18;;;16383:30;16449:34;16429:18;;;16422:62;16520:12;16500:18;;;16493:40;16550:19;;58339:101:0;16343:232:1;58339:101:0;59165:8:::1;::::0;:12:::1;::::0;59176:1:::1;59165:12;:::i;:::-;59154:8;:23;59145:69;;;::::0;-1:-1:-1;;;59145:69:0;;18382:2:1;59145:69:0::1;::::0;::::1;18364:21:1::0;18421:2;18401:18;;;18394:30;18460:33;18440:18;;;18433:61;18511:18;;59145:69:0::1;18354:181:1::0;59145:69:0::1;59225:16;59244:14;51266:10:::0;:17;;51178:113;59244:14:::1;59225:33:::0;-1:-1:-1;59303:5:0::1;59278:22;59292:8:::0;59225:33;59278:22:::1;:::i;:::-;:30;59269:85;;;::::0;-1:-1:-1;;;59269:85:0;;9581:2:1;59269:85:0::1;::::0;::::1;9563:21:1::0;9620:2;9600:18;;;9593:30;9659:34;9639:18;;;9632:62;9730:10;9710:18;;;9703:38;9758:19;;59269:85:0::1;9553:230:1::0;59269:85:0::1;59370:6;59365:144;59386:8;59382:1;:12;59365:144;;;59417:14;59434:15;59448:1:::0;59434:11;:15:::1;:::i;:::-;59417:32;;59464:33;59475:9;59486;59464;:33::i;:::-;-1:-1:-1::0;59396:3:0;::::1;::::0;::::1;:::i;:::-;;;;59365:144;;;;59531:8;59519;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;59058:489:0:o;38445:239::-;38517:7;38553:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38553:16:0;38588:19;38580:73;;;;-1:-1:-1;;;38580:73:0;;15552:2:1;38580:73:0;;;15534:21:1;15591:2;15571:18;;;15564:30;15630:34;15610:18;;;15603:62;15701:11;15681:18;;;15674:39;15730:19;;38580:73:0;15524:231:1;38580:73:0;38671:5;38445:239;-1:-1:-1;;38445:239:0:o;38175:208::-;38247:7;-1:-1:-1;;;;;38275:19:0;;38267:74;;;;-1:-1:-1;;;38267:74:0;;15141:2:1;38267:74:0;;;15123:21:1;15180:2;15160:18;;;15153:30;15219:34;15199:18;;;15192:62;15290:12;15270:18;;;15263:40;15320:19;;38267:74:0;15113:232:1;38267:74:0;-1:-1:-1;;;;;;38359:16:0;;;;;:9;:16;;;;;;;38175:208::o;59766:123::-;58200:34;57593:16;3331:10;27561:139;:::i;58200:34::-;58191:89;;;;-1:-1:-1;;;58191:89:0;;15962:2:1;58191:89:0;;;15944:21:1;16001:2;15981:18;;;15974:30;16040:34;16020:18;;;16013:62;16111:10;16091:18;;;16084:38;16139:19;;58191:89:0;15934:230:1;58191:89:0;59831:10:::1;::::0;;::::1;::::0;;::::1;59830:11;59817:24:::0;;;::::1;::::0;::::1;::::0;;;59857::::1;::::0;59870:10;;8585:14:1;8578:22;8560:41;;59857:24:0::1;::::0;8548:2:1;8533:18;59857:24:0::1;;;;;;;59766:123::o:0;34511:100::-;34562:7;34589;34597:5;34589:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;34589:14:0;;34511:100;-1:-1:-1;;34511:100:0:o;38920:104::-;38976:13;39009:7;39002:14;;;;;:::i;40603:295::-;-1:-1:-1;;;;;40706:24:0;;3331:10;40706:24;;40698:62;;;;-1:-1:-1;;;40698:62:0;;11990:2:1;40698:62:0;;;11972:21:1;12029:2;12009:18;;;12002:30;12068:27;12048:18;;;12041:55;12113:18;;40698:62:0;11962:175:1;40698:62:0;3331:10;40773:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;40773:42:0;;;;;;;;;;;;:53;;;;;;;;;;;;;40842:48;;8560:41:1;;;40773:42:0;;3331:10;40842:48;;8533:18:1;40842:48:0;;;;;;;40603:295;;:::o;41866:328::-;42041:41;3331:10;42074:7;42041:18;:41::i;:::-;42033:103;;;;-1:-1:-1;;;42033:103:0;;19144:2:1;42033:103:0;;;19126:21:1;19183:2;19163:18;;;19156:30;19222:34;19202:18;;;19195:62;19293:19;19273:18;;;19266:47;19330:19;;42033:103:0;19116:239:1;42033:103:0;42147:39;42161:4;42167:2;42171:7;42180:5;42147:13;:39::i;:::-;41866:328;;;;:::o;58466:586::-;58535:10;;;;58526:59;;;;-1:-1:-1;;;58526:59:0;;19975:2:1;58526:59:0;;;19957:21:1;20014:2;19994:18;;;19987:30;20053:34;20033:18;;;20026:62;20124:4;20104:18;;;20097:32;20146:19;;58526:59:0;19947:224:1;58526:59:0;58616:2;58605:8;:13;58596:61;;;;-1:-1:-1;;;58596:61:0;;14314:2:1;58596:61:0;;;14296:21:1;14353:2;14333:18;;;14326:30;14392:34;14372:18;;;14365:62;14463:3;14443:18;;;14436:31;14484:19;;58596:61:0;14286:223:1;58596:61:0;58668:16;58687:13;51266:10;:17;;51178:113;58687:13;58668:32;-1:-1:-1;58745:5:0;58720:22;58734:8;58668:32;58720:22;:::i;:::-;:30;58711:84;;;;-1:-1:-1;;;58711:84:0;;9581:2:1;58711:84:0;;;9563:21:1;9620:2;9600:18;;;9593:30;9659:34;9639:18;;;9632:62;9730:10;9710:18;;;9703:38;9758:19;;58711:84:0;9553:230:1;58711:84:0;58841:8;58828:10;;:21;;;;:::i;:::-;58815:9;:34;58806:80;;;;-1:-1:-1;;;58806:80:0;;12344:2:1;58806:80:0;;;12326:21:1;12383:2;12363:18;;;12356:30;12422:33;12402:18;;;12395:61;12473:18;;58806:80:0;12316:181:1;58806:80:0;58902:6;58897:148;58918:8;58914:1;:12;58897:148;;;58949:14;58966:15;58980:1;58966:11;:15;:::i;:::-;58949:32;-1:-1:-1;58996:37:0;3331:10;59022:9;58996;:37::i;:::-;-1:-1:-1;58928:3:0;;;;:::i;:::-;;;;58897:148;;39095:334;43769:4;43793:16;;;:7;:16;;;;;;39168:13;;-1:-1:-1;;;;;43793:16:0;39194:76;;;;-1:-1:-1;;;39194:76:0;;17966:2:1;39194:76:0;;;17948:21:1;18005:2;17985:18;;;17978:30;18044:34;18024:18;;;18017:62;18115:17;18095:18;;;18088:45;18150:19;;39194:76:0;17938:237:1;39194:76:0;39283:21;39307:10;:8;:10::i;:::-;39283:34;;39359:1;39341:7;39335:21;:25;:86;;;;;;;;;;;;;;;;;39387:7;39396:18;:7;:16;:18::i;:::-;39370:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39335:86;39328:93;39095:334;-1:-1:-1;;;39095:334:0:o;29453:149::-;28742:7;28769:12;;;:6;:12;;;;;:22;;;27143:30;27154:4;3331:10;27143;:30::i;:::-;29568:26:::1;29580:4;29586:7;29568:11;:26::i;60005:117::-:0;58200:34;57593:16;3331:10;27561:139;:::i;58200:34::-;58191:89;;;;-1:-1:-1;;;58191:89:0;;15962:2:1;58191:89:0;;;15944:21:1;16001:2;15981:18;;;15974:30;16040:34;16020:18;;;16013:62;16111:10;16091:18;;;16084:38;16139:19;;58191:89:0;15934:230:1;58191:89:0;60088:26;;::::1;::::0;:10:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;47686:174::-:0;47761:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;47761:29:0;;;;;;;;:24;;47815:23;47761:24;47815:14;:23::i;:::-;-1:-1:-1;;;;;47806:46:0;;;;;;;;;;;47686:174;;:::o;5397:317::-;5512:6;5487:21;:31;;5479:73;;;;-1:-1:-1;;;5479:73:0;;13131:2:1;5479:73:0;;;13113:21:1;13170:2;13150:18;;;13143:30;13209:31;13189:18;;;13182:59;13258:18;;5479:73:0;13103:179:1;5479:73:0;5566:12;5584:9;-1:-1:-1;;;;;5584:14:0;5606:6;5584:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5565:52;;;5636:7;5628:78;;;;-1:-1:-1;;;5628:78:0;;12704:2:1;5628:78:0;;;12686:21:1;12743:2;12723:18;;;12716:30;12782:34;12762:18;;;12755:62;12853:28;12833:18;;;12826:56;12899:19;;5628:78:0;12676:248:1;43998:348:0;44091:4;43793:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43793:16:0;44108:73;;;;-1:-1:-1;;;44108:73:0;;13489:2:1;44108:73:0;;;13471:21:1;13528:2;13508:18;;;13501:30;13567:34;13547:18;;;13540:62;13638:14;13618:18;;;13611:42;13670:19;;44108:73:0;13461:234:1;44108:73:0;44192:13;44208:23;44223:7;44208:14;:23::i;:::-;44192:39;;44261:5;-1:-1:-1;;;;;44250:16:0;:7;-1:-1:-1;;;;;44250:16:0;;:51;;;;44294:7;-1:-1:-1;;;;;44270:31:0;:20;44282:7;44270:11;:20::i;:::-;-1:-1:-1;;;;;44270:31:0;;44250:51;:87;;;-1:-1:-1;;;;;;41090:25:0;;;41066:4;41090:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;44305:32;44242:96;43998:348;-1:-1:-1;;;;43998:348:0:o;46990:578::-;47149:4;-1:-1:-1;;;;;47122:31:0;:23;47137:7;47122:14;:23::i;:::-;-1:-1:-1;;;;;47122:31:0;;47114:85;;;;-1:-1:-1;;;47114:85:0;;17556:2:1;47114:85:0;;;17538:21:1;17595:2;17575:18;;;17568:30;17634:34;17614:18;;;17607:62;17705:11;17685:18;;;17678:39;17734:19;;47114:85:0;17528:231:1;47114:85:0;-1:-1:-1;;;;;47218:16:0;;47210:65;;;;-1:-1:-1;;;47210:65:0;;11585:2:1;47210:65:0;;;11567:21:1;11624:2;11604:18;;;11597:30;11663:34;11643:18;;;11636:62;11734:6;11714:18;;;11707:34;11758:19;;47210:65:0;11557:226:1;47210:65:0;47288:39;47309:4;47315:2;47319:7;47288:20;:39::i;:::-;47392:29;47409:1;47413:7;47392:8;:29::i;:::-;-1:-1:-1;;;;;47434:15:0;;;;;;:9;:15;;;;;:20;;47453:1;;47434:15;:20;;47453:1;;47434:20;:::i;:::-;;;;-1:-1:-1;;;;;;;47465:13:0;;;;;;:9;:13;;;;;:18;;47482:1;;47465:13;:18;;47482:1;;47465:18;:::i;:::-;;;;-1:-1:-1;;47494:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;47494:21:0;;;;;;;;;47533:27;;47494:16;;47533:27;;;;;;;46990:578;;;:::o;27990:497::-;27639:4;27663:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;27663:29:0;;;;;;;;;;;;28066:414;;28259:41;28287:7;-1:-1:-1;;;;;28259:41:0;28297:2;28259:19;:41::i;:::-;28373:38;28401:4;28408:2;28373:19;:38::i;:::-;28164:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;28110:358:0;;;;;;;:::i;31413:229::-;27639:4;27663:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;27663:29:0;;;;;;;;;;;;31483:152;;31527:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;31527:29:0;;;;;;;;;:36;;;;31559:4;31527:36;;;31610:12;3331:10;;3251:98;31610:12;-1:-1:-1;;;;;31583:40:0;31601:7;-1:-1:-1;;;;;31583:40:0;31595:4;31583:40;;;;;;;;;;31413:229;;:::o;31650:230::-;27639:4;27663:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;27663:29:0;;;;;;;;;;;;31721:152;;;31796:5;31764:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;31764:29:0;;;;;;;;;;:37;;;;;;31821:40;3331:10;;31764:12;;31821:40;;31796:5;31821:40;31650:230;;:::o;44688:110::-;44764:26;44774:2;44778:7;44764:26;;;;;;;;;;;;:9;:26::i;43076:315::-;43233:28;43243:4;43249:2;43253:7;43233:9;:28::i;:::-;43280:48;43303:4;43309:2;43313:7;43322:5;43280:22;:48::i;:::-;43272:111;;;;-1:-1:-1;;;43272:111:0;;10402:2:1;43272:111:0;;;10384:21:1;10441:2;10421:18;;;10414:30;10480:34;10460:18;;;10453:62;10551:20;10531:18;;;10524:48;10589:19;;43272:111:0;10374:240:1;60128:108:0;60182:13;60216:12;60209:19;;;;;:::i;19275:723::-;19331:13;19552:10;19548:53;;-1:-1:-1;;19579:10:0;;;;;;;;;;;;;;;;;;19275:723::o;19548:53::-;19626:5;19611:12;19667:78;19674:9;;19667:78;;19700:8;;;;:::i;:::-;;-1:-1:-1;19723:10:0;;-1:-1:-1;19731:2:0;19723:10;;:::i;:::-;;;19667:78;;;19755:19;19787:6;19777:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19777:17:0;;19755:39;;19805:154;19812:10;;19805:154;;19839:11;19849:1;19839:11;;:::i;:::-;;-1:-1:-1;19908:10:0;19916:2;19908:5;:10;:::i;:::-;19895:24;;:2;:24;:::i;:::-;19882:39;;19865:6;19872;19865:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;19936:11:0;19945:2;19936:11;;:::i;:::-;;;19805:154;;52214:589;-1:-1:-1;;;;;52420:18:0;;52416:187;;52455:40;52487:7;53630:10;:17;;53603:24;;;;:15;:24;;;;;:44;;;53658:24;;;;;;;;;;;;53526:164;52455:40;52416:187;;;52525:2;-1:-1:-1;;;;;52517:10:0;:4;-1:-1:-1;;;;;52517:10:0;;52513:90;;52544:47;52577:4;52583:7;52544:32;:47::i;:::-;-1:-1:-1;;;;;52617:16:0;;52613:183;;52650:45;52687:7;52650:36;:45::i;52613:183::-;52723:4;-1:-1:-1;;;;;52717:10:0;:2;-1:-1:-1;;;;;52717:10:0;;52713:83;;52744:40;52772:2;52776:7;52744:27;:40::i;20576:451::-;20651:13;20677:19;20709:10;20713:6;20709:1;:10;:::i;:::-;:14;;20722:1;20709:14;:::i;:::-;20699:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20699:25:0;;20677:47;;20735:15;:6;20742:1;20735:9;;;;;;;;:::i;:::-;;;;:15;;;;;;;;;;;20761;:6;20768:1;20761:9;;;;;;;;:::i;:::-;;;;:15;;;;;;;;;;-1:-1:-1;20792:9:0;20804:10;20808:6;20804:1;:10;:::i;:::-;:14;;20817:1;20804:14;:::i;:::-;20792:26;;20787:135;20824:1;20820;:5;20787:135;;;20859:12;20872:5;20880:3;20872:11;20859:25;;;;;;;:::i;:::-;;;;20847:6;20854:1;20847:9;;;;;;;;:::i;:::-;;;;:37;;;;;;;;;;-1:-1:-1;20909:1:0;20899:11;;;;;20827:3;;;:::i;:::-;;;20787:135;;;-1:-1:-1;20940:10:0;;20932:55;;;;-1:-1:-1;;;20932:55:0;;9220:2:1;20932:55:0;;;9202:21:1;;;9239:18;;;9232:30;9298:34;9278:18;;;9271:62;9350:18;;20932:55:0;9192:182:1;45025:321:0;45155:18;45161:2;45165:7;45155:5;:18::i;:::-;45206:54;45237:1;45241:2;45245:7;45254:5;45206:22;:54::i;:::-;45184:154;;;;-1:-1:-1;;;45184:154:0;;10402:2:1;45184:154:0;;;10384:21:1;10441:2;10421:18;;;10414:30;10480:34;10460:18;;;10453:62;10551:20;10531:18;;;10524:48;10589:19;;45184:154:0;10374:240:1;48425:799:0;48580:4;-1:-1:-1;;;;;48601:13:0;;4398:20;4446:8;48597:620;;48637:72;;;;;-1:-1:-1;;;;;48637:36:0;;;;;:72;;3331:10;;48688:4;;48694:7;;48703:5;;48637:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48637:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48633:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48879:13:0;;48875:272;;48922:60;;-1:-1:-1;;;48922:60:0;;10402:2:1;48922:60:0;;;10384:21:1;10441:2;10421:18;;;10414:30;10480:34;10460:18;;;10453:62;10551:20;10531:18;;;10524:48;10589:19;;48922:60:0;10374:240:1;48875:272:0;49097:6;49091:13;49082:6;49078:2;49074:15;49067:38;48633:529;48760:51;;48770:41;48760:51;;-1:-1:-1;48753:58:0;;48597:620;-1:-1:-1;49201:4:0;48425:799;;;;;;:::o;54317:988::-;54583:22;54633:1;54608:22;54625:4;54608:16;:22::i;:::-;:26;;;;:::i;:::-;54645:18;54666:26;;;:17;:26;;;;;;54583:51;;-1:-1:-1;54799:28:0;;;54795:328;;-1:-1:-1;;;;;54866:18:0;;54844:19;54866:18;;;:12;:18;;;;;;;;:34;;;;;;;;;54917:30;;;;;;:44;;;55034:30;;:17;:30;;;;;:43;;;54795:328;-1:-1:-1;55219:26:0;;;;:17;:26;;;;;;;;55212:33;;;-1:-1:-1;;;;;55263:18:0;;;;;:12;:18;;;;;:34;;;;;;;55256:41;54317:988::o;55600:1079::-;55878:10;:17;55853:22;;55878:21;;55898:1;;55878:21;:::i;:::-;55910:18;55931:24;;;:15;:24;;;;;;56304:10;:26;;55853:46;;-1:-1:-1;55931:24:0;;55853:46;;56304:26;;;;;;:::i;:::-;;;;;;;;;56282:48;;56368:11;56343:10;56354;56343:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;56448:28;;;:15;:28;;;;;;;:41;;;56620:24;;;;;56613:31;56655:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;55671:1008;;;55600:1079;:::o;53104:221::-;53189:14;53206:20;53223:2;53206:16;:20::i;:::-;-1:-1:-1;;;;;53237:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;53282:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;53104:221:0:o;45682:382::-;-1:-1:-1;;;;;45762:16:0;;45754:61;;;;-1:-1:-1;;;45754:61:0;;16782:2:1;45754:61:0;;;16764:21:1;;;16801:18;;;16794:30;16860:34;16840:18;;;16833:62;16912:18;;45754:61:0;16754:182:1;45754:61:0;43769:4;43793:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43793:16:0;:30;45826:58;;;;-1:-1:-1;;;45826:58:0;;10821:2:1;45826:58:0;;;10803:21:1;10860:2;10840:18;;;10833:30;10899;10879:18;;;10872:58;10947:18;;45826:58:0;10793:178:1;45826:58:0;45897:45;45926:1;45930:2;45934:7;45897:20;:45::i;:::-;-1:-1:-1;;;;;45955:13:0;;;;;;:9;:13;;;;;:18;;45972:1;;45955:13;:18;;45972:1;;45955:18;:::i;:::-;;;;-1:-1:-1;;45984:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;45984:21:0;;;;;;;;46023:33;;45984:16;;;46023:33;;45984:16;;46023:33;45682:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:690:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;289:2;283:9;355:2;343:15;;194:66;339:24;;;365:2;335:33;331:42;319:55;;;389:18;;;409:22;;;386:46;383:2;;;435:18;;:::i;:::-;475:10;471:2;464:22;504:6;495:15;;534:6;526;519:22;574:3;565:6;560:3;556:16;553:25;550:2;;;591:1;588;581:12;550:2;641:6;636:3;629:4;621:6;617:17;604:44;696:1;689:4;680:6;672;668:19;664:30;657:41;;;;88:616;;;;;:::o;709:247::-;768:6;821:2;809:9;800:7;796:23;792:32;789:2;;;837:1;834;827:12;789:2;876:9;863:23;895:31;920:5;895:31;:::i;1221:388::-;1289:6;1297;1350:2;1338:9;1329:7;1325:23;1321:32;1318:2;;;1366:1;1363;1356:12;1318:2;1405:9;1392:23;1424:31;1449:5;1424:31;:::i;:::-;1474:5;-1:-1:-1;1531:2:1;1516:18;;1503:32;1544:33;1503:32;1544:33;:::i;:::-;1596:7;1586:17;;;1308:301;;;;;:::o;1614:456::-;1691:6;1699;1707;1760:2;1748:9;1739:7;1735:23;1731:32;1728:2;;;1776:1;1773;1766:12;1728:2;1815:9;1802:23;1834:31;1859:5;1834:31;:::i;:::-;1884:5;-1:-1:-1;1941:2:1;1926:18;;1913:32;1954:33;1913:32;1954:33;:::i;:::-;1718:352;;2006:7;;-1:-1:-1;;;2060:2:1;2045:18;;;;2032:32;;1718:352::o;2075:794::-;2170:6;2178;2186;2194;2247:3;2235:9;2226:7;2222:23;2218:33;2215:2;;;2264:1;2261;2254:12;2215:2;2303:9;2290:23;2322:31;2347:5;2322:31;:::i;:::-;2372:5;-1:-1:-1;2429:2:1;2414:18;;2401:32;2442:33;2401:32;2442:33;:::i;:::-;2494:7;-1:-1:-1;2548:2:1;2533:18;;2520:32;;-1:-1:-1;2603:2:1;2588:18;;2575:32;2630:18;2619:30;;2616:2;;;2662:1;2659;2652:12;2616:2;2685:22;;2738:4;2730:13;;2726:27;-1:-1:-1;2716:2:1;;2767:1;2764;2757:12;2716:2;2790:73;2855:7;2850:2;2837:16;2832:2;2828;2824:11;2790:73;:::i;:::-;2780:83;;;2205:664;;;;;;;:::o;2874:416::-;2939:6;2947;3000:2;2988:9;2979:7;2975:23;2971:32;2968:2;;;3016:1;3013;3006:12;2968:2;3055:9;3042:23;3074:31;3099:5;3074:31;:::i;:::-;3124:5;-1:-1:-1;3181:2:1;3166:18;;3153:32;3223:15;;3216:23;3204:36;;3194:2;;3254:1;3251;3244:12;3295:315;3363:6;3371;3424:2;3412:9;3403:7;3399:23;3395:32;3392:2;;;3440:1;3437;3430:12;3392:2;3479:9;3466:23;3498:31;3523:5;3498:31;:::i;:::-;3548:5;3600:2;3585:18;;;;3572:32;;-1:-1:-1;;;3382:228:1:o;3615:180::-;3674:6;3727:2;3715:9;3706:7;3702:23;3698:32;3695:2;;;3743:1;3740;3733:12;3695:2;-1:-1:-1;3766:23:1;;3685:110;-1:-1:-1;3685:110:1:o;3800:315::-;3868:6;3876;3929:2;3917:9;3908:7;3904:23;3900:32;3897:2;;;3945:1;3942;3935:12;3897:2;3981:9;3968:23;3958:33;;4041:2;4030:9;4026:18;4013:32;4054:31;4079:5;4054:31;:::i;4120:245::-;4178:6;4231:2;4219:9;4210:7;4206:23;4202:32;4199:2;;;4247:1;4244;4237:12;4199:2;4286:9;4273:23;4305:30;4329:5;4305:30;:::i;4370:249::-;4439:6;4492:2;4480:9;4471:7;4467:23;4463:32;4460:2;;;4508:1;4505;4498:12;4460:2;4540:9;4534:16;4559:30;4583:5;4559:30;:::i;4624:450::-;4693:6;4746:2;4734:9;4725:7;4721:23;4717:32;4714:2;;;4762:1;4759;4752:12;4714:2;4802:9;4789:23;4835:18;4827:6;4824:30;4821:2;;;4867:1;4864;4857:12;4821:2;4890:22;;4943:4;4935:13;;4931:27;-1:-1:-1;4921:2:1;;4972:1;4969;4962:12;4921:2;4995:73;5060:7;5055:2;5042:16;5037:2;5033;5029:11;4995:73;:::i;5264:316::-;5305:3;5343:5;5337:12;5370:6;5365:3;5358:19;5386:63;5442:6;5435:4;5430:3;5426:14;5419:4;5412:5;5408:16;5386:63;:::i;:::-;5494:2;5482:15;5499:66;5478:88;5469:98;;;;5569:4;5465:109;;5313:267;-1:-1:-1;;5313:267:1:o;5585:470::-;5764:3;5802:6;5796:13;5818:53;5864:6;5859:3;5852:4;5844:6;5840:17;5818:53;:::i;:::-;5934:13;;5893:16;;;;5956:57;5934:13;5893:16;5990:4;5978:17;;5956:57;:::i;:::-;6029:20;;5772:283;-1:-1:-1;;;;5772:283:1:o;6270:786::-;6681:25;6676:3;6669:38;6651:3;6736:6;6730:13;6752:62;6807:6;6802:2;6797:3;6793:12;6786:4;6778:6;6774:17;6752:62;:::i;:::-;6878:19;6873:2;6833:16;;;6865:11;;;6858:40;6923:13;;6945:63;6923:13;6994:2;6986:11;;6979:4;6967:17;;6945:63;:::i;:::-;7028:17;7047:2;7024:26;;6659:397;-1:-1:-1;;;;6659:397:1:o;7602:511::-;7796:4;-1:-1:-1;;;;;7906:2:1;7898:6;7894:15;7883:9;7876:34;7958:2;7950:6;7946:15;7941:2;7930:9;7926:18;7919:43;;7998:6;7993:2;7982:9;7978:18;7971:34;8041:3;8036:2;8025:9;8021:18;8014:31;8062:45;8102:3;8091:9;8087:19;8079:6;8062:45;:::i;:::-;8054:53;7805:308;-1:-1:-1;;;;;;7805:308:1:o;8794:219::-;8943:2;8932:9;8925:21;8906:4;8963:44;9003:2;8992:9;8988:18;8980:6;8963:44;:::i;20774:128::-;20814:3;20845:1;20841:6;20838:1;20835:13;20832:2;;;20851:18;;:::i;:::-;-1:-1:-1;20887:9:1;;20822:80::o;20907:120::-;20947:1;20973;20963:2;;20978:18;;:::i;:::-;-1:-1:-1;21012:9:1;;20953:74::o;21032:228::-;21072:7;21198:1;21130:66;21126:74;21123:1;21120:81;21115:1;21108:9;21101:17;21097:105;21094:2;;;21205:18;;:::i;:::-;-1:-1:-1;21245:9:1;;21084:176::o;21265:125::-;21305:4;21333:1;21330;21327:8;21324:2;;;21338:18;;:::i;:::-;-1:-1:-1;21375:9:1;;21314:76::o;21395:258::-;21467:1;21477:113;21491:6;21488:1;21485:13;21477:113;;;21567:11;;;21561:18;21548:11;;;21541:39;21513:2;21506:10;21477:113;;;21608:6;21605:1;21602:13;21599:2;;;-1:-1:-1;;21643:1:1;21625:16;;21618:27;21448:205::o;21658:196::-;21697:3;21725:5;21715:2;;21734:18;;:::i;:::-;-1:-1:-1;21781:66:1;21770:78;;21705:149::o;21859:437::-;21938:1;21934:12;;;;21981;;;22002:2;;22056:4;22048:6;22044:17;22034:27;;22002:2;22109;22101:6;22098:14;22078:18;22075:38;22072:2;;;22146:77;22143:1;22136:88;22247:4;22244:1;22237:15;22275:4;22272:1;22265:15;22072:2;;21914:382;;;:::o;22301:195::-;22340:3;22371:66;22364:5;22361:77;22358:2;;;22441:18;;:::i;:::-;-1:-1:-1;22488:1:1;22477:13;;22348:148::o;22501:112::-;22533:1;22559;22549:2;;22564:18;;:::i;:::-;-1:-1:-1;22598:9:1;;22539:74::o;22618:184::-;22670:77;22667:1;22660:88;22767:4;22764:1;22757:15;22791:4;22788:1;22781:15;22807:184;22859:77;22856:1;22849:88;22956:4;22953:1;22946:15;22980:4;22977:1;22970:15;22996:184;23048:77;23045:1;23038:88;23145:4;23142:1;23135:15;23169:4;23166:1;23159:15;23185:184;23237:77;23234:1;23227:88;23334:4;23331:1;23324:15;23358:4;23355:1;23348:15;23374:184;23426:77;23423:1;23416:88;23523:4;23520:1;23513:15;23547:4;23544:1;23537:15;23563:154;-1:-1:-1;;;;;23642:5:1;23638:54;23631:5;23628:65;23618:2;;23707:1;23704;23697:12;23722:177;23807:66;23800:5;23796:78;23789:5;23786:89;23776:2;;23889:1;23886;23879:12

Swarm Source

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