ETH Price: $3,278.44 (-3.87%)
Gas: 14 Gwei

Token

KaijuKongz (Kai)
 

Overview

Max Total Supply

3,163 Kai

Holders

1,489

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
aoijay.eth
Balance
1 Kai
0x605f644264f7c335fa3c5e2166426ac8c9fe43ae
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

During the first 5 days, all Kaiju Kongz listing are subject to the Burn Schedule listed on www.kaijukongz.io. Please make sure you fully understand the risks BEFORE purchasing Kaiju Kongz on OpenSea.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
KaijuKongz

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-18
*/

pragma solidity ^0.8.9;


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

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


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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
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;
}


// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)
/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable is IAccessControl {
    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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


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


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


// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol)
/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
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 virtual 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 virtual {
        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 virtual 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 revoked `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}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    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);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)
/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}


// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)
/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;

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

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {_grantRole} to track enumerable memberships
     */
    function _grantRole(bytes32 role, address account) internal virtual override {
        super._grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {_revokeRole} to track enumerable memberships
     */
    function _revokeRole(bytes32 role, address account) internal virtual override {
        super._revokeRole(role, account);
        _roleMembers[role].remove(account);
    }
}


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
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);

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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);
            }
        }
    }
}


// Creator: Chiru Labs
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than the 2**64 - 1 (max value of uint64) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variables (e.g. number preSale minted). 
        // Please pack into 64 bits.
        uint64 aux;
    }

    uint256 internal currentIndex = 0;

    uint256 internal totalBurned = 0;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Skips the zero index.
     * This method must be called before any mints (e.g. in the consturctor).
     */
    function _initOneIndexed() internal {
        require(!_exists(0), "ERC721A: 0 index already occupied.");
        currentIndex = 1;
        totalBurned = 1;
        _ownerships[0].burned = true;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = currentIndex;
        uint256 tokenIdsIdx = 0;
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (!ownership.burned) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        require(false, 'ERC721A: global index out of bounds');
        return 0;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = currentIndex;
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (ownership.burned) {
                currOwnershipAddr = address(0);
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number burned query for the zero address');
        return uint256(_addressData[owner].numberBurned);
    }

    function _getAux(address owner) internal view returns (uint64) {
        require(owner != address(0), 'ERC721A: aux query for the zero address');
        return _addressData[owner].aux;
    }

    function _setAux(address owner, uint64 aux) internal {
        require(owner != address(0), 'ERC721A: aux query for the zero address');
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        for (uint256 curr = tokenId; ; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0) && !ownership.burned) {
                return ownership;
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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 override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: 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 {
        _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 {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), 'ERC721A: token already minted');
        require(quantity > 0, 'ERC721A: quantity must be greater than 0');

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        _addressData[to].balance += uint64(quantity);
        _addressData[to].numberMinted += uint64(quantity);

        _ownerships[startTokenId].addr = to;
        _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            if (safe) {
                require(
                    _checkOnERC721Received(address(0), to, updatedIndex, _data),
                    'ERC721A: transfer to non ERC721Receiver implementer'
                );
            }
            updatedIndex++;
        }

        currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

        _ownerships[tokenId].addr = to;
        _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId].addr = prevOwnership.addr;
                _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;
        }

        // Keep track of who burnt the token, and when is it burned.
        _ownerships[tokenId].addr = prevOwnership.addr;
        _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
        _ownerships[tokenId].burned = true; 

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId].addr = prevOwnership.addr;
                _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        totalBurned++;
    }

    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: caller is not owner nor approved');

        _burn(tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


contract KaijuKongz is ERC721A, Ownable, AccessControlEnumerable {
    uint256 constant public legendarySupply = 9;
    uint256 constant public teamSupply = 30;

    uint256 public maxTotalSupply = 3333;
    uint256 public pricePerToken = 0.065 ether;
    uint256 public tokensBurned = 0;
    bool public promoTokensMinted = false;
    bool public tradeActive = false;
    
    enum SaleState{ CLOSED, PRIVATE, PUBLIC }
    SaleState public saleState = SaleState.CLOSED;

    bytes32 private merkleRootGroup1;
    bytes32 private merkleRootGroup2;

    uint8 private maxTokenWlGroup1 = 1;
    uint8 private maxTokenWlGroup2 = 2;
    uint8 private maxTokenPublic = 5;

    uint256 private disableBurnTime = 518400;

    mapping(address => uint256) presaleMinted;
    mapping(address => uint256) publicMinted;

    string _baseTokenURI;
    address _burnerAddress;
    uint256 deployedTime;

    constructor() ERC721A("KaijuKongz", "Kai") {
      _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
      deployedTime = block.timestamp;
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) public override {
      require(tradeActive, "Trade is not active");
      super.safeTransferFrom(_from, _to, _tokenId, data);
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId) public override {
      require(tradeActive, "Trade is not active");
      super.safeTransferFrom(_from, _to, _tokenId);
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) public override {
      require(tradeActive, "Trade is not active");
      super.transferFrom(_from, _to, _tokenId);
    }

    function setTradeState(bool tradeState) public {
      require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot set trade state");
      tradeActive = tradeState;
    }

    function setPrice(uint256 newPrice) public {
      require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot set price");
      pricePerToken = newPrice;
    }

    function withdraw() public onlyOwner {
      require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot withdraw");
        payable(owner()).transfer(address(this).balance);
    }

    function setSaleState(SaleState newState) public {
      require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot alter sale state");
      saleState = newState;
    }

    function setMerkleRoot(bytes32 newRootGroup1, bytes32 newRootGroup2) public {
      require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot set merkle root");
      merkleRootGroup1 = newRootGroup1;
      merkleRootGroup2 = newRootGroup2;
    }

    function promoMint() public onlyOwner {
      require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Cannot mint team tokens");
      require(!promoTokensMinted, "Promo tokens have already been minted");
      _safeMint(owner(), legendarySupply + teamSupply);
      promoTokensMinted = true;
    }

    function presale(uint256 amount, bytes32[] calldata proof) public payable {
      require (saleState == SaleState.PRIVATE, "Sale state should be private");
      require(totalSupply() < maxTotalSupply, "Max supply reached");
      require(promoTokensMinted, "Promo tokens should be minted in advance");
      bool isValidGroup1 = MerkleProof.verify(proof, merkleRootGroup1, keccak256(abi.encodePacked(msg.sender)));
      bool isValidGroup2 = MerkleProof.verify(proof, merkleRootGroup2, keccak256(abi.encodePacked(msg.sender)));
      require(isValidGroup1 || isValidGroup2, "You are not in the valid whitelist");

      uint256 amountAllowed = isValidGroup1 ? maxTokenWlGroup1 : maxTokenWlGroup2;
      require(amount + presaleMinted[msg.sender] <= amountAllowed, "Your token amount reached out max");
      require(presaleMinted[msg.sender] < amountAllowed, "You've already minted all");
      uint256 amountToPay = amount * pricePerToken;
      require(amountToPay <= msg.value, "Provided not enough Ether for purchase");
      presaleMinted[msg.sender] += amount;
      _safeMint(_msgSender(), amount);
    }

    function publicsale(uint256 amount) public payable {
      require (saleState == SaleState.PUBLIC, "Sale state should be public");
      require(promoTokensMinted, "Promo tokens should be minted in advance");
      require(totalSupply() < maxTotalSupply, "Max supply reached");
      require(amount + publicMinted[msg.sender] <= maxTokenPublic, "Your token amount reached out max");
      uint256 amountToPay = amount * pricePerToken;
      require(amountToPay <= msg.value, "Provided not enough Ether for purchase");
      publicMinted[msg.sender] += amount;
      _safeMint(_msgSender(), amount);
    }

    function burnMany(uint256[] calldata tokenIds) public {
      require(_msgSender() == _burnerAddress, "Only burner can burn tokens");
      uint256 nowTime = block.timestamp;
      require(nowTime - deployedTime <= disableBurnTime, "Burn is available only for 6 days");
      for (uint256 i; i < tokenIds.length; i++) {
        _burn(tokenIds[i]);
      }
      maxTotalSupply -= tokenIds.length;
      tokensBurned += tokenIds.length;
    }

    function setBurnerAddress(address burnerAddress) public {
      require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Caller cannot set burn address");
      _burnerAddress = burnerAddress;
    }

    function _baseURI() internal view virtual override returns (string memory) {
      return _baseTokenURI;
    }

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

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, AccessControlEnumerable) returns (bool) {
      return super.supportsInterface(interfaceId);
    }
}

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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":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":[{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burnMany","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":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"legendarySupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pricePerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"promoMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"promoTokensMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicsale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"saleState","outputs":[{"internalType":"enum KaijuKongz.SaleState","name":"","type":"uint8"}],"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":"address","name":"burnerAddress","type":"address"}],"name":"setBurnerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newRootGroup1","type":"bytes32"},{"internalType":"bytes32","name":"newRootGroup2","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum KaijuKongz.SaleState","name":"newState","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"tradeState","type":"bool"}],"name":"setTradeState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260008080556001819055610d05600b5566e6ed27d6668000600c55600d55600e805462ffffff1990811690915560118054909116620502011790556207e9006012553480156200005357600080fd5b50604080518082018252600a81526925b0b4b53aa5b7b733bd60b11b6020808301918252835180850190945260038452624b616960e81b908401528151919291620000a191600291620002aa565b508051620000b7906003906020840190620002aa565b505050620000d4620000ce620000eb60201b60201c565b620000ef565b620000e160003362000141565b426017556200038d565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200014d828262000151565b5050565b6200016882826200019460201b62001d1b1760201c565b6000828152600a602090815260409091206200018f91839062001da162000238821b17901c565b505050565b60008281526009602090815260408083206001600160a01b038516845290915290205460ff166200014d5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620001f43390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006200024f836001600160a01b03841662000258565b90505b92915050565b6000818152600183016020526040812054620002a15750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000252565b50600062000252565b828054620002b89062000350565b90600052602060002090601f016020900481019282620002dc576000855562000327565b82601f10620002f757805160ff191683800117855562000327565b8280016001018555821562000327579182015b82811115620003275782518255916020019190600101906200030a565b506200033592915062000339565b5090565b5b808211156200033557600081556001016200033a565b600181811c908216806200036557607f821691505b602082108114156200038757634e487b7160e01b600052602260045260246000fd5b50919050565b613864806200039d6000396000f3fe6080604052600436106102885760003560e01c80636fbf3e8e1161015a578063a22cb465116100c1578063cf3234601161007a578063cf32346014610787578063d547741f146107a7578063e7873b58146107c7578063e985e9c5146107dd578063f2fde38b14610826578063f6252c5a1461084657600080fd5b8063a22cb465146106df578063b88d4fde146106ff578063c13bd95c1461071f578063c87b56dd14610732578063ca15c87314610752578063cb82b4be1461077257600080fd5b80639010d07c116101135780639010d07c1461063557806391b7f5ed1461065557806391d148541461067557806395d89b41146106955780639df806d6146106aa578063a217fddf146106ca57600080fd5b80636fbf3e8e1461059757806370a08231146105ac578063715018a6146105cc57806375edcbe0146105e15780637b1b1de6146106015780638da5cb5b1461061757600080fd5b806336568abe116101fe57806355f804b3116101b757806355f804b3146104d15780635882128d146104f15780635a67de07146105105780635d8cc32c14610530578063603f4d521461054a5780636352211e1461057757600080fd5b806336568abe1461041c5780633ccfd60b1461043c5780633f780f001461045157806342842e0e1461047157806342966c68146104915780634f6ccce7146104b157600080fd5b806323b872dd1161025057806323b872dd14610361578063248a9ca3146103815780632ab4d052146103b15780632cfac6ec146103c75780632f2ff15d146103dc5780632f745c59146103fc57600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c57806318160ddd1461033e575b600080fd5b34801561029957600080fd5b506102ad6102a8366004612fae565b610859565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d761086a565b6040516102b99190613023565b3480156102f057600080fd5b506103046102ff366004613036565b6108fc565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c61033736600461306b565b61098a565b005b34801561034a57600080fd5b50610353610aa2565b6040519081526020016102b9565b34801561036d57600080fd5b5061033c61037c366004613095565b610ab9565b34801561038d57600080fd5b5061035361039c366004613036565b60009081526009602052604090206001015490565b3480156103bd57600080fd5b50610353600b5481565b3480156103d357600080fd5b50610353601e81565b3480156103e857600080fd5b5061033c6103f73660046130d1565b610aeb565b34801561040857600080fd5b5061035361041736600461306b565b610b11565b34801561042857600080fd5b5061033c6104373660046130d1565b610ca0565b34801561044857600080fd5b5061033c610d1e565b34801561045d57600080fd5b5061033c61046c36600461310d565b610dcd565b34801561047d57600080fd5b5061033c61048c366004613095565b610e37565b34801561049d57600080fd5b5061033c6104ac366004613036565b610e69565b3480156104bd57600080fd5b506103536104cc366004613036565b610f27565b3480156104dd57600080fd5b5061033c6104ec36600461313e565b611014565b3480156104fd57600080fd5b50600e546102ad90610100900460ff1681565b34801561051c57600080fd5b5061033c61052b3660046131ee565b611051565b34801561053c57600080fd5b50600e546102ad9060ff1681565b34801561055657600080fd5b50600e5461056a9062010000900460ff1681565b6040516102b99190613225565b34801561058357600080fd5b50610304610592366004613036565b6110d3565b3480156105a357600080fd5b50610353600981565b3480156105b857600080fd5b506103536105c736600461324d565b6110e5565b3480156105d857600080fd5b5061033c611176565b3480156105ed57600080fd5b5061033c6105fc366004613268565b6111ac565b34801561060d57600080fd5b50610353600c5481565b34801561062357600080fd5b506008546001600160a01b0316610304565b34801561064157600080fd5b50610304610650366004613268565b611207565b34801561066157600080fd5b5061033c610670366004613036565b611226565b34801561068157600080fd5b506102ad6106903660046130d1565b611275565b3480156106a157600080fd5b506102d76112a0565b3480156106b657600080fd5b5061033c6106c536600461324d565b6112af565b3480156106d657600080fd5b50610353600081565b3480156106eb57600080fd5b5061033c6106fa36600461328a565b611328565b34801561070b57600080fd5b5061033c61071a3660046132b4565b6113ed565b61033c61072d366004613399565b61145d565b34801561073e57600080fd5b506102d761074d366004613036565b61179d565b34801561075e57600080fd5b5061035361076d366004613036565b611867565b34801561077e57600080fd5b5061033c61187e565b34801561079357600080fd5b5061033c6107a23660046133e4565b611995565b3480156107b357600080fd5b5061033c6107c23660046130d1565b611adb565b3480156107d357600080fd5b50610353600d5481565b3480156107e957600080fd5b506102ad6107f8366004613425565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561083257600080fd5b5061033c61084136600461324d565b611b01565b61033c610854366004613036565b611b99565b600061086482611db6565b92915050565b6060600280546108799061344f565b80601f01602080910402602001604051908101604052809291908181526020018280546108a59061344f565b80156108f25780601f106108c7576101008083540402835291602001916108f2565b820191906000526020600020905b8154815290600101906020018083116108d557829003601f168201915b5050505050905090565b600061090782611ddb565b61096e5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610995826110d3565b9050806001600160a01b0316836001600160a01b03161415610a045760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610965565b336001600160a01b0382161480610a205750610a2081336107f8565b610a925760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610965565b610a9d838383611e06565b505050565b6000600154600054610ab491906134a0565b905090565b600e54610100900460ff16610ae05760405162461bcd60e51b8152600401610965906134b7565b610a9d838383611e62565b600082815260096020526040902060010154610b078133611e6d565b610a9d8383611ed1565b6000610b1c836110e5565b8210610b755760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610965565b600080549080805b83811015610c4057600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215610be257805192505b806040015115610bf157600092505b876001600160a01b0316836001600160a01b03161415610c2d5786841415610c1f5750935061086492505050565b83610c29816134e4565b9450505b5080610c38816134e4565b915050610b7d565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610965565b6001600160a01b0381163314610d105760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610965565b610d1a8282611ef3565b5050565b6008546001600160a01b03163314610d485760405162461bcd60e51b8152600401610965906134ff565b610d53600033611275565b610d915760405162461bcd60e51b815260206004820152600f60248201526e43616e6e6f7420776974686472617760881b6044820152606401610965565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610dca573d6000803e3d6000fd5b50565b610dd8600033611275565b610e1d5760405162461bcd60e51b815260206004820152601660248201527543616e6e6f742073657420747261646520737461746560501b6044820152606401610965565b600e80549115156101000261ff0019909216919091179055565b600e54610100900460ff16610e5e5760405162461bcd60e51b8152600401610965906134b7565b610a9d838383611f15565b6000610e7482611f30565b80519091506000906001600160a01b0316336001600160a01b03161480610eab575033610ea0846108fc565b6001600160a01b0316145b80610ebd57508151610ebd90336107f8565b905080610f1e5760405162461bcd60e51b815260206004820152602960248201527f455243373231413a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610965565b610a9d83612039565b6000805481805b82811015610fbf57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290610fac5785831415610f9e5750949350505050565b82610fa8816134e4565b9350505b5080610fb7816134e4565b915050610f2e565b5060405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610965565b6008546001600160a01b0316331461103e5760405162461bcd60e51b8152600401610965906134ff565b8051610d1a906015906020840190612eff565b61105c600033611275565b6110a85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420616c7465722073616c652073746174650000000000000000006044820152606401610965565b600e805482919062ff00001916620100008360028111156110cb576110cb61320f565b021790555050565b60006110de82611f30565b5192915050565b60006001600160a01b0382166111515760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610965565b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146111a05760405162461bcd60e51b8152600401610965906134ff565b6111aa60006121e3565b565b6111b7600033611275565b6111fc5760405162461bcd60e51b815260206004820152601660248201527510d85b9b9bdd081cd95d081b595c9adb19481c9bdbdd60521b6044820152606401610965565b600f91909155601055565b6000828152600a6020526040812061121f9083612235565b9392505050565b611231600033611275565b6112705760405162461bcd60e51b815260206004820152601060248201526f43616e6e6f742073657420707269636560801b6044820152606401610965565b600c55565b60009182526009602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600380546108799061344f565b6112ba600033611275565b6113065760405162461bcd60e51b815260206004820152601e60248201527f43616c6c65722063616e6e6f7420736574206275726e206164647265737300006044820152606401610965565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382163314156113815760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610965565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e54610100900460ff166114145760405162461bcd60e51b8152600401610965906134b7565b61145685858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061224192505050565b5050505050565b6001600e5462010000900460ff16600281111561147c5761147c61320f565b146114c95760405162461bcd60e51b815260206004820152601c60248201527f53616c652073746174652073686f756c642062652070726976617465000000006044820152606401610965565b600b546114d4610aa2565b106115165760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610965565b600e5460ff166115385760405162461bcd60e51b815260040161096590613534565b60006115b083838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f546040516bffffffffffffffffffffffff193360601b16602082015290925060340190505b6040516020818303038152906040528051906020012061227a565b90506000611613848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506010546040516bffffffffffffffffffffffff193360601b1660208201529092506034019050611595565b9050818061161e5750805b6116755760405162461bcd60e51b815260206004820152602260248201527f596f7520617265206e6f7420696e207468652076616c69642077686974656c696044820152611cdd60f21b6064820152608401610965565b60008261168c57601154610100900460ff16611693565b60115460ff165b3360009081526013602052604090205460ff91909116915081906116b7908861357c565b11156116d55760405162461bcd60e51b815260040161096590613594565b3360009081526013602052604090205481116117335760405162461bcd60e51b815260206004820152601960248201527f596f7527766520616c7265616479206d696e74656420616c6c000000000000006044820152606401610965565b6000600c548761174391906135d5565b9050348111156117655760405162461bcd60e51b8152600401610965906135f4565b336000908152601360205260408120805489929061178490849061357c565b9091555061179490503388612290565b50505050505050565b60606117a882611ddb565b61180c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610965565b60006118166122aa565b90506000815111611836576040518060200160405280600081525061121f565b80611840846122b9565b60405160200161185192919061363a565b6040516020818303038152906040529392505050565b6000818152600a60205260408120610864906123be565b6008546001600160a01b031633146118a85760405162461bcd60e51b8152600401610965906134ff565b6118b3600033611275565b6118ff5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e74207465616d20746f6b656e730000000000000000006044820152606401610965565b600e5460ff16156119605760405162461bcd60e51b815260206004820152602560248201527f50726f6d6f20746f6b656e73206861766520616c7265616479206265656e206d6044820152641a5b9d195960da1b6064820152608401610965565b6119866119756008546001600160a01b031690565b611981601e600961357c565b612290565b600e805460ff19166001179055565b6016546001600160a01b0316336001600160a01b0316146119f85760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79206275726e65722063616e206275726e20746f6b656e7300000000006044820152606401610965565b601254601754429190611a0b90836134a0565b1115611a635760405162461bcd60e51b815260206004820152602160248201527f4275726e20697320617661696c61626c65206f6e6c7920666f722036206461796044820152607360f81b6064820152608401610965565b60005b82811015611aa157611a8f848483818110611a8357611a83613669565b90506020020135612039565b80611a99816134e4565b915050611a66565b5082829050600b6000828254611ab791906134a0565b9091555050600d8054839190600090611ad190849061357c565b9091555050505050565b600082815260096020526040902060010154611af78133611e6d565b610a9d8383611ef3565b6008546001600160a01b03163314611b2b5760405162461bcd60e51b8152600401610965906134ff565b6001600160a01b038116611b905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610965565b610dca816121e3565b6002600e5462010000900460ff166002811115611bb857611bb861320f565b14611c055760405162461bcd60e51b815260206004820152601b60248201527f53616c652073746174652073686f756c64206265207075626c696300000000006044820152606401610965565b600e5460ff16611c275760405162461bcd60e51b815260040161096590613534565b600b54611c32610aa2565b10611c745760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610965565b601154336000908152601460205260409020546201000090910460ff1690611c9c908361357c565b1115611cba5760405162461bcd60e51b815260040161096590613594565b6000600c5482611cca91906135d5565b905034811115611cec5760405162461bcd60e51b8152600401610965906135f4565b3360009081526014602052604081208054849290611d0b90849061357c565b90915550610d1a90503383612290565b611d258282611275565b610d1a5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611d5d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600061121f836001600160a01b0384166123c8565b60006001600160e01b03198216635a05180f60e01b1480610864575061086482612417565b6000805482108015610864575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610a9d83838361243c565b611e778282611275565b610d1a57611e8f816001600160a01b03166014612734565b611e9a836020612734565b604051602001611eab92919061367f565b60408051601f198184030181529082905262461bcd60e51b825261096591600401613023565b611edb8282611d1b565b6000828152600a60205260409020610a9d9082611da1565b611efd82826128cf565b6000828152600a60205260409020610a9d9082612936565b610a9d838383604051806020016040528060008152506113ed565b6040805160608101825260008082526020820181905291810191909152611f5682611ddb565b611fb55760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610965565b815b600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521580159061201a57508060400151155b15612026579392505050565b5080612031816136f4565b915050611fb7565b600061204482611f30565b90506120566000838360000151611e06565b80516001600160a01b039081166000908152600560209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260049094529184208054600160e01b949096166001600160e01b031990961695909517600160a01b42909216919091021760ff60e01b1916919091179092559061211a90849061357c565b6000818152600460205260409020549091506001600160a01b031661218e5761214281611ddb565b1561218e57815160008281526004602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b815160405184916000916001600160a01b03909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4600180549060006121d9836134e4565b9190505550505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061121f838361294b565b61224c84848461243c565b61225884848484612975565b6122745760405162461bcd60e51b81526004016109659061370b565b50505050565b6000826122878584612a82565b14949350505050565b610d1a828260405180602001604052806000815250612af6565b6060601580546108799061344f565b6060816122dd5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561230757806122f1816134e4565b91506123009050600a83613774565b91506122e1565b6000816001600160401b0381111561232157612321613128565b6040519080825280601f01601f19166020018201604052801561234b576020820181803683370190505b5090505b84156123b6576123606001836134a0565b915061236d600a86613788565b61237890603061357c565b60f81b81838151811061238d5761238d613669565b60200101906001600160f81b031916908160001a9053506123af600a86613774565b945061234f565b949350505050565b6000610864825490565b600081815260018301602052604081205461240f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610864565b506000610864565b60006001600160e01b03198216637965db0b60e01b1480610864575061086482612b03565b600061244782611f30565b80519091506000906001600160a01b0316336001600160a01b0316148061247e575033612473846108fc565b6001600160a01b0316145b806124905750815161249090336107f8565b9050806124fa5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610965565b846001600160a01b031682600001516001600160a01b03161461256e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610965565b6001600160a01b0384166125d25760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610965565b6125e26000848460000151611e06565b6001600160a01b03808616600090815260056020908152604080832080546000196001600160401b0380831691909101811667ffffffffffffffff1992831617909255948916808552828520805480841660019081018516919098161790558885526004909352908320805442909216600160a01b026001600160e01b03199092169092171790559061267690859061357c565b6000818152600460205260409020549091506001600160a01b03166126ea5761269e81611ddb565b156126ea57825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b606060006127438360026135d5565b61274e90600261357c565b6001600160401b0381111561276557612765613128565b6040519080825280601f01601f19166020018201604052801561278f576020820181803683370190505b509050600360fc1b816000815181106127aa576127aa613669565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106127d9576127d9613669565b60200101906001600160f81b031916908160001a90535060006127fd8460026135d5565b61280890600161357c565b90505b6001811115612880576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061283c5761283c613669565b1a60f81b82828151811061285257612852613669565b60200101906001600160f81b031916908160001a90535060049490941c93612879816136f4565b905061280b565b50831561121f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610965565b6128d98282611275565b15610d1a5760008281526009602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600061121f836001600160a01b038416612b6e565b600082600001828154811061296257612962613669565b9060005260206000200154905092915050565b60006001600160a01b0384163b15612a7757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129b990339089908890889060040161379c565b602060405180830381600087803b1580156129d357600080fd5b505af1925050508015612a03575060408051601f3d908101601f19168201909252612a00918101906137d9565b60015b612a5d573d808015612a31576040519150601f19603f3d011682016040523d82523d6000602084013e612a36565b606091505b508051612a555760405162461bcd60e51b81526004016109659061370b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506123b6565b506001949350505050565b600081815b8451811015612aee576000858281518110612aa457612aa4613669565b60200260200101519050808311612aca5760008381526020829052604090209250612adb565b600081815260208490526040902092505b5080612ae6816134e4565b915050612a87565b509392505050565b610a9d8383836001612c61565b60006001600160e01b031982166380ac58cd60e01b1480612b3457506001600160e01b03198216635b5e139f60e01b145b80612b4f57506001600160e01b0319821663780e9d6360e01b145b8061086457506301ffc9a760e01b6001600160e01b0319831614610864565b60008181526001830160205260408120548015612c57576000612b926001836134a0565b8554909150600090612ba6906001906134a0565b9050818114612c0b576000866000018281548110612bc657612bc6613669565b9060005260206000200154905080876000018481548110612be957612be9613669565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612c1c57612c1c6137f6565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610864565b6000915050610864565b6000546001600160a01b038516612cc45760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610965565b612ccd81611ddb565b15612d1a5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610965565b60008411612d7b5760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610965565b6001600160a01b03851660009081526005602052604081208054869290612dac9084906001600160401b031661380c565b82546101009290920a6001600160401b038181021990931691831602179091556001600160a01b038716600090815260056020526040902080548793509091600891612e069185916801000000000000000090041661380c565b82546001600160401b039182166101009390930a9283029282021916919091179091556000838152600460205260408120805442909316600160a01b026001600160e01b03199093166001600160a01b038a1617929092179091558291505b85811015612ef45760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612ed457612eb86000888488612975565b612ed45760405162461bcd60e51b81526004016109659061370b565b81612ede816134e4565b9250508080612eec906134e4565b915050612e65565b50600081905561272c565b828054612f0b9061344f565b90600052602060002090601f016020900481019282612f2d5760008555612f73565b82601f10612f4657805160ff1916838001178555612f73565b82800160010185558215612f73579182015b82811115612f73578251825591602001919060010190612f58565b50612f7f929150612f83565b5090565b5b80821115612f7f5760008155600101612f84565b6001600160e01b031981168114610dca57600080fd5b600060208284031215612fc057600080fd5b813561121f81612f98565b60005b83811015612fe6578181015183820152602001612fce565b838111156122745750506000910152565b6000815180845261300f816020860160208601612fcb565b601f01601f19169290920160200192915050565b60208152600061121f6020830184612ff7565b60006020828403121561304857600080fd5b5035919050565b80356001600160a01b038116811461306657600080fd5b919050565b6000806040838503121561307e57600080fd5b6130878361304f565b946020939093013593505050565b6000806000606084860312156130aa57600080fd5b6130b38461304f565b92506130c16020850161304f565b9150604084013590509250925092565b600080604083850312156130e457600080fd5b823591506130f46020840161304f565b90509250929050565b8035801515811461306657600080fd5b60006020828403121561311f57600080fd5b61121f826130fd565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561315057600080fd5b81356001600160401b038082111561316757600080fd5b818401915084601f83011261317b57600080fd5b81358181111561318d5761318d613128565b604051601f8201601f19908116603f011681019083821181831017156131b5576131b5613128565b816040528281528760208487010111156131ce57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60006020828403121561320057600080fd5b81356003811061121f57600080fd5b634e487b7160e01b600052602160045260246000fd5b602081016003831061324757634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561325f57600080fd5b61121f8261304f565b6000806040838503121561327b57600080fd5b50508035926020909101359150565b6000806040838503121561329d57600080fd5b6132a68361304f565b91506130f4602084016130fd565b6000806000806000608086880312156132cc57600080fd5b6132d58661304f565b94506132e36020870161304f565b93506040860135925060608601356001600160401b038082111561330657600080fd5b818801915088601f83011261331a57600080fd5b81358181111561332957600080fd5b89602082850101111561333b57600080fd5b9699959850939650602001949392505050565b60008083601f84011261336057600080fd5b5081356001600160401b0381111561337757600080fd5b6020830191508360208260051b850101111561339257600080fd5b9250929050565b6000806000604084860312156133ae57600080fd5b8335925060208401356001600160401b038111156133cb57600080fd5b6133d78682870161334e565b9497909650939450505050565b600080602083850312156133f757600080fd5b82356001600160401b0381111561340d57600080fd5b6134198582860161334e565b90969095509350505050565b6000806040838503121561343857600080fd5b6134418361304f565b91506130f46020840161304f565b600181811c9082168061346357607f821691505b6020821081141561348457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156134b2576134b261348a565b500390565b6020808252601390820152725472616465206973206e6f742061637469766560681b604082015260600190565b60006000198214156134f8576134f861348a565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f50726f6d6f20746f6b656e732073686f756c64206265206d696e74656420696e60408201526720616476616e636560c01b606082015260800190565b6000821982111561358f5761358f61348a565b500190565b60208082526021908201527f596f757220746f6b656e20616d6f756e742072656163686564206f7574206d616040820152600f60fb1b606082015260800190565b60008160001904831182151516156135ef576135ef61348a565b500290565b60208082526026908201527f50726f7669646564206e6f7420656e6f75676820457468657220666f7220707560408201526572636861736560d01b606082015260800190565b6000835161364c818460208801612fcb565b835190830190613660818360208801612fcb565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516136b7816017850160208801612fcb565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516136e8816028840160208801612fcb565b01602801949350505050565b6000816137035761370361348a565b506000190190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826137835761378361375e565b500490565b6000826137975761379761375e565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137cf90830184612ff7565b9695505050505050565b6000602082840312156137eb57600080fd5b815161121f81612f98565b634e487b7160e01b600052603160045260246000fd5b60006001600160401b038083168185168083038211156136605761366061348a56fea2646970667358221220fa5aee91f5733441a3fd59e62fd3ecfc7d19ee5a896a39400d6a83499cb199d564736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102885760003560e01c80636fbf3e8e1161015a578063a22cb465116100c1578063cf3234601161007a578063cf32346014610787578063d547741f146107a7578063e7873b58146107c7578063e985e9c5146107dd578063f2fde38b14610826578063f6252c5a1461084657600080fd5b8063a22cb465146106df578063b88d4fde146106ff578063c13bd95c1461071f578063c87b56dd14610732578063ca15c87314610752578063cb82b4be1461077257600080fd5b80639010d07c116101135780639010d07c1461063557806391b7f5ed1461065557806391d148541461067557806395d89b41146106955780639df806d6146106aa578063a217fddf146106ca57600080fd5b80636fbf3e8e1461059757806370a08231146105ac578063715018a6146105cc57806375edcbe0146105e15780637b1b1de6146106015780638da5cb5b1461061757600080fd5b806336568abe116101fe57806355f804b3116101b757806355f804b3146104d15780635882128d146104f15780635a67de07146105105780635d8cc32c14610530578063603f4d521461054a5780636352211e1461057757600080fd5b806336568abe1461041c5780633ccfd60b1461043c5780633f780f001461045157806342842e0e1461047157806342966c68146104915780634f6ccce7146104b157600080fd5b806323b872dd1161025057806323b872dd14610361578063248a9ca3146103815780632ab4d052146103b15780632cfac6ec146103c75780632f2ff15d146103dc5780632f745c59146103fc57600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c57806318160ddd1461033e575b600080fd5b34801561029957600080fd5b506102ad6102a8366004612fae565b610859565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d761086a565b6040516102b99190613023565b3480156102f057600080fd5b506103046102ff366004613036565b6108fc565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c61033736600461306b565b61098a565b005b34801561034a57600080fd5b50610353610aa2565b6040519081526020016102b9565b34801561036d57600080fd5b5061033c61037c366004613095565b610ab9565b34801561038d57600080fd5b5061035361039c366004613036565b60009081526009602052604090206001015490565b3480156103bd57600080fd5b50610353600b5481565b3480156103d357600080fd5b50610353601e81565b3480156103e857600080fd5b5061033c6103f73660046130d1565b610aeb565b34801561040857600080fd5b5061035361041736600461306b565b610b11565b34801561042857600080fd5b5061033c6104373660046130d1565b610ca0565b34801561044857600080fd5b5061033c610d1e565b34801561045d57600080fd5b5061033c61046c36600461310d565b610dcd565b34801561047d57600080fd5b5061033c61048c366004613095565b610e37565b34801561049d57600080fd5b5061033c6104ac366004613036565b610e69565b3480156104bd57600080fd5b506103536104cc366004613036565b610f27565b3480156104dd57600080fd5b5061033c6104ec36600461313e565b611014565b3480156104fd57600080fd5b50600e546102ad90610100900460ff1681565b34801561051c57600080fd5b5061033c61052b3660046131ee565b611051565b34801561053c57600080fd5b50600e546102ad9060ff1681565b34801561055657600080fd5b50600e5461056a9062010000900460ff1681565b6040516102b99190613225565b34801561058357600080fd5b50610304610592366004613036565b6110d3565b3480156105a357600080fd5b50610353600981565b3480156105b857600080fd5b506103536105c736600461324d565b6110e5565b3480156105d857600080fd5b5061033c611176565b3480156105ed57600080fd5b5061033c6105fc366004613268565b6111ac565b34801561060d57600080fd5b50610353600c5481565b34801561062357600080fd5b506008546001600160a01b0316610304565b34801561064157600080fd5b50610304610650366004613268565b611207565b34801561066157600080fd5b5061033c610670366004613036565b611226565b34801561068157600080fd5b506102ad6106903660046130d1565b611275565b3480156106a157600080fd5b506102d76112a0565b3480156106b657600080fd5b5061033c6106c536600461324d565b6112af565b3480156106d657600080fd5b50610353600081565b3480156106eb57600080fd5b5061033c6106fa36600461328a565b611328565b34801561070b57600080fd5b5061033c61071a3660046132b4565b6113ed565b61033c61072d366004613399565b61145d565b34801561073e57600080fd5b506102d761074d366004613036565b61179d565b34801561075e57600080fd5b5061035361076d366004613036565b611867565b34801561077e57600080fd5b5061033c61187e565b34801561079357600080fd5b5061033c6107a23660046133e4565b611995565b3480156107b357600080fd5b5061033c6107c23660046130d1565b611adb565b3480156107d357600080fd5b50610353600d5481565b3480156107e957600080fd5b506102ad6107f8366004613425565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561083257600080fd5b5061033c61084136600461324d565b611b01565b61033c610854366004613036565b611b99565b600061086482611db6565b92915050565b6060600280546108799061344f565b80601f01602080910402602001604051908101604052809291908181526020018280546108a59061344f565b80156108f25780601f106108c7576101008083540402835291602001916108f2565b820191906000526020600020905b8154815290600101906020018083116108d557829003601f168201915b5050505050905090565b600061090782611ddb565b61096e5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610995826110d3565b9050806001600160a01b0316836001600160a01b03161415610a045760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610965565b336001600160a01b0382161480610a205750610a2081336107f8565b610a925760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610965565b610a9d838383611e06565b505050565b6000600154600054610ab491906134a0565b905090565b600e54610100900460ff16610ae05760405162461bcd60e51b8152600401610965906134b7565b610a9d838383611e62565b600082815260096020526040902060010154610b078133611e6d565b610a9d8383611ed1565b6000610b1c836110e5565b8210610b755760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610965565b600080549080805b83811015610c4057600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215610be257805192505b806040015115610bf157600092505b876001600160a01b0316836001600160a01b03161415610c2d5786841415610c1f5750935061086492505050565b83610c29816134e4565b9450505b5080610c38816134e4565b915050610b7d565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610965565b6001600160a01b0381163314610d105760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610965565b610d1a8282611ef3565b5050565b6008546001600160a01b03163314610d485760405162461bcd60e51b8152600401610965906134ff565b610d53600033611275565b610d915760405162461bcd60e51b815260206004820152600f60248201526e43616e6e6f7420776974686472617760881b6044820152606401610965565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610dca573d6000803e3d6000fd5b50565b610dd8600033611275565b610e1d5760405162461bcd60e51b815260206004820152601660248201527543616e6e6f742073657420747261646520737461746560501b6044820152606401610965565b600e80549115156101000261ff0019909216919091179055565b600e54610100900460ff16610e5e5760405162461bcd60e51b8152600401610965906134b7565b610a9d838383611f15565b6000610e7482611f30565b80519091506000906001600160a01b0316336001600160a01b03161480610eab575033610ea0846108fc565b6001600160a01b0316145b80610ebd57508151610ebd90336107f8565b905080610f1e5760405162461bcd60e51b815260206004820152602960248201527f455243373231413a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610965565b610a9d83612039565b6000805481805b82811015610fbf57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290610fac5785831415610f9e5750949350505050565b82610fa8816134e4565b9350505b5080610fb7816134e4565b915050610f2e565b5060405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610965565b6008546001600160a01b0316331461103e5760405162461bcd60e51b8152600401610965906134ff565b8051610d1a906015906020840190612eff565b61105c600033611275565b6110a85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420616c7465722073616c652073746174650000000000000000006044820152606401610965565b600e805482919062ff00001916620100008360028111156110cb576110cb61320f565b021790555050565b60006110de82611f30565b5192915050565b60006001600160a01b0382166111515760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610965565b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146111a05760405162461bcd60e51b8152600401610965906134ff565b6111aa60006121e3565b565b6111b7600033611275565b6111fc5760405162461bcd60e51b815260206004820152601660248201527510d85b9b9bdd081cd95d081b595c9adb19481c9bdbdd60521b6044820152606401610965565b600f91909155601055565b6000828152600a6020526040812061121f9083612235565b9392505050565b611231600033611275565b6112705760405162461bcd60e51b815260206004820152601060248201526f43616e6e6f742073657420707269636560801b6044820152606401610965565b600c55565b60009182526009602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600380546108799061344f565b6112ba600033611275565b6113065760405162461bcd60e51b815260206004820152601e60248201527f43616c6c65722063616e6e6f7420736574206275726e206164647265737300006044820152606401610965565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382163314156113815760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610965565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e54610100900460ff166114145760405162461bcd60e51b8152600401610965906134b7565b61145685858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061224192505050565b5050505050565b6001600e5462010000900460ff16600281111561147c5761147c61320f565b146114c95760405162461bcd60e51b815260206004820152601c60248201527f53616c652073746174652073686f756c642062652070726976617465000000006044820152606401610965565b600b546114d4610aa2565b106115165760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610965565b600e5460ff166115385760405162461bcd60e51b815260040161096590613534565b60006115b083838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f546040516bffffffffffffffffffffffff193360601b16602082015290925060340190505b6040516020818303038152906040528051906020012061227a565b90506000611613848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506010546040516bffffffffffffffffffffffff193360601b1660208201529092506034019050611595565b9050818061161e5750805b6116755760405162461bcd60e51b815260206004820152602260248201527f596f7520617265206e6f7420696e207468652076616c69642077686974656c696044820152611cdd60f21b6064820152608401610965565b60008261168c57601154610100900460ff16611693565b60115460ff165b3360009081526013602052604090205460ff91909116915081906116b7908861357c565b11156116d55760405162461bcd60e51b815260040161096590613594565b3360009081526013602052604090205481116117335760405162461bcd60e51b815260206004820152601960248201527f596f7527766520616c7265616479206d696e74656420616c6c000000000000006044820152606401610965565b6000600c548761174391906135d5565b9050348111156117655760405162461bcd60e51b8152600401610965906135f4565b336000908152601360205260408120805489929061178490849061357c565b9091555061179490503388612290565b50505050505050565b60606117a882611ddb565b61180c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610965565b60006118166122aa565b90506000815111611836576040518060200160405280600081525061121f565b80611840846122b9565b60405160200161185192919061363a565b6040516020818303038152906040529392505050565b6000818152600a60205260408120610864906123be565b6008546001600160a01b031633146118a85760405162461bcd60e51b8152600401610965906134ff565b6118b3600033611275565b6118ff5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e74207465616d20746f6b656e730000000000000000006044820152606401610965565b600e5460ff16156119605760405162461bcd60e51b815260206004820152602560248201527f50726f6d6f20746f6b656e73206861766520616c7265616479206265656e206d6044820152641a5b9d195960da1b6064820152608401610965565b6119866119756008546001600160a01b031690565b611981601e600961357c565b612290565b600e805460ff19166001179055565b6016546001600160a01b0316336001600160a01b0316146119f85760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79206275726e65722063616e206275726e20746f6b656e7300000000006044820152606401610965565b601254601754429190611a0b90836134a0565b1115611a635760405162461bcd60e51b815260206004820152602160248201527f4275726e20697320617661696c61626c65206f6e6c7920666f722036206461796044820152607360f81b6064820152608401610965565b60005b82811015611aa157611a8f848483818110611a8357611a83613669565b90506020020135612039565b80611a99816134e4565b915050611a66565b5082829050600b6000828254611ab791906134a0565b9091555050600d8054839190600090611ad190849061357c565b9091555050505050565b600082815260096020526040902060010154611af78133611e6d565b610a9d8383611ef3565b6008546001600160a01b03163314611b2b5760405162461bcd60e51b8152600401610965906134ff565b6001600160a01b038116611b905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610965565b610dca816121e3565b6002600e5462010000900460ff166002811115611bb857611bb861320f565b14611c055760405162461bcd60e51b815260206004820152601b60248201527f53616c652073746174652073686f756c64206265207075626c696300000000006044820152606401610965565b600e5460ff16611c275760405162461bcd60e51b815260040161096590613534565b600b54611c32610aa2565b10611c745760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610965565b601154336000908152601460205260409020546201000090910460ff1690611c9c908361357c565b1115611cba5760405162461bcd60e51b815260040161096590613594565b6000600c5482611cca91906135d5565b905034811115611cec5760405162461bcd60e51b8152600401610965906135f4565b3360009081526014602052604081208054849290611d0b90849061357c565b90915550610d1a90503383612290565b611d258282611275565b610d1a5760008281526009602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611d5d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600061121f836001600160a01b0384166123c8565b60006001600160e01b03198216635a05180f60e01b1480610864575061086482612417565b6000805482108015610864575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610a9d83838361243c565b611e778282611275565b610d1a57611e8f816001600160a01b03166014612734565b611e9a836020612734565b604051602001611eab92919061367f565b60408051601f198184030181529082905262461bcd60e51b825261096591600401613023565b611edb8282611d1b565b6000828152600a60205260409020610a9d9082611da1565b611efd82826128cf565b6000828152600a60205260409020610a9d9082612936565b610a9d838383604051806020016040528060008152506113ed565b6040805160608101825260008082526020820181905291810191909152611f5682611ddb565b611fb55760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610965565b815b600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521580159061201a57508060400151155b15612026579392505050565b5080612031816136f4565b915050611fb7565b600061204482611f30565b90506120566000838360000151611e06565b80516001600160a01b039081166000908152600560209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260049094529184208054600160e01b949096166001600160e01b031990961695909517600160a01b42909216919091021760ff60e01b1916919091179092559061211a90849061357c565b6000818152600460205260409020549091506001600160a01b031661218e5761214281611ddb565b1561218e57815160008281526004602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b815160405184916000916001600160a01b03909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4600180549060006121d9836134e4565b9190505550505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061121f838361294b565b61224c84848461243c565b61225884848484612975565b6122745760405162461bcd60e51b81526004016109659061370b565b50505050565b6000826122878584612a82565b14949350505050565b610d1a828260405180602001604052806000815250612af6565b6060601580546108799061344f565b6060816122dd5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561230757806122f1816134e4565b91506123009050600a83613774565b91506122e1565b6000816001600160401b0381111561232157612321613128565b6040519080825280601f01601f19166020018201604052801561234b576020820181803683370190505b5090505b84156123b6576123606001836134a0565b915061236d600a86613788565b61237890603061357c565b60f81b81838151811061238d5761238d613669565b60200101906001600160f81b031916908160001a9053506123af600a86613774565b945061234f565b949350505050565b6000610864825490565b600081815260018301602052604081205461240f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610864565b506000610864565b60006001600160e01b03198216637965db0b60e01b1480610864575061086482612b03565b600061244782611f30565b80519091506000906001600160a01b0316336001600160a01b0316148061247e575033612473846108fc565b6001600160a01b0316145b806124905750815161249090336107f8565b9050806124fa5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610965565b846001600160a01b031682600001516001600160a01b03161461256e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610965565b6001600160a01b0384166125d25760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610965565b6125e26000848460000151611e06565b6001600160a01b03808616600090815260056020908152604080832080546000196001600160401b0380831691909101811667ffffffffffffffff1992831617909255948916808552828520805480841660019081018516919098161790558885526004909352908320805442909216600160a01b026001600160e01b03199092169092171790559061267690859061357c565b6000818152600460205260409020549091506001600160a01b03166126ea5761269e81611ddb565b156126ea57825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b606060006127438360026135d5565b61274e90600261357c565b6001600160401b0381111561276557612765613128565b6040519080825280601f01601f19166020018201604052801561278f576020820181803683370190505b509050600360fc1b816000815181106127aa576127aa613669565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106127d9576127d9613669565b60200101906001600160f81b031916908160001a90535060006127fd8460026135d5565b61280890600161357c565b90505b6001811115612880576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061283c5761283c613669565b1a60f81b82828151811061285257612852613669565b60200101906001600160f81b031916908160001a90535060049490941c93612879816136f4565b905061280b565b50831561121f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610965565b6128d98282611275565b15610d1a5760008281526009602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600061121f836001600160a01b038416612b6e565b600082600001828154811061296257612962613669565b9060005260206000200154905092915050565b60006001600160a01b0384163b15612a7757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129b990339089908890889060040161379c565b602060405180830381600087803b1580156129d357600080fd5b505af1925050508015612a03575060408051601f3d908101601f19168201909252612a00918101906137d9565b60015b612a5d573d808015612a31576040519150601f19603f3d011682016040523d82523d6000602084013e612a36565b606091505b508051612a555760405162461bcd60e51b81526004016109659061370b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506123b6565b506001949350505050565b600081815b8451811015612aee576000858281518110612aa457612aa4613669565b60200260200101519050808311612aca5760008381526020829052604090209250612adb565b600081815260208490526040902092505b5080612ae6816134e4565b915050612a87565b509392505050565b610a9d8383836001612c61565b60006001600160e01b031982166380ac58cd60e01b1480612b3457506001600160e01b03198216635b5e139f60e01b145b80612b4f57506001600160e01b0319821663780e9d6360e01b145b8061086457506301ffc9a760e01b6001600160e01b0319831614610864565b60008181526001830160205260408120548015612c57576000612b926001836134a0565b8554909150600090612ba6906001906134a0565b9050818114612c0b576000866000018281548110612bc657612bc6613669565b9060005260206000200154905080876000018481548110612be957612be9613669565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612c1c57612c1c6137f6565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610864565b6000915050610864565b6000546001600160a01b038516612cc45760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610965565b612ccd81611ddb565b15612d1a5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610965565b60008411612d7b5760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610965565b6001600160a01b03851660009081526005602052604081208054869290612dac9084906001600160401b031661380c565b82546101009290920a6001600160401b038181021990931691831602179091556001600160a01b038716600090815260056020526040902080548793509091600891612e069185916801000000000000000090041661380c565b82546001600160401b039182166101009390930a9283029282021916919091179091556000838152600460205260408120805442909316600160a01b026001600160e01b03199093166001600160a01b038a1617929092179091558291505b85811015612ef45760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612ed457612eb86000888488612975565b612ed45760405162461bcd60e51b81526004016109659061370b565b81612ede816134e4565b9250508080612eec906134e4565b915050612e65565b50600081905561272c565b828054612f0b9061344f565b90600052602060002090601f016020900481019282612f2d5760008555612f73565b82601f10612f4657805160ff1916838001178555612f73565b82800160010185558215612f73579182015b82811115612f73578251825591602001919060010190612f58565b50612f7f929150612f83565b5090565b5b80821115612f7f5760008155600101612f84565b6001600160e01b031981168114610dca57600080fd5b600060208284031215612fc057600080fd5b813561121f81612f98565b60005b83811015612fe6578181015183820152602001612fce565b838111156122745750506000910152565b6000815180845261300f816020860160208601612fcb565b601f01601f19169290920160200192915050565b60208152600061121f6020830184612ff7565b60006020828403121561304857600080fd5b5035919050565b80356001600160a01b038116811461306657600080fd5b919050565b6000806040838503121561307e57600080fd5b6130878361304f565b946020939093013593505050565b6000806000606084860312156130aa57600080fd5b6130b38461304f565b92506130c16020850161304f565b9150604084013590509250925092565b600080604083850312156130e457600080fd5b823591506130f46020840161304f565b90509250929050565b8035801515811461306657600080fd5b60006020828403121561311f57600080fd5b61121f826130fd565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561315057600080fd5b81356001600160401b038082111561316757600080fd5b818401915084601f83011261317b57600080fd5b81358181111561318d5761318d613128565b604051601f8201601f19908116603f011681019083821181831017156131b5576131b5613128565b816040528281528760208487010111156131ce57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60006020828403121561320057600080fd5b81356003811061121f57600080fd5b634e487b7160e01b600052602160045260246000fd5b602081016003831061324757634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561325f57600080fd5b61121f8261304f565b6000806040838503121561327b57600080fd5b50508035926020909101359150565b6000806040838503121561329d57600080fd5b6132a68361304f565b91506130f4602084016130fd565b6000806000806000608086880312156132cc57600080fd5b6132d58661304f565b94506132e36020870161304f565b93506040860135925060608601356001600160401b038082111561330657600080fd5b818801915088601f83011261331a57600080fd5b81358181111561332957600080fd5b89602082850101111561333b57600080fd5b9699959850939650602001949392505050565b60008083601f84011261336057600080fd5b5081356001600160401b0381111561337757600080fd5b6020830191508360208260051b850101111561339257600080fd5b9250929050565b6000806000604084860312156133ae57600080fd5b8335925060208401356001600160401b038111156133cb57600080fd5b6133d78682870161334e565b9497909650939450505050565b600080602083850312156133f757600080fd5b82356001600160401b0381111561340d57600080fd5b6134198582860161334e565b90969095509350505050565b6000806040838503121561343857600080fd5b6134418361304f565b91506130f46020840161304f565b600181811c9082168061346357607f821691505b6020821081141561348457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156134b2576134b261348a565b500390565b6020808252601390820152725472616465206973206e6f742061637469766560681b604082015260600190565b60006000198214156134f8576134f861348a565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f50726f6d6f20746f6b656e732073686f756c64206265206d696e74656420696e60408201526720616476616e636560c01b606082015260800190565b6000821982111561358f5761358f61348a565b500190565b60208082526021908201527f596f757220746f6b656e20616d6f756e742072656163686564206f7574206d616040820152600f60fb1b606082015260800190565b60008160001904831182151516156135ef576135ef61348a565b500290565b60208082526026908201527f50726f7669646564206e6f7420656e6f75676820457468657220666f7220707560408201526572636861736560d01b606082015260800190565b6000835161364c818460208801612fcb565b835190830190613660818360208801612fcb565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516136b7816017850160208801612fcb565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516136e8816028840160208801612fcb565b01602801949350505050565b6000816137035761370361348a565b506000190190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826137835761378361375e565b500490565b6000826137975761379761375e565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137cf90830184612ff7565b9695505050505050565b6000602082840312156137eb57600080fd5b815161121f81612f98565b634e487b7160e01b600052603160045260246000fd5b60006001600160401b038083168185168083038211156136605761366061348a56fea2646970667358221220fa5aee91f5733441a3fd59e62fd3ecfc7d19ee5a896a39400d6a83499cb199d564736f6c63430008090033

Deployed Bytecode Sourcemap

72516:5844:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78172:185;;;;;;;;;;-1:-1:-1;78172:185:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;78172:185:0;;;;;;;;59038:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;60599:214::-;;;;;;;;;;-1:-1:-1;60599:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;60599:214:0;1528:203:1;60120:413:0;;;;;;;;;;-1:-1:-1;60120:413:0;;;;;:::i;:::-;;:::i;:::-;;54305:114;;;;;;;;;;;;;:::i;:::-;;;2319:25:1;;;2307:2;2292:18;54305:114:0;2173:177:1;74035:193:0;;;;;;;;;;-1:-1:-1;74035:193:0;;;;;:::i;:::-;;:::i;15143:131::-;;;;;;;;;;-1:-1:-1;15143:131:0;;;;;:::i;:::-;15217:7;15244:12;;;:6;:12;;;;;:22;;;;15143:131;72686:36;;;;;;;;;;;;;;;;72638:39;;;;;;;;;;;;72675:2;72638:39;;15536:147;;;;;;;;;;-1:-1:-1;15536:147:0;;;;;:::i;:::-;;:::i;55571:923::-;;;;;;;;;;-1:-1:-1;55571:923:0;;;;;:::i;:::-;;:::i;16584:218::-;;;;;;;;;;-1:-1:-1;16584:218:0;;;;;:::i;:::-;;:::i;74588:182::-;;;;;;;;;;;;;:::i;74236:173::-;;;;;;;;;;-1:-1:-1;74236:173:0;;;;;:::i;:::-;;:::i;73826:201::-;;;;;;;;;;-1:-1:-1;73826:201:0;;;;;:::i;:::-;;:::i;69179:428::-;;;;;;;;;;-1:-1:-1;69179:428:0;;;;;:::i;:::-;;:::i;54712:559::-;;;;;;;;;;-1:-1:-1;54712:559:0;;;;;:::i;:::-;;:::i;78062:102::-;;;;;;;;;;-1:-1:-1;78062:102:0;;;;;:::i;:::-;;:::i;72860:31::-;;;;;;;;;;-1:-1:-1;72860:31:0;;;;;;;;;;;74778:172;;;;;;;;;;-1:-1:-1;74778:172:0;;;;;:::i;:::-;;:::i;72816:37::-;;;;;;;;;;-1:-1:-1;72816:37:0;;;;;;;;72951:45;;;;;;;;;;-1:-1:-1;72951:45:0;;;;;;;;;;;;;;;;;;:::i;58847:124::-;;;;;;;;;;-1:-1:-1;58847:124:0;;;;;:::i;:::-;;:::i;72588:43::-;;;;;;;;;;;;72630:1;72588:43;;57002:221;;;;;;;;;;-1:-1:-1;57002:221:0;;;;;:::i;:::-;;:::i;2497:103::-;;;;;;;;;;;;;:::i;74958:251::-;;;;;;;;;;-1:-1:-1;74958:251:0;;;;;:::i;:::-;;:::i;72729:42::-;;;;;;;;;;;;;;;;1846:87;;;;;;;;;;-1:-1:-1;1919:6:0;;-1:-1:-1;;;;;1919:6:0;1846:87;;32467:153;;;;;;;;;;-1:-1:-1;32467:153:0;;;;;:::i;:::-;;:::i;74417:163::-;;;;;;;;;;-1:-1:-1;74417:163:0;;;;;:::i;:::-;;:::i;14012:147::-;;;;;;;;;;-1:-1:-1;14012:147:0;;;;;:::i;:::-;;:::i;59207:104::-;;;;;;;;;;;;;:::i;77738:196::-;;;;;;;;;;-1:-1:-1;77738:196:0;;;;;:::i;:::-;;:::i;13103:49::-;;;;;;;;;;-1:-1:-1;13103:49:0;13148:4;13103:49;;60885:288;;;;;;;;;;-1:-1:-1;60885:288:0;;;;;:::i;:::-;;:::i;73590:228::-;;;;;;;;;;-1:-1:-1;73590:228:0;;;;;:::i;:::-;;:::i;75524:1127::-;;;;;;:::i;:::-;;:::i;59382:334::-;;;;;;;;;;-1:-1:-1;59382:334:0;;;;;:::i;:::-;;:::i;32794:142::-;;;;;;;;;;-1:-1:-1;32794:142:0;;;;;:::i;:::-;;:::i;75217:299::-;;;;;;;;;;;;;:::i;77280:450::-;;;;;;;;;;-1:-1:-1;77280:450:0;;;;;:::i;:::-;;:::i;15928:149::-;;;;;;;;;;-1:-1:-1;15928:149:0;;;;;:::i;:::-;;:::i;72778:31::-;;;;;;;;;;;;;;;;61244:164;;;;;;;;;;-1:-1:-1;61244:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;61365:25:0;;;61341:4;61365:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;61244:164;2755:201;;;;;;;;;;-1:-1:-1;2755:201:0;;;;;:::i;:::-;;:::i;76659:613::-;;;;;;:::i;:::-;;:::i;78172:185::-;78291:4;78313:36;78337:11;78313:23;:36::i;:::-;78306:43;78172:185;-1:-1:-1;;78172:185:0:o;59038:100::-;59092:13;59125:5;59118:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59038:100;:::o;60599:214::-;60667:7;60695:16;60703:7;60695;:16::i;:::-;60687:74;;;;-1:-1:-1;;;60687:74:0;;9422:2:1;60687:74:0;;;9404:21:1;9461:2;9441:18;;;9434:30;9500:34;9480:18;;;9473:62;-1:-1:-1;;;9551:18:1;;;9544:43;9604:19;;60687:74:0;;;;;;;;;-1:-1:-1;60781:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;60781:24:0;;60599:214::o;60120:413::-;60193:13;60209:24;60225:7;60209:15;:24::i;:::-;60193:40;;60258:5;-1:-1:-1;;;;;60252:11:0;:2;-1:-1:-1;;;;;60252:11:0;;;60244:58;;;;-1:-1:-1;;;60244:58:0;;9836:2:1;60244:58:0;;;9818:21:1;9875:2;9855:18;;;9848:30;9914:34;9894:18;;;9887:62;-1:-1:-1;;;9965:18:1;;;9958:32;10007:19;;60244:58:0;9634:398:1;60244:58:0;736:10;-1:-1:-1;;;;;60337:21:0;;;;:62;;-1:-1:-1;60362:37:0;60379:5;736:10;61244:164;:::i;60362:37::-;60315:169;;;;-1:-1:-1;;;60315:169:0;;10239:2:1;60315:169:0;;;10221:21:1;10278:2;10258:18;;;10251:30;10317:34;10297:18;;;10290:62;10388:27;10368:18;;;10361:55;10433:19;;60315:169:0;10037:421:1;60315:169:0;60497:28;60506:2;60510:7;60519:5;60497:8;:28::i;:::-;60182:351;60120:413;;:::o;54305:114::-;54358:7;54400:11;;54385:12;;:26;;;;:::i;:::-;54378:33;;54305:114;:::o;74035:193::-;74136:11;;;;;;;74128:43;;;;-1:-1:-1;;;74128:43:0;;;;;;;:::i;:::-;74180:40;74199:5;74206:3;74211:8;74180:18;:40::i;15536:147::-;15217:7;15244:12;;;:6;:12;;;;;:22;;;13594:30;13605:4;736:10;13594;:30::i;:::-;15650:25:::1;15661:4;15667:7;15650:10;:25::i;55571:923::-:0;55660:7;55696:16;55706:5;55696:9;:16::i;:::-;55688:5;:24;55680:71;;;;-1:-1:-1;;;55680:71:0;;11275:2:1;55680:71:0;;;11257:21:1;11314:2;11294:18;;;11287:30;11353:34;11333:18;;;11326:62;-1:-1:-1;;;11404:18:1;;;11397:32;11446:19;;55680:71:0;11073:398:1;55680:71:0;55762:22;55787:12;;;55762:22;;55893:527;55917:14;55913:1;:18;55893:527;;;55953:31;55987:14;;;:11;:14;;;;;;;;;55953:48;;;;;;;;;-1:-1:-1;;;;;55953:48:0;;;;;-1:-1:-1;;;55953:48:0;;-1:-1:-1;;;;;55953:48:0;;;;;;;;-1:-1:-1;;;55953:48:0;;;;;;;;;;;;;56020:28;56016:103;;56089:14;;;-1:-1:-1;56016:103:0;56137:9;:16;;;56133:87;;;56202:1;56174:30;;56133:87;56259:5;-1:-1:-1;;;;;56238:26:0;:17;-1:-1:-1;;;;;56238:26:0;;56234:175;;;56304:5;56289:11;:20;56285:77;;;-1:-1:-1;56341:1:0;-1:-1:-1;56334:8:0;;-1:-1:-1;;;56334:8:0;56285:77;56380:13;;;;:::i;:::-;;;;56234:175;-1:-1:-1;55933:3:0;;;;:::i;:::-;;;;55893:527;;;-1:-1:-1;56430:56:0;;-1:-1:-1;;;56430:56:0;;11818:2:1;56430:56:0;;;11800:21:1;11857:2;11837:18;;;11830:30;11896:34;11876:18;;;11869:62;-1:-1:-1;;;11947:18:1;;;11940:44;12001:19;;56430:56:0;11616:410:1;16584:218:0;-1:-1:-1;;;;;16680:23:0;;736:10;16680:23;16672:83;;;;-1:-1:-1;;;16672:83:0;;12233:2:1;16672:83:0;;;12215:21:1;12272:2;12252:18;;;12245:30;12311:34;12291:18;;;12284:62;-1:-1:-1;;;12362:18:1;;;12355:45;12417:19;;16672:83:0;12031:411:1;16672:83:0;16768:26;16780:4;16786:7;16768:11;:26::i;:::-;16584:218;;:::o;74588:182::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;74642:41:::1;13148:4;736:10:::0;14012:147;:::i;74642:41::-:1;74634:69;;;::::0;-1:-1:-1;;;74634:69:0;;13010:2:1;74634:69:0::1;::::0;::::1;12992:21:1::0;13049:2;13029:18;;;13022:30;-1:-1:-1;;;13068:18:1;;;13061:45;13123:18;;74634:69:0::1;12808:339:1::0;74634:69:0::1;1919:6:::0;;74714:48:::1;::::0;-1:-1:-1;;;;;1919:6:0;;;;74740:21:::1;74714:48:::0;::::1;;;::::0;::::1;::::0;;;74740:21;1919:6;74714:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;74588:182::o:0;74236:173::-;74300:41;13148:4;736:10;14012:147;:::i;74300:41::-;74292:76;;;;-1:-1:-1;;;74292:76:0;;13354:2:1;74292:76:0;;;13336:21:1;13393:2;13373:18;;;13366:30;-1:-1:-1;;;13412:18:1;;;13405:52;13474:18;;74292:76:0;13152:346:1;74292:76:0;74377:11;:24;;;;;;;-1:-1:-1;;74377:24:0;;;;;;;;;74236:173::o;73826:201::-;73931:11;;;;;;;73923:43;;;;-1:-1:-1;;;73923:43:0;;;;;;;:::i;:::-;73975:44;73998:5;74005:3;74010:8;73975:22;:44::i;69179:428::-;69236:35;69274:20;69286:7;69274:11;:20::i;:::-;69349:18;;69236:58;;-1:-1:-1;69307:22:0;;-1:-1:-1;;;;;69333:34:0;736:10;-1:-1:-1;;;;;69333:34:0;;:87;;;-1:-1:-1;736:10:0;69384:20;69396:7;69384:11;:20::i;:::-;-1:-1:-1;;;;;69384:36:0;;69333:87;:154;;;-1:-1:-1;69454:18:0;;69437:50;;736:10;61244:164;:::i;69437:50::-;69307:181;;69509:17;69501:71;;;;-1:-1:-1;;;69501:71:0;;13705:2:1;69501:71:0;;;13687:21:1;13744:2;13724:18;;;13717:30;13783:34;13763:18;;;13756:62;-1:-1:-1;;;13834:18:1;;;13827:39;13883:19;;69501:71:0;13503:405:1;69501:71:0;69585:14;69591:7;69585:5;:14::i;54712:559::-;54779:7;54824:12;;54779:7;;54881:300;54905:14;54901:1;:18;54881:300;;;54941:31;54975:14;;;:11;:14;;;;;;;;;54941:48;;;;;;;;;-1:-1:-1;;;;;54941:48:0;;;;-1:-1:-1;;;54941:48:0;;-1:-1:-1;;;;;54941:48:0;;;;;;;;-1:-1:-1;;;54941:48:0;;;;;;;;;;;;;;55004:166;;55065:5;55050:11;:20;55046:77;;;-1:-1:-1;55102:1:0;54712:559;-1:-1:-1;;;;54712:559:0:o;55046:77::-;55141:13;;;;:::i;:::-;;;;55004:166;-1:-1:-1;54921:3:0;;;;:::i;:::-;;;;54881:300;;;-1:-1:-1;55191:53:0;;-1:-1:-1;;;55191:53:0;;14115:2:1;55191:53:0;;;14097:21:1;14154:2;14134:18;;;14127:30;14193:34;14173:18;;;14166:62;-1:-1:-1;;;14244:18:1;;;14237:33;14287:19;;55191:53:0;13913:399:1;78062:102:0;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;78133:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;74778:172::-:0;74844:41;13148:4;736:10;14012:147;:::i;74844:41::-;74836:77;;;;-1:-1:-1;;;74836:77:0;;14519:2:1;74836:77:0;;;14501:21:1;14558:2;14538:18;;;14531:30;14597:25;14577:18;;;14570:53;14640:18;;74836:77:0;14317:347:1;74836:77:0;74922:9;:20;;74934:8;;74922:9;-1:-1:-1;;74922:20:0;;74934:8;74922:9;:20;;;;;;;:::i;:::-;;;;;;74778:172;:::o;58847:124::-;58911:7;58938:20;58950:7;58938:11;:20::i;:::-;:25;;58847:124;-1:-1:-1;;58847:124:0:o;57002:221::-;57066:7;-1:-1:-1;;;;;57094:19:0;;57086:75;;;;-1:-1:-1;;;57086:75:0;;14871:2:1;57086:75:0;;;14853:21:1;14910:2;14890:18;;;14883:30;14949:34;14929:18;;;14922:62;-1:-1:-1;;;15000:18:1;;;14993:41;15051:19;;57086:75:0;14669:407:1;57086:75:0;-1:-1:-1;;;;;;57187:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;57187:27:0;;57002:221::o;2497:103::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;2562:30:::1;2589:1;2562:18;:30::i;:::-;2497:103::o:0;74958:251::-;75051:41;13148:4;736:10;14012:147;:::i;75051:41::-;75043:76;;;;-1:-1:-1;;;75043:76:0;;15283:2:1;75043:76:0;;;15265:21:1;15322:2;15302:18;;;15295:30;-1:-1:-1;;;15341:18:1;;;15334:52;15403:18;;75043:76:0;15081:346:1;75043:76:0;75128:16;:32;;;;75169:16;:32;74958:251::o;32467:153::-;32557:7;32584:18;;;:12;:18;;;;;:28;;32606:5;32584:21;:28::i;:::-;32577:35;32467:153;-1:-1:-1;;;32467:153:0:o;74417:163::-;74477:41;13148:4;736:10;14012:147;:::i;74477:41::-;74469:70;;;;-1:-1:-1;;;74469:70:0;;15634:2:1;74469:70:0;;;15616:21:1;15673:2;15653:18;;;15646:30;-1:-1:-1;;;15692:18:1;;;15685:46;15748:18;;74469:70:0;15432:340:1;74469:70:0;74548:13;:24;74417:163::o;14012:147::-;14098:4;14122:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14122:29:0;;;;;;;;;;;;;;;14012:147::o;59207:104::-;59263:13;59296:7;59289:14;;;;;:::i;77738:196::-;77811:41;13148:4;736:10;14012:147;:::i;77811:41::-;77803:84;;;;-1:-1:-1;;;77803:84:0;;15979:2:1;77803:84:0;;;15961:21:1;16018:2;15998:18;;;15991:30;16057:32;16037:18;;;16030:60;16107:18;;77803:84:0;15777:354:1;77803:84:0;77896:14;:30;;-1:-1:-1;;;;;;77896:30:0;-1:-1:-1;;;;;77896:30:0;;;;;;;;;;77738:196::o;60885:288::-;-1:-1:-1;;;;;60980:24:0;;736:10;60980:24;;60972:63;;;;-1:-1:-1;;;60972:63:0;;16338:2:1;60972:63:0;;;16320:21:1;16377:2;16357:18;;;16350:30;16416:28;16396:18;;;16389:56;16462:18;;60972:63:0;16136:350:1;60972:63:0;736:10;61048:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;61048:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;61048:53:0;;;;;;;;;;61117:48;;540:41:1;;;61048:42:0;;736:10;61117:48;;513:18:1;61117:48:0;;;;;;;60885:288;;:::o;73590:228::-;73716:11;;;;;;;73708:43;;;;-1:-1:-1;;;73708:43:0;;;;;;;:::i;:::-;73760:50;73783:5;73790:3;73795:8;73805:4;;73760:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73760:22:0;;-1:-1:-1;;;73760:50:0:i;:::-;73590:228;;;;;:::o;75524:1127::-;75629:17;75616:9;;;;;;;;:30;;;;;;;:::i;:::-;;75607:72;;;;-1:-1:-1;;;75607:72:0;;16693:2:1;75607:72:0;;;16675:21:1;16732:2;16712:18;;;16705:30;16771;16751:18;;;16744:58;16819:18;;75607:72:0;16491:352:1;75607:72:0;75712:14;;75696:13;:11;:13::i;:::-;:30;75688:61;;;;-1:-1:-1;;;75688:61:0;;17050:2:1;75688:61:0;;;17032:21:1;17089:2;17069:18;;;17062:30;-1:-1:-1;;;17108:18:1;;;17101:48;17166:18;;75688:61:0;16848:342:1;75688:61:0;75766:17;;;;75758:70;;;;-1:-1:-1;;;75758:70:0;;;;;;;:::i;:::-;75837:18;75858:84;75877:5;;75858:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75884:16:0;;75912:28;;-1:-1:-1;;75929:10:0;17753:2:1;17749:15;17745:53;75912:28:0;;;17733:66:1;75884:16:0;;-1:-1:-1;17815:12:1;;;-1:-1:-1;75912:28:0;;;;;;;;;;;;;75902:39;;;;;;75858:18;:84::i;:::-;75837:105;;75951:18;75972:84;75991:5;;75972:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75998:16:0;;76026:28;;-1:-1:-1;;76043:10:0;17753:2:1;17749:15;17745:53;76026:28:0;;;17733:66:1;75998:16:0;;-1:-1:-1;17815:12:1;;;-1:-1:-1;76026:28:0;17604:229:1;75972:84:0;75951:105;;76073:13;:30;;;;76090:13;76073:30;76065:77;;;;-1:-1:-1;;;76065:77:0;;18040:2:1;76065:77:0;;;18022:21:1;18079:2;18059:18;;;18052:30;18118:34;18098:18;;;18091:62;-1:-1:-1;;;18169:18:1;;;18162:32;18211:19;;76065:77:0;17838:398:1;76065:77:0;76153:21;76177:13;:51;;76212:16;;;;;;;76177:51;;;76193:16;;;;76177:51;76268:10;76254:25;;;;:13;:25;;;;;;76153:75;;;;;;-1:-1:-1;76153:75:0;;76245:34;;:6;:34;:::i;:::-;:51;;76237:97;;;;-1:-1:-1;;;76237:97:0;;;;;;;:::i;:::-;76365:10;76351:25;;;;:13;:25;;;;;;:41;-1:-1:-1;76343:79:0;;;;-1:-1:-1;;;76343:79:0;;18978:2:1;76343:79:0;;;18960:21:1;19017:2;18997:18;;;18990:30;19056:27;19036:18;;;19029:55;19101:18;;76343:79:0;18776:349:1;76343:79:0;76431:19;76462:13;;76453:6;:22;;;;:::i;:::-;76431:44;;76507:9;76492:11;:24;;76484:75;;;;-1:-1:-1;;;76484:75:0;;;;;;;:::i;:::-;76582:10;76568:25;;;;:13;:25;;;;;:35;;76597:6;;76568:25;:35;;76597:6;;76568:35;:::i;:::-;;;;-1:-1:-1;76612:31:0;;-1:-1:-1;736:10:0;76636:6;76612:9;:31::i;:::-;75598:1053;;;;75524:1127;;;:::o;59382:334::-;59455:13;59489:16;59497:7;59489;:16::i;:::-;59481:76;;;;-1:-1:-1;;;59481:76:0;;19912:2:1;59481:76:0;;;19894:21:1;19951:2;19931:18;;;19924:30;19990:34;19970:18;;;19963:62;-1:-1:-1;;;20041:18:1;;;20034:45;20096:19;;59481:76:0;19710:411:1;59481:76:0;59570:21;59594:10;:8;:10::i;:::-;59570:34;;59646:1;59628:7;59622:21;:25;:86;;;;;;;;;;;;;;;;;59674:7;59683:18;:7;:16;:18::i;:::-;59657:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59615:93;59382:334;-1:-1:-1;;;59382:334:0:o;32794:142::-;32874:7;32901:18;;;:12;:18;;;;;:27;;:25;:27::i;75217:299::-;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;75272:41:::1;13148:4;736:10:::0;14012:147;:::i;75272:41::-:1;75264:77;;;::::0;-1:-1:-1;;;75264:77:0;;20803:2:1;75264:77:0::1;::::0;::::1;20785:21:1::0;20842:2;20822:18;;;20815:30;20881:25;20861:18;;;20854:53;20924:18;;75264:77:0::1;20601:347:1::0;75264:77:0::1;75359:17;::::0;::::1;;75358:18;75350:68;;;::::0;-1:-1:-1;;;75350:68:0;;21155:2:1;75350:68:0::1;::::0;::::1;21137:21:1::0;21194:2;21174:18;;;21167:30;21233:34;21213:18;;;21206:62;-1:-1:-1;;;21284:18:1;;;21277:35;21329:19;;75350:68:0::1;20953:401:1::0;75350:68:0::1;75427:48;75437:7;1919:6:::0;;-1:-1:-1;;;;;1919:6:0;;1846:87;75437:7:::1;75446:28;72675:2;72630:1;75446:28;:::i;:::-;75427:9;:48::i;:::-;75484:17;:24:::0;;-1:-1:-1;;75484:24:0::1;75504:4;75484:24;::::0;;75217:299::o;77280:450::-;77367:14;;-1:-1:-1;;;;;77367:14:0;736:10;-1:-1:-1;;;;;77351:30:0;;77343:70;;;;-1:-1:-1;;;77343:70:0;;21561:2:1;77343:70:0;;;21543:21:1;21600:2;21580:18;;;21573:30;21639:29;21619:18;;;21612:57;21686:18;;77343:70:0;21359:351:1;77343:70:0;77498:15;;77482:12;;77440:15;;77498;77472:22;;77440:15;77472:22;:::i;:::-;:41;;77464:87;;;;-1:-1:-1;;;77464:87:0;;21917:2:1;77464:87:0;;;21899:21:1;21956:2;21936:18;;;21929:30;21995:34;21975:18;;;21968:62;-1:-1:-1;;;22046:18:1;;;22039:31;22087:19;;77464:87:0;21715:397:1;77464:87:0;77565:9;77560:81;77576:19;;;77560:81;;;77613:18;77619:8;;77628:1;77619:11;;;;;;;:::i;:::-;;;;;;;77613:5;:18::i;:::-;77597:3;;;;:::i;:::-;;;;77560:81;;;;77667:8;;:15;;77649:14;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;77691:12:0;:31;;77707:8;;77691:12;;;:31;;77707:8;;77691:31;:::i;:::-;;;;-1:-1:-1;;;;;77280:450:0:o;15928:149::-;15217:7;15244:12;;;:6;:12;;;;;:22;;;13594:30;13605:4;736:10;13594;:30::i;:::-;16043:26:::1;16055:4;16061:7;16043:11;:26::i;2755:201::-:0;1919:6;;-1:-1:-1;;;;;1919:6:0;736:10;2066:23;2058:68;;;;-1:-1:-1;;;2058:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2844:22:0;::::1;2836:73;;;::::0;-1:-1:-1;;;2836:73:0;;22451:2:1;2836:73:0::1;::::0;::::1;22433:21:1::0;22490:2;22470:18;;;22463:30;22529:34;22509:18;;;22502:62;-1:-1:-1;;;22580:18:1;;;22573:36;22626:19;;2836:73:0::1;22249:402:1::0;2836:73:0::1;2920:28;2939:8;2920:18;:28::i;76659:613::-:0;76741:16;76728:9;;;;;;;;:29;;;;;;;:::i;:::-;;76719:70;;;;-1:-1:-1;;;76719:70:0;;22858:2:1;76719:70:0;;;22840:21:1;22897:2;22877:18;;;22870:30;22936:29;22916:18;;;22909:57;22983:18;;76719:70:0;22656:351:1;76719:70:0;76806:17;;;;76798:70;;;;-1:-1:-1;;;76798:70:0;;;;;;;:::i;:::-;76901:14;;76885:13;:11;:13::i;:::-;:30;76877:61;;;;-1:-1:-1;;;76877:61:0;;17050:2:1;76877:61:0;;;17032:21:1;17089:2;17069:18;;;17062:30;-1:-1:-1;;;17108:18:1;;;17101:48;17166:18;;76877:61:0;16848:342:1;76877:61:0;76992:14;;76977:10;76964:24;;;;:12;:24;;;;;;76992:14;;;;;;;76955:33;;:6;:33;:::i;:::-;:51;;76947:97;;;;-1:-1:-1;;;76947:97:0;;;;;;;:::i;:::-;77053:19;77084:13;;77075:6;:22;;;;:::i;:::-;77053:44;;77129:9;77114:11;:24;;77106:75;;;;-1:-1:-1;;;77106:75:0;;;;;;;:::i;:::-;77203:10;77190:24;;;;:12;:24;;;;;:34;;77218:6;;77190:24;:34;;77218:6;;77190:34;:::i;:::-;;;;-1:-1:-1;77233:31:0;;-1:-1:-1;736:10:0;77257:6;77233:9;:31::i;18085:238::-;18169:22;18177:4;18183:7;18169;:22::i;:::-;18164:152;;18208:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;18208:29:0;;;;;;;;;:36;;-1:-1:-1;;18208:36:0;18240:4;18208:36;;;18291:12;736:10;;656:98;18291:12;-1:-1:-1;;;;;18264:40:0;18282:7;-1:-1:-1;;;;;18264:40:0;18276:4;18264:40;;;;;;;;;;18085:238;;:::o;26476:152::-;26546:4;26570:50;26575:3;-1:-1:-1;;;;;26595:23:0;;26570:4;:50::i;31654:214::-;31739:4;-1:-1:-1;;;;;;31763:57:0;;-1:-1:-1;;;31763:57:0;;:97;;;31824:36;31848:11;31824:23;:36::i;62590:143::-;62647:4;62681:12;;62671:7;:22;:54;;;;-1:-1:-1;;62698:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;62698:27:0;;;;62697:28;;62590:143::o;69725:196::-;69840:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;69840:29:0;-1:-1:-1;;;;;69840:29:0;;;;;;;;;69885:28;;69840:24;;69885:28;;;;;;;69725:196;;;:::o;61475:170::-;61609:28;61619:4;61625:2;61629:7;61609:9;:28::i;14449:505::-;14538:22;14546:4;14552:7;14538;:22::i;:::-;14533:414;;14726:41;14754:7;-1:-1:-1;;;;;14726:41:0;14764:2;14726:19;:41::i;:::-;14840:38;14868:4;14875:2;14840:19;:38::i;:::-;14631:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;14631:270:0;;;;;;;;;;-1:-1:-1;;;14577:358:0;;;;;;;:::i;33029:169::-;33117:31;33134:4;33140:7;33117:16;:31::i;:::-;33159:18;;;;:12;:18;;;;;:31;;33182:7;33159:22;:31::i;33292:174::-;33381:32;33399:4;33405:7;33381:17;:32::i;:::-;33424:18;;;;:12;:18;;;;;:34;;33450:7;33424:25;:34::i;61716:185::-;61854:39;61871:4;61877:2;61881:7;61854:39;;;;;;;;;;;;:16;:39::i;58292:493::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;58395:16:0;58403:7;58395;:16::i;:::-;58387:71;;;;-1:-1:-1;;;58387:71:0;;24005:2:1;58387:71:0;;;23987:21:1;24044:2;24024:18;;;24017:30;24083:34;24063:18;;;24056:62;-1:-1:-1;;;24134:18:1;;;24127:40;24184:19;;58387:71:0;23803:406:1;58387:71:0;58491:7;58471:237;58525:31;58559:17;;;:11;:17;;;;;;;;;58525:51;;;;;;;;;-1:-1:-1;;;;;58525:51:0;;;;;-1:-1:-1;;;58525:51:0;;-1:-1:-1;;;;;58525:51:0;;;;;;;;-1:-1:-1;;;58525:51:0;;;;;;;;;;;;;58595:28;;;;:49;;;58628:9;:16;;;58627:17;58595:49;58591:106;;;58672:9;58292:493;-1:-1:-1;;;58292:493:0:o;58591:106::-;-1:-1:-1;58502:6:0;;;;:::i;:::-;;;;58471:237;;67379:1617;67439:35;67477:20;67489:7;67477:11;:20::i;:::-;67439:58;-1:-1:-1;67640:49:0;67657:1;67661:7;67670:13;:18;;;67640:8;:49::i;:::-;67907:18;;-1:-1:-1;;;;;67894:32:0;;;;;;;:12;:32;;;;;;;;:45;;-1:-1:-1;;67894:45:0;;-1:-1:-1;;;;;67894:45:0;;;-1:-1:-1;;67894:45:0;;;;;;;67967:18;;67954:32;;;;;;;:50;;-1:-1:-1;;;;67954:50:0;;-1:-1:-1;;;67954:50:0;;;;;;-1:-1:-1;67954:50:0;;;;;;;;;;;;68126:18;;68098:20;;;:11;:20;;;;;;:46;;-1:-1:-1;;;68098:46:0;;;;-1:-1:-1;;;;;;68155:61:0;;;;;;;-1:-1:-1;;;68200:15:0;68155:61;;;;;;;;-1:-1:-1;;;;68227:34:0;;;;;;;;67894:32;68524:11;;68098:20;;68524:11;:::i;:::-;68591:1;68550:24;;;:11;:24;;;;;:29;68502:33;;-1:-1:-1;;;;;;68550:29:0;68546:275;;68614:20;68622:11;68614:7;:20::i;:::-;68610:200;;;68687:18;;;68655:24;;;:11;:24;;;;;;;;:50;;68766:28;;;;-1:-1:-1;;;;;68724:70:0;-1:-1:-1;;;68724:70:0;-1:-1:-1;;;;;;68724:70:0;;;-1:-1:-1;;;;;68655:50:0;;;68724:70;;;;;;;68610:200;68847:18;;68838:49;;68879:7;;68875:1;;-1:-1:-1;;;;;68838:49:0;;;;;;68875:1;;68838:49;68975:11;:13;;;:11;:13;;;:::i;:::-;;;;;;67428:1568;;67379:1617;:::o;3116:191::-;3209:6;;;-1:-1:-1;;;;;3226:17:0;;;-1:-1:-1;;;;;;3226:17:0;;;;;;;3259:40;;3209:6;;;3226:17;3209:6;;3259:40;;3190:16;;3259:40;3179:128;3116:191;:::o;27772:158::-;27846:7;27897:22;27901:3;27913:5;27897:3;:22::i;61972:363::-;62139:28;62149:4;62155:2;62159:7;62139:9;:28::i;:::-;62200:48;62223:4;62229:2;62233:7;62242:5;62200:22;:48::i;:::-;62178:149;;;;-1:-1:-1;;;62178:149:0;;;;;;;:::i;:::-;61972:363;;;;:::o;34296:190::-;34421:4;34474;34445:25;34458:5;34465:4;34445:12;:25::i;:::-;:33;;34296:190;-1:-1:-1;;;;34296:190:0:o;62741:104::-;62810:27;62820:2;62824:8;62810:27;;;;;;;;;;;;:9;:27::i;77942:112::-;78002:13;78033;78026:20;;;;;:::i;7713:723::-;7769:13;7990:10;7986:53;;-1:-1:-1;;8017:10:0;;;;;;;;;;;;-1:-1:-1;;;8017:10:0;;;;;7713:723::o;7986:53::-;8064:5;8049:12;8105:78;8112:9;;8105:78;;8138:8;;;;:::i;:::-;;-1:-1:-1;8161:10:0;;-1:-1:-1;8169:2:0;8161:10;;:::i;:::-;;;8105:78;;;8193:19;8225:6;-1:-1:-1;;;;;8215:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8215:17:0;;8193:39;;8243:154;8250:10;;8243:154;;8277:11;8287:1;8277:11;;:::i;:::-;;-1:-1:-1;8346:10:0;8354:2;8346:5;:10;:::i;:::-;8333:24;;:2;:24;:::i;:::-;8320:39;;8303:6;8310;8303:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8303:56:0;;;;;;;;-1:-1:-1;8374:11:0;8383:2;8374:11;;:::i;:::-;;;8243:154;;;8421:6;7713:723;-1:-1:-1;;;;7713:723:0:o;27301:117::-;27364:7;27391:19;27399:3;22785:18;;22702:109;20391:414;20454:4;22584:19;;;:12;;;:19;;;;;;20471:327;;-1:-1:-1;20514:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;20697:18;;20675:19;;;:12;;;:19;;;;;;:40;;;;20730:11;;20471:327;-1:-1:-1;20781:5:0;20774:12;;13716:204;13801:4;-1:-1:-1;;;;;;13825:47:0;;-1:-1:-1;;;13825:47:0;;:87;;;13876:36;13900:11;13876:23;:36::i;65283:1867::-;65398:35;65436:20;65448:7;65436:11;:20::i;:::-;65511:18;;65398:58;;-1:-1:-1;65469:22:0;;-1:-1:-1;;;;;65495:34:0;736:10;-1:-1:-1;;;;;65495:34:0;;:87;;;-1:-1:-1;736:10:0;65546:20;65558:7;65546:11;:20::i;:::-;-1:-1:-1;;;;;65546:36:0;;65495:87;:154;;;-1:-1:-1;65616:18:0;;65599:50;;736:10;61244:164;:::i;65599:50::-;65469:181;;65671:17;65663:80;;;;-1:-1:-1;;;65663:80:0;;25767:2:1;65663:80:0;;;25749:21:1;25806:2;25786:18;;;25779:30;25845:34;25825:18;;;25818:62;-1:-1:-1;;;25896:18:1;;;25889:48;25954:19;;65663:80:0;25565:414:1;65663:80:0;65786:4;-1:-1:-1;;;;;65764:26:0;:13;:18;;;-1:-1:-1;;;;;65764:26:0;;65756:77;;;;-1:-1:-1;;;65756:77:0;;26186:2:1;65756:77:0;;;26168:21:1;26225:2;26205:18;;;26198:30;26264:34;26244:18;;;26237:62;-1:-1:-1;;;26315:18:1;;;26308:36;26361:19;;65756:77:0;25984:402:1;65756:77:0;-1:-1:-1;;;;;65852:16:0;;65844:66;;;;-1:-1:-1;;;65844:66:0;;26593:2:1;65844:66:0;;;26575:21:1;26632:2;26612:18;;;26605:30;26671:34;26651:18;;;26644:62;-1:-1:-1;;;26722:18:1;;;26715:35;26767:19;;65844:66:0;26391:401:1;65844:66:0;66031:49;66048:1;66052:7;66061:13;:18;;;66031:8;:49::i;:::-;-1:-1:-1;;;;;66285:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;;66285:31:0;;;;;;;;;-1:-1:-1;;66285:31:0;;;;;;;66331:16;;;;;;;;;:29;;;;;66315:1;66331:29;;;;;;;;;;;;66384:20;;;:11;:20;;;;;;:30;;66470:15;66425:61;;;-1:-1:-1;;;66425:61:0;-1:-1:-1;;;;;;66425:61:0;;;;;;;;;66285:18;66748:11;;66396:7;;66748:11;:::i;:::-;66815:1;66774:24;;;:11;:24;;;;;:29;66726:33;;-1:-1:-1;;;;;;66774:29:0;66770:275;;66838:20;66846:11;66838:7;:20::i;:::-;66834:200;;;66911:18;;;66879:24;;;:11;:24;;;;;;;;:50;;66990:28;;;;-1:-1:-1;;;;;66948:70:0;-1:-1:-1;;;66948:70:0;-1:-1:-1;;;;;;66948:70:0;;;-1:-1:-1;;;;;66879:50:0;;;66948:70;;;;;;;66834:200;67081:7;67077:2;-1:-1:-1;;;;;67062:27:0;67071:4;-1:-1:-1;;;;;67062:27:0;;;;;;;;;;;67100:42;65387:1763;;;65283:1867;;;:::o;9014:451::-;9089:13;9115:19;9147:10;9151:6;9147:1;:10;:::i;:::-;:14;;9160:1;9147:14;:::i;:::-;-1:-1:-1;;;;;9137:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9137:25:0;;9115:47;;-1:-1:-1;;;9173:6:0;9180:1;9173:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;9173:15:0;;;;;;;;;-1:-1:-1;;;9199:6:0;9206:1;9199:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;9199:15:0;;;;;;;;-1:-1:-1;9230:9:0;9242:10;9246:6;9242:1;:10;:::i;:::-;:14;;9255:1;9242:14;:::i;:::-;9230:26;;9225:135;9262:1;9258;:5;9225:135;;;-1:-1:-1;;;9310:5:0;9318:3;9310:11;9297:25;;;;;;;:::i;:::-;;;;9285:6;9292:1;9285:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;9285:37:0;;;;;;;;-1:-1:-1;9347:1:0;9337:11;;;;;9265:3;;;:::i;:::-;;;9225:135;;;-1:-1:-1;9378:10:0;;9370:55;;;;-1:-1:-1;;;9370:55:0;;26999:2:1;9370:55:0;;;26981:21:1;;;27018:18;;;27011:30;27077:34;27057:18;;;27050:62;27129:18;;9370:55:0;26797:356:1;18455:239:0;18539:22;18547:4;18553:7;18539;:22::i;:::-;18535:152;;;18610:5;18578:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;18578:29:0;;;;;;;;;;:37;;-1:-1:-1;;18578:37:0;;;18635:40;736:10;;18578:12;;18635:40;;18610:5;18635:40;18455:239;;:::o;26804:158::-;26877:4;26901:53;26909:3;-1:-1:-1;;;;;26929:23:0;;26901:7;:53::i;23165:120::-;23232:7;23259:3;:11;;23271:5;23259:18;;;;;;;;:::i;:::-;;;;;;;;;23252:25;;23165:120;;;;:::o;70486:804::-;70641:4;-1:-1:-1;;;;;70662:13:0;;44579:19;:23;70658:625;;70698:72;;-1:-1:-1;;;70698:72:0;;-1:-1:-1;;;;;70698:36:0;;;;;:72;;736:10;;70749:4;;70755:7;;70764:5;;70698:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70698:72:0;;;;;;;;-1:-1:-1;;70698:72:0;;;;;;;;;;;;:::i;:::-;;;70694:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70944:13:0;;70940:273;;70987:61;;-1:-1:-1;;;70987:61:0;;;;;;;:::i;70940:273::-;71163:6;71157:13;71148:6;71144:2;71140:15;71133:38;70694:534;-1:-1:-1;;;;;;70821:55:0;-1:-1:-1;;;70821:55:0;;-1:-1:-1;70814:62:0;;70658:625;-1:-1:-1;71267:4:0;70486:804;;;;;;:::o;34848:675::-;34931:7;34974:4;34931:7;34989:497;35013:5;:12;35009:1;:16;34989:497;;;35047:20;35070:5;35076:1;35070:8;;;;;;;;:::i;:::-;;;;;;;35047:31;;35113:12;35097;:28;35093:382;;35599:13;35649:15;;;35685:4;35678:15;;;35732:4;35716:21;;35225:57;;35093:382;;;35599:13;35649:15;;;35685:4;35678:15;;;35732:4;35716:21;;35402:57;;35093:382;-1:-1:-1;35027:3:0;;;;:::i;:::-;;;;34989:497;;;-1:-1:-1;35503:12:0;34848:675;-1:-1:-1;;;34848:675:0:o;63208:163::-;63331:32;63337:2;63341:8;63351:5;63358:4;63331:5;:32::i;56566:372::-;56668:4;-1:-1:-1;;;;;;56705:40:0;;-1:-1:-1;;;56705:40:0;;:105;;-1:-1:-1;;;;;;;56762:48:0;;-1:-1:-1;;;56762:48:0;56705:105;:172;;;-1:-1:-1;;;;;;;56827:50:0;;-1:-1:-1;;;56827:50:0;56705:172;:225;;;-1:-1:-1;;;;;;;;;;11168:40:0;;;56894:36;11059:157;20981:1420;21047:4;21186:19;;;:12;;;:19;;;;;;21222:15;;21218:1176;;21597:21;21621:14;21634:1;21621:10;:14;:::i;:::-;21670:18;;21597:38;;-1:-1:-1;21650:17:0;;21670:22;;21691:1;;21670:22;:::i;:::-;21650:42;;21726:13;21713:9;:26;21709:405;;21760:17;21780:3;:11;;21792:9;21780:22;;;;;;;;:::i;:::-;;;;;;;;;21760:42;;21934:9;21905:3;:11;;21917:13;21905:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;22019:23;;;:12;;;:23;;;;;:36;;;21709:405;22195:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;22290:3;:12;;:19;22303:5;22290:19;;;;;;;;;;;22283:26;;;22333:4;22326:11;;;;;;;21218:1176;22377:5;22370:12;;;;;63630:1399;63769:20;63792:12;-1:-1:-1;;;;;63823:16:0;;63815:62;;;;-1:-1:-1;;;63815:62:0;;28240:2:1;63815:62:0;;;28222:21:1;28279:2;28259:18;;;28252:30;28318:34;28298:18;;;28291:62;-1:-1:-1;;;28369:18:1;;;28362:31;28410:19;;63815:62:0;28038:397:1;63815:62:0;64022:21;64030:12;64022:7;:21::i;:::-;64021:22;64013:64;;;;-1:-1:-1;;;64013:64:0;;28642:2:1;64013:64:0;;;28624:21:1;28681:2;28661:18;;;28654:30;28720:31;28700:18;;;28693:59;28769:18;;64013:64:0;28440:353:1;64013:64:0;64107:1;64096:8;:12;64088:65;;;;-1:-1:-1;;;64088:65:0;;29000:2:1;64088:65:0;;;28982:21:1;29039:2;29019:18;;;29012:30;29078:34;29058:18;;;29051:62;-1:-1:-1;;;29129:18:1;;;29122:38;29177:19;;64088:65:0;28798:404:1;64088:65:0;-1:-1:-1;;;;;64240:16:0;;;;;;:12;:16;;;;;:44;;64275:8;;64240:16;:44;;64275:8;;-1:-1:-1;;;;;64240:44:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;64240:44:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;64295:16:0;;-1:-1:-1;64295:16:0;;;:12;:16;;;;;:49;;64335:8;;-1:-1:-1;64295:16:0;;:29;;:49;;64335:8;;64295:49;;;;;:::i;:::-;;;-1:-1:-1;;;;;64295:49:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64357:25:0;;;:11;:25;;;;;:35;;64453:15;64403:66;;;-1:-1:-1;;;64403:66:0;-1:-1:-1;;;;;;64403:66:0;;;-1:-1:-1;;;;;64357:35:0;;64403:66;;;;;;;;64369:12;;-1:-1:-1;64530:381:0;64554:8;64550:1;:12;64530:381;;;64589:38;;64614:12;;-1:-1:-1;;;;;64589:38:0;;;64606:1;;64589:38;;64606:1;;64589:38;64646:4;64642:229;;;64701:59;64732:1;64736:2;64740:12;64754:5;64701:22;:59::i;:::-;64671:184;;;;-1:-1:-1;;;64671:184:0;;;;;;;:::i;:::-;64885:14;;;;:::i;:::-;;;;64564:3;;;;;:::i;:::-;;;;64530:381;;;-1:-1:-1;64923:12:0;:27;;;64961:60;61972:363;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;3055:254::-;3123:6;3131;3184:2;3172:9;3163:7;3159:23;3155:32;3152:52;;;3200:1;3197;3190:12;3152:52;3236:9;3223:23;3213:33;;3265:38;3299:2;3288:9;3284:18;3265:38;:::i;:::-;3255:48;;3055:254;;;;;:::o;3314:160::-;3379:20;;3435:13;;3428:21;3418:32;;3408:60;;3464:1;3461;3454:12;3479:180;3535:6;3588:2;3576:9;3567:7;3563:23;3559:32;3556:52;;;3604:1;3601;3594:12;3556:52;3627:26;3643:9;3627:26;:::i;3664:127::-;3725:10;3720:3;3716:20;3713:1;3706:31;3756:4;3753:1;3746:15;3780:4;3777:1;3770:15;3796:922;3865:6;3918:2;3906:9;3897:7;3893:23;3889:32;3886:52;;;3934:1;3931;3924:12;3886:52;3974:9;3961:23;-1:-1:-1;;;;;4044:2:1;4036:6;4033:14;4030:34;;;4060:1;4057;4050:12;4030:34;4098:6;4087:9;4083:22;4073:32;;4143:7;4136:4;4132:2;4128:13;4124:27;4114:55;;4165:1;4162;4155:12;4114:55;4201:2;4188:16;4223:2;4219;4216:10;4213:36;;;4229:18;;:::i;:::-;4304:2;4298:9;4272:2;4358:13;;-1:-1:-1;;4354:22:1;;;4378:2;4350:31;4346:40;4334:53;;;4402:18;;;4422:22;;;4399:46;4396:72;;;4448:18;;:::i;:::-;4488:10;4484:2;4477:22;4523:2;4515:6;4508:18;4563:7;4558:2;4553;4549;4545:11;4541:20;4538:33;4535:53;;;4584:1;4581;4574:12;4535:53;4640:2;4635;4631;4627:11;4622:2;4614:6;4610:15;4597:46;4685:1;4663:15;;;4680:2;4659:24;4652:35;;;;-1:-1:-1;4667:6:1;3796:922;-1:-1:-1;;;;;3796:922:1:o;4723:270::-;4796:6;4849:2;4837:9;4828:7;4824:23;4820:32;4817:52;;;4865:1;4862;4855:12;4817:52;4904:9;4891:23;4943:1;4936:5;4933:12;4923:40;;4959:1;4956;4949:12;4998:127;5059:10;5054:3;5050:20;5047:1;5040:31;5090:4;5087:1;5080:15;5114:4;5111:1;5104:15;5130:342;5276:2;5261:18;;5309:1;5298:13;;5288:144;;5354:10;5349:3;5345:20;5342:1;5335:31;5389:4;5386:1;5379:15;5417:4;5414:1;5407:15;5288:144;5441:25;;;5130:342;:::o;5477:186::-;5536:6;5589:2;5577:9;5568:7;5564:23;5560:32;5557:52;;;5605:1;5602;5595:12;5557:52;5628:29;5647:9;5628:29;:::i;5668:248::-;5736:6;5744;5797:2;5785:9;5776:7;5772:23;5768:32;5765:52;;;5813:1;5810;5803:12;5765:52;-1:-1:-1;;5836:23:1;;;5906:2;5891:18;;;5878:32;;-1:-1:-1;5668:248:1:o;6174:254::-;6239:6;6247;6300:2;6288:9;6279:7;6275:23;6271:32;6268:52;;;6316:1;6313;6306:12;6268:52;6339:29;6358:9;6339:29;:::i;:::-;6329:39;;6387:35;6418:2;6407:9;6403:18;6387:35;:::i;6433:808::-;6530:6;6538;6546;6554;6562;6615:3;6603:9;6594:7;6590:23;6586:33;6583:53;;;6632:1;6629;6622:12;6583:53;6655:29;6674:9;6655:29;:::i;:::-;6645:39;;6703:38;6737:2;6726:9;6722:18;6703:38;:::i;:::-;6693:48;;6788:2;6777:9;6773:18;6760:32;6750:42;;6843:2;6832:9;6828:18;6815:32;-1:-1:-1;;;;;6907:2:1;6899:6;6896:14;6893:34;;;6923:1;6920;6913:12;6893:34;6961:6;6950:9;6946:22;6936:32;;7006:7;6999:4;6995:2;6991:13;6987:27;6977:55;;7028:1;7025;7018:12;6977:55;7068:2;7055:16;7094:2;7086:6;7083:14;7080:34;;;7110:1;7107;7100:12;7080:34;7155:7;7150:2;7141:6;7137:2;7133:15;7129:24;7126:37;7123:57;;;7176:1;7173;7166:12;7123:57;6433:808;;;;-1:-1:-1;6433:808:1;;-1:-1:-1;7207:2:1;7199:11;;7229:6;6433:808;-1:-1:-1;;;6433:808:1:o;7246:367::-;7309:8;7319:6;7373:3;7366:4;7358:6;7354:17;7350:27;7340:55;;7391:1;7388;7381:12;7340:55;-1:-1:-1;7414:20:1;;-1:-1:-1;;;;;7446:30:1;;7443:50;;;7489:1;7486;7479:12;7443:50;7526:4;7518:6;7514:17;7502:29;;7586:3;7579:4;7569:6;7566:1;7562:14;7554:6;7550:27;7546:38;7543:47;7540:67;;;7603:1;7600;7593:12;7540:67;7246:367;;;;;:::o;7618:505::-;7713:6;7721;7729;7782:2;7770:9;7761:7;7757:23;7753:32;7750:52;;;7798:1;7795;7788:12;7750:52;7834:9;7821:23;7811:33;;7895:2;7884:9;7880:18;7867:32;-1:-1:-1;;;;;7914:6:1;7911:30;7908:50;;;7954:1;7951;7944:12;7908:50;7993:70;8055:7;8046:6;8035:9;8031:22;7993:70;:::i;:::-;7618:505;;8082:8;;-1:-1:-1;7967:96:1;;-1:-1:-1;;;;7618:505:1:o;8128:437::-;8214:6;8222;8275:2;8263:9;8254:7;8250:23;8246:32;8243:52;;;8291:1;8288;8281:12;8243:52;8331:9;8318:23;-1:-1:-1;;;;;8356:6:1;8353:30;8350:50;;;8396:1;8393;8386:12;8350:50;8435:70;8497:7;8488:6;8477:9;8473:22;8435:70;:::i;:::-;8524:8;;8409:96;;-1:-1:-1;8128:437:1;-1:-1:-1;;;;8128:437:1:o;8570:260::-;8638:6;8646;8699:2;8687:9;8678:7;8674:23;8670:32;8667:52;;;8715:1;8712;8705:12;8667:52;8738:29;8757:9;8738:29;:::i;:::-;8728:39;;8786:38;8820:2;8809:9;8805:18;8786:38;:::i;8835:380::-;8914:1;8910:12;;;;8957;;;8978:61;;9032:4;9024:6;9020:17;9010:27;;8978:61;9085:2;9077:6;9074:14;9054:18;9051:38;9048:161;;;9131:10;9126:3;9122:20;9119:1;9112:31;9166:4;9163:1;9156:15;9194:4;9191:1;9184:15;9048:161;;8835:380;;;:::o;10463:127::-;10524:10;10519:3;10515:20;10512:1;10505:31;10555:4;10552:1;10545:15;10579:4;10576:1;10569:15;10595:125;10635:4;10663:1;10660;10657:8;10654:34;;;10668:18;;:::i;:::-;-1:-1:-1;10705:9:1;;10595:125::o;10725:343::-;10927:2;10909:21;;;10966:2;10946:18;;;10939:30;-1:-1:-1;;;11000:2:1;10985:18;;10978:49;11059:2;11044:18;;10725:343::o;11476:135::-;11515:3;-1:-1:-1;;11536:17:1;;11533:43;;;11556:18;;:::i;:::-;-1:-1:-1;11603:1:1;11592:13;;11476:135::o;12447:356::-;12649:2;12631:21;;;12668:18;;;12661:30;12727:34;12722:2;12707:18;;12700:62;12794:2;12779:18;;12447:356::o;17195:404::-;17397:2;17379:21;;;17436:2;17416:18;;;17409:30;17475:34;17470:2;17455:18;;17448:62;-1:-1:-1;;;17541:2:1;17526:18;;17519:38;17589:3;17574:19;;17195:404::o;18241:128::-;18281:3;18312:1;18308:6;18305:1;18302:13;18299:39;;;18318:18;;:::i;:::-;-1:-1:-1;18354:9:1;;18241:128::o;18374:397::-;18576:2;18558:21;;;18615:2;18595:18;;;18588:30;18654:34;18649:2;18634:18;;18627:62;-1:-1:-1;;;18720:2:1;18705:18;;18698:31;18761:3;18746:19;;18374:397::o;19130:168::-;19170:7;19236:1;19232;19228:6;19224:14;19221:1;19218:21;19213:1;19206:9;19199:17;19195:45;19192:71;;;19243:18;;:::i;:::-;-1:-1:-1;19283:9:1;;19130:168::o;19303:402::-;19505:2;19487:21;;;19544:2;19524:18;;;19517:30;19583:34;19578:2;19563:18;;19556:62;-1:-1:-1;;;19649:2:1;19634:18;;19627:36;19695:3;19680:19;;19303:402::o;20126:470::-;20305:3;20343:6;20337:13;20359:53;20405:6;20400:3;20393:4;20385:6;20381:17;20359:53;:::i;:::-;20475:13;;20434:16;;;;20497:57;20475:13;20434:16;20531:4;20519:17;;20497:57;:::i;:::-;20570:20;;20126:470;-1:-1:-1;;;;20126:470:1:o;22117:127::-;22178:10;22173:3;22169:20;22166:1;22159:31;22209:4;22206:1;22199:15;22233:4;22230:1;22223:15;23012:786;23423:25;23418:3;23411:38;23393:3;23478:6;23472:13;23494:62;23549:6;23544:2;23539:3;23535:12;23528:4;23520:6;23516:17;23494:62;:::i;:::-;-1:-1:-1;;;23615:2:1;23575:16;;;23607:11;;;23600:40;23665:13;;23687:63;23665:13;23736:2;23728:11;;23721:4;23709:17;;23687:63;:::i;:::-;23770:17;23789:2;23766:26;;23012:786;-1:-1:-1;;;;23012:786:1:o;24214:136::-;24253:3;24281:5;24271:39;;24290:18;;:::i;:::-;-1:-1:-1;;;24326:18:1;;24214:136::o;24771:415::-;24973:2;24955:21;;;25012:2;24992:18;;;24985:30;25051:34;25046:2;25031:18;;25024:62;-1:-1:-1;;;25117:2:1;25102:18;;25095:49;25176:3;25161:19;;24771:415::o;25191:127::-;25252:10;25247:3;25243:20;25240:1;25233:31;25283:4;25280:1;25273:15;25307:4;25304:1;25297:15;25323:120;25363:1;25389;25379:35;;25394:18;;:::i;:::-;-1:-1:-1;25428:9:1;;25323:120::o;25448:112::-;25480:1;25506;25496:35;;25511:18;;:::i;:::-;-1:-1:-1;25545:9:1;;25448:112::o;27158:489::-;-1:-1:-1;;;;;27427:15:1;;;27409:34;;27479:15;;27474:2;27459:18;;27452:43;27526:2;27511:18;;27504:34;;;27574:3;27569:2;27554:18;;27547:31;;;27352:4;;27595:46;;27621:19;;27613:6;27595:46;:::i;:::-;27587:54;27158:489;-1:-1:-1;;;;;;27158:489:1:o;27652:249::-;27721:6;27774:2;27762:9;27753:7;27749:23;27745:32;27742:52;;;27790:1;27787;27780:12;27742:52;27822:9;27816:16;27841:30;27865:5;27841:30;:::i;27906:127::-;27967:10;27962:3;27958:20;27955:1;27948:31;27998:4;27995:1;27988:15;28022:4;28019:1;28012:15;29207:236;29246:3;-1:-1:-1;;;;;29319:2:1;29316:1;29312:10;29349:2;29346:1;29342:10;29380:3;29376:2;29372:12;29367:3;29364:21;29361:47;;;29388:18;;:::i

Swarm Source

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