ETH Price: $3,166.79 (+2.23%)

Token

Project Mayhem NFTs (PMN)
 

Overview

Max Total Supply

3,819 PMN

Holders

38

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x03c65fdbff50d9032b7161cf65e6b10dad736692
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
ERC1155Base

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-07-16
*/

// SPDX-License-Identifier: MIT
// File: @thirdweb-dev/contracts/lib/TWStrings.sol

pragma solidity ^0.8.0;

/// @author thirdweb

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

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

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

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

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

// File: @thirdweb-dev/contracts/extension/interface/IOperatorFilterToggle.sol


pragma solidity ^0.8.0;

/// @author thirdweb

interface IOperatorFilterToggle {
    event OperatorRestriction(bool restriction);

    function operatorRestriction() external view returns (bool);

    function setOperatorRestriction(bool restriction) external;
}

// File: @thirdweb-dev/contracts/extension/OperatorFilterToggle.sol


pragma solidity ^0.8.0;

/// @author thirdweb


abstract contract OperatorFilterToggle is IOperatorFilterToggle {
    bool public operatorRestriction;

    function setOperatorRestriction(bool _restriction) external {
        require(_canSetOperatorRestriction(), "Not authorized to set operator restriction.");
        _setOperatorRestriction(_restriction);
    }

    function _setOperatorRestriction(bool _restriction) internal {
        operatorRestriction = _restriction;
        emit OperatorRestriction(_restriction);
    }

    function _canSetOperatorRestriction() internal virtual returns (bool);
}

// File: @thirdweb-dev/contracts/extension/interface/IOperatorFilterRegistry.sol


pragma solidity ^0.8.0;

/// @author thirdweb

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);

    function register(address registrant) external;

    function registerAndSubscribe(address registrant, address subscription) external;

    function registerAndCopyEntries(address registrant, address registrantToCopy) external;

    function unregister(address addr) external;

    function updateOperator(
        address registrant,
        address operator,
        bool filtered
    ) external;

    function updateOperators(
        address registrant,
        address[] calldata operators,
        bool filtered
    ) external;

    function updateCodeHash(
        address registrant,
        bytes32 codehash,
        bool filtered
    ) external;

    function updateCodeHashes(
        address registrant,
        bytes32[] calldata codeHashes,
        bool filtered
    ) external;

    function subscribe(address registrant, address registrantToSubscribe) external;

    function unsubscribe(address registrant, bool copyExistingEntries) external;

    function subscriptionOf(address addr) external returns (address registrant);

    function subscribers(address registrant) external returns (address[] memory);

    function subscriberAt(address registrant, uint256 index) external returns (address);

    function copyEntriesOf(address registrant, address registrantToCopy) external;

    function isOperatorFiltered(address registrant, address operator) external returns (bool);

    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);

    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);

    function filteredOperators(address addr) external returns (address[] memory);

    function filteredCodeHashes(address addr) external returns (bytes32[] memory);

    function filteredOperatorAt(address registrant, uint256 index) external returns (address);

    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);

    function isRegistered(address addr) external returns (bool);

    function codeHashOf(address addr) external returns (bytes32);
}

// File: @thirdweb-dev/contracts/extension/OperatorFilterer.sol


pragma solidity ^0.8.0;

/// @author thirdweb



/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */

abstract contract OperatorFilterer is OperatorFilterToggle {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        _register(subscriptionOrRegistrantToCopy, subscribe);
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (operatorRestriction) {
            if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
                if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                    revert OperatorNotAllowed(operator);
                }
            }
        }
    }

    function _register(address subscriptionOrRegistrantToCopy, bool subscribe) internal {
        // Is the registry deployed?
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Is the subscription contract deployed?
            if (address(subscriptionOrRegistrantToCopy).code.length > 0) {
                // Do we want to subscribe?
                if (subscribe) {
                    OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                }
            } else {
                OPERATOR_FILTER_REGISTRY.register(address(this));
            }
        }
    }
}

// File: @thirdweb-dev/contracts/extension/DefaultOperatorFilterer.sol


pragma solidity ^0.8.0;

/// @author thirdweb


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}

    function subscribeToRegistry(address _subscription) external {
        require(_canSetOperatorRestriction(), "Not authorized to subscribe to registry.");
        _register(_subscription, true);
    }
}

// File: @thirdweb-dev/contracts/extension/BatchMintMetadata.sol


pragma solidity ^0.8.0;

/// @author thirdweb

/**
 *  @title   Batch-mint Metadata
 *  @notice  The `BatchMintMetadata` is a contract extension for any base NFT contract. It lets the smart contract
 *           using this extension set metadata for `n` number of NFTs all at once. This is enabled by storing a single
 *           base URI for a batch of `n` NFTs, where the metadata for each NFT in a relevant batch is `baseURI/tokenId`.
 */

contract BatchMintMetadata {
    /// @dev Largest tokenId of each batch of tokens with the same baseURI.
    uint256[] private batchIds;

    /// @dev Mapping from id of a batch of tokens => to base URI for the respective batch of tokens.
    mapping(uint256 => string) private baseURI;

    /**
     *  @notice         Returns the count of batches of NFTs.
     *  @dev            Each batch of tokens has an in ID and an associated `baseURI`.
     *                  See {batchIds}.
     */
    function getBaseURICount() public view returns (uint256) {
        return batchIds.length;
    }

    /**
     *  @notice         Returns the ID for the batch of tokens the given tokenId belongs to.
     *  @dev            See {getBaseURICount}.
     *  @param _index   ID of a token.
     */
    function getBatchIdAtIndex(uint256 _index) public view returns (uint256) {
        if (_index >= getBaseURICount()) {
            revert("Invalid index");
        }
        return batchIds[_index];
    }

    /// @dev Returns the id for the batch of tokens the given tokenId belongs to.
    function _getBatchId(uint256 _tokenId) internal view returns (uint256 batchId, uint256 index) {
        uint256 numOfTokenBatches = getBaseURICount();
        uint256[] memory indices = batchIds;

        for (uint256 i = 0; i < numOfTokenBatches; i += 1) {
            if (_tokenId < indices[i]) {
                index = i;
                batchId = indices[i];

                return (batchId, index);
            }
        }

        revert("Invalid tokenId");
    }

    /// @dev Returns the baseURI for a token. The intended metadata URI for the token is baseURI + tokenId.
    function _getBaseURI(uint256 _tokenId) internal view returns (string memory) {
        uint256 numOfTokenBatches = getBaseURICount();
        uint256[] memory indices = batchIds;

        for (uint256 i = 0; i < numOfTokenBatches; i += 1) {
            if (_tokenId < indices[i]) {
                return baseURI[indices[i]];
            }
        }
        revert("Invalid tokenId");
    }

    /// @dev Sets the base URI for the batch of tokens with the given batchId.
    function _setBaseURI(uint256 _batchId, string memory _baseURI) internal {
        baseURI[_batchId] = _baseURI;
    }

    /// @dev Mints a batch of tokenIds and associates a common baseURI to all those Ids.
    function _batchMintMetadata(
        uint256 _startId,
        uint256 _amountToMint,
        string memory _baseURIForTokens
    ) internal returns (uint256 nextTokenIdToMint, uint256 batchId) {
        batchId = _startId + _amountToMint;
        nextTokenIdToMint = batchId;

        batchIds.push(batchId);

        baseURI[batchId] = _baseURIForTokens;
    }
}

// File: @thirdweb-dev/contracts/extension/interface/IOwnable.sol


pragma solidity ^0.8.0;

/// @author thirdweb

/**
 *  Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading
 *  who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses
 *  information about who the contract's owner is.
 */

interface IOwnable {
    /// @dev Returns the owner of the contract.
    function owner() external view returns (address);

    /// @dev Lets a module admin set a new owner for the contract. The new owner must be a module admin.
    function setOwner(address _newOwner) external;

    /// @dev Emitted when a new Owner is set.
    event OwnerUpdated(address indexed prevOwner, address indexed newOwner);
}

// File: @thirdweb-dev/contracts/extension/Ownable.sol


pragma solidity ^0.8.0;

/// @author thirdweb


/**
 *  @title   Ownable
 *  @notice  Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading
 *           who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses
 *           information about who the contract's owner is.
 */

abstract contract Ownable is IOwnable {
    /// @dev Owner of the contract (purpose: OpenSea compatibility)
    address private _owner;

    /// @dev Reverts if caller is not the owner.
    modifier onlyOwner() {
        if (msg.sender != _owner) {
            revert("Not authorized");
        }
        _;
    }

    /**
     *  @notice Returns the owner of the contract.
     */
    function owner() public view override returns (address) {
        return _owner;
    }

    /**
     *  @notice Lets an authorized wallet set a new owner for the contract.
     *  @param _newOwner The address to set as the new owner of the contract.
     */
    function setOwner(address _newOwner) external override {
        if (!_canSetOwner()) {
            revert("Not authorized");
        }
        _setupOwner(_newOwner);
    }

    /// @dev Lets a contract admin set a new owner for the contract. The new owner must be a contract admin.
    function _setupOwner(address _newOwner) internal {
        address _prevOwner = _owner;
        _owner = _newOwner;

        emit OwnerUpdated(_prevOwner, _newOwner);
    }

    /// @dev Returns whether owner can be set in the given execution context.
    function _canSetOwner() internal view virtual returns (bool);
}

// File: @thirdweb-dev/contracts/extension/interface/IMulticall.sol


pragma solidity ^0.8.0;

/// @author thirdweb

/**
 * @dev Provides a function to batch together multiple calls in a single external call.
 *
 * _Available since v4.1._
 */
interface IMulticall {
    /**
     * @dev Receives and executes a batch of function calls on this contract.
     */
    function multicall(bytes[] calldata data) external returns (bytes[] memory results);
}

// File: @thirdweb-dev/contracts/lib/TWAddress.sol


pragma solidity ^0.8.0;

/// @author thirdweb

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @thirdweb-dev/contracts/extension/Multicall.sol


pragma solidity ^0.8.0;

/// @author thirdweb



/**
 * @dev Provides a function to batch together multiple calls in a single external call.
 *
 * _Available since v4.1._
 */
contract Multicall is IMulticall {
    /**
     *  @notice Receives and executes a batch of function calls on this contract.
     *  @dev Receives and executes a batch of function calls on this contract.
     *
     *  @param data The bytes data that makes up the batch of function calls to execute.
     *  @return results The bytes data that makes up the result of the batch of function calls executed.
     */
    function multicall(bytes[] calldata data) external virtual override returns (bytes[] memory results) {
        results = new bytes[](data.length);
        for (uint256 i = 0; i < data.length; i++) {
            results[i] = TWAddress.functionDelegateCall(address(this), data[i]);
        }
        return results;
    }
}

// File: @thirdweb-dev/contracts/extension/interface/IContractMetadata.sol


pragma solidity ^0.8.0;

/// @author thirdweb

/**
 *  Thirdweb's `ContractMetadata` is a contract extension for any base contracts. It lets you set a metadata URI
 *  for you contract.
 *
 *  Additionally, `ContractMetadata` is necessary for NFT contracts that want royalties to get distributed on OpenSea.
 */

interface IContractMetadata {
    /// @dev Returns the metadata URI of the contract.
    function contractURI() external view returns (string memory);

    /**
     *  @dev Sets contract URI for the storefront-level metadata of the contract.
     *       Only module admin can call this function.
     */
    function setContractURI(string calldata _uri) external;

    /// @dev Emitted when the contract URI is updated.
    event ContractURIUpdated(string prevURI, string newURI);
}

// File: @thirdweb-dev/contracts/extension/ContractMetadata.sol


pragma solidity ^0.8.0;

/// @author thirdweb


/**
 *  @title   Contract Metadata
 *  @notice  Thirdweb's `ContractMetadata` is a contract extension for any base contracts. It lets you set a metadata URI
 *           for you contract.
 *           Additionally, `ContractMetadata` is necessary for NFT contracts that want royalties to get distributed on OpenSea.
 */

abstract contract ContractMetadata is IContractMetadata {
    /// @notice Returns the contract metadata URI.
    string public override contractURI;

    /**
     *  @notice         Lets a contract admin set the URI for contract-level metadata.
     *  @dev            Caller should be authorized to setup contractURI, e.g. contract admin.
     *                  See {_canSetContractURI}.
     *                  Emits {ContractURIUpdated Event}.
     *
     *  @param _uri     keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE")
     */
    function setContractURI(string memory _uri) external override {
        if (!_canSetContractURI()) {
            revert("Not authorized");
        }

        _setupContractURI(_uri);
    }

    /// @dev Lets a contract admin set the URI for contract-level metadata.
    function _setupContractURI(string memory _uri) internal {
        string memory prevURI = contractURI;
        contractURI = _uri;

        emit ContractURIUpdated(prevURI, _uri);
    }

    /// @dev Returns whether contract metadata can be set in the given execution context.
    function _canSetContractURI() internal view virtual returns (bool);
}

// File: @thirdweb-dev/contracts/eip/interface/IERC165.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * [EIP](https://eips.ethereum.org/EIPS/eip-165).
 *
 * 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
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @thirdweb-dev/contracts/eip/interface/IERC2981.sol


pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be payed in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @thirdweb-dev/contracts/extension/interface/IRoyalty.sol


pragma solidity ^0.8.0;

/// @author thirdweb


/**
 *  Thirdweb's `Royalty` is a contract extension to be used with any base contract. It exposes functions for setting and reading
 *  the recipient of royalty fee and the royalty fee basis points, and lets the inheriting contract perform conditional logic
 *  that uses information about royalty fees, if desired.
 *
 *  The `Royalty` contract is ERC2981 compliant.
 */

interface IRoyalty is IERC2981 {
    struct RoyaltyInfo {
        address recipient;
        uint256 bps;
    }

    /// @dev Returns the royalty recipient and fee bps.
    function getDefaultRoyaltyInfo() external view returns (address, uint16);

    /// @dev Lets a module admin update the royalty bps and recipient.
    function setDefaultRoyaltyInfo(address _royaltyRecipient, uint256 _royaltyBps) external;

    /// @dev Lets a module admin set the royalty recipient for a particular token Id.
    function setRoyaltyInfoForToken(
        uint256 tokenId,
        address recipient,
        uint256 bps
    ) external;

    /// @dev Returns the royalty recipient for a particular token Id.
    function getRoyaltyInfoForToken(uint256 tokenId) external view returns (address, uint16);

    /// @dev Emitted when royalty info is updated.
    event DefaultRoyalty(address indexed newRoyaltyRecipient, uint256 newRoyaltyBps);

    /// @dev Emitted when royalty recipient for tokenId is set
    event RoyaltyForToken(uint256 indexed tokenId, address indexed royaltyRecipient, uint256 royaltyBps);
}

// File: @thirdweb-dev/contracts/extension/Royalty.sol


pragma solidity ^0.8.0;

/// @author thirdweb


/**
 *  @title   Royalty
 *  @notice  Thirdweb's `Royalty` is a contract extension to be used with any base contract. It exposes functions for setting and reading
 *           the recipient of royalty fee and the royalty fee basis points, and lets the inheriting contract perform conditional logic
 *           that uses information about royalty fees, if desired.
 *
 *  @dev     The `Royalty` contract is ERC2981 compliant.
 */

abstract contract Royalty is IRoyalty {
    /// @dev The (default) address that receives all royalty value.
    address private royaltyRecipient;

    /// @dev The (default) % of a sale to take as royalty (in basis points).
    uint16 private royaltyBps;

    /// @dev Token ID => royalty recipient and bps for token
    mapping(uint256 => RoyaltyInfo) private royaltyInfoForToken;

    /**
     *  @notice   View royalty info for a given token and sale price.
     *  @dev      Returns royalty amount and recipient for `tokenId` and `salePrice`.
     *  @param tokenId          The tokenID of the NFT for which to query royalty info.
     *  @param salePrice        Sale price of the token.
     *
     *  @return receiver        Address of royalty recipient account.
     *  @return royaltyAmount   Royalty amount calculated at current royaltyBps value.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        virtual
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        (address recipient, uint256 bps) = getRoyaltyInfoForToken(tokenId);
        receiver = recipient;
        royaltyAmount = (salePrice * bps) / 10_000;
    }

    /**
     *  @notice          View royalty info for a given token.
     *  @dev             Returns royalty recipient and bps for `_tokenId`.
     *  @param _tokenId  The tokenID of the NFT for which to query royalty info.
     */
    function getRoyaltyInfoForToken(uint256 _tokenId) public view override returns (address, uint16) {
        RoyaltyInfo memory royaltyForToken = royaltyInfoForToken[_tokenId];

        return
            royaltyForToken.recipient == address(0)
                ? (royaltyRecipient, uint16(royaltyBps))
                : (royaltyForToken.recipient, uint16(royaltyForToken.bps));
    }

    /**
     *  @notice Returns the defualt royalty recipient and BPS for this contract's NFTs.
     */
    function getDefaultRoyaltyInfo() external view override returns (address, uint16) {
        return (royaltyRecipient, uint16(royaltyBps));
    }

    /**
     *  @notice         Updates default royalty recipient and bps.
     *  @dev            Caller should be authorized to set royalty info.
     *                  See {_canSetRoyaltyInfo}.
     *                  Emits {DefaultRoyalty Event}; See {_setupDefaultRoyaltyInfo}.
     *
     *  @param _royaltyRecipient   Address to be set as default royalty recipient.
     *  @param _royaltyBps         Updated royalty bps.
     */
    function setDefaultRoyaltyInfo(address _royaltyRecipient, uint256 _royaltyBps) external override {
        if (!_canSetRoyaltyInfo()) {
            revert("Not authorized");
        }

        _setupDefaultRoyaltyInfo(_royaltyRecipient, _royaltyBps);
    }

    /// @dev Lets a contract admin update the default royalty recipient and bps.
    function _setupDefaultRoyaltyInfo(address _royaltyRecipient, uint256 _royaltyBps) internal {
        if (_royaltyBps > 10_000) {
            revert("Exceeds max bps");
        }

        royaltyRecipient = _royaltyRecipient;
        royaltyBps = uint16(_royaltyBps);

        emit DefaultRoyalty(_royaltyRecipient, _royaltyBps);
    }

    /**
     *  @notice         Updates default royalty recipient and bps for a particular token.
     *  @dev            Sets royalty info for `_tokenId`. Caller should be authorized to set royalty info.
     *                  See {_canSetRoyaltyInfo}.
     *                  Emits {RoyaltyForToken Event}; See {_setupRoyaltyInfoForToken}.
     *
     *  @param _recipient   Address to be set as royalty recipient for given token Id.
     *  @param _bps         Updated royalty bps for the token Id.
     */
    function setRoyaltyInfoForToken(
        uint256 _tokenId,
        address _recipient,
        uint256 _bps
    ) external override {
        if (!_canSetRoyaltyInfo()) {
            revert("Not authorized");
        }

        _setupRoyaltyInfoForToken(_tokenId, _recipient, _bps);
    }

    /// @dev Lets a contract admin set the royalty recipient and bps for a particular token Id.
    function _setupRoyaltyInfoForToken(
        uint256 _tokenId,
        address _recipient,
        uint256 _bps
    ) internal {
        if (_bps > 10_000) {
            revert("Exceeds max bps");
        }

        royaltyInfoForToken[_tokenId] = RoyaltyInfo({ recipient: _recipient, bps: _bps });

        emit RoyaltyForToken(_tokenId, _recipient, _bps);
    }

    /// @dev Returns whether royalty info can be set in the given execution context.
    function _canSetRoyaltyInfo() internal view virtual returns (bool);
}

// File: @thirdweb-dev/contracts/eip/interface/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @thirdweb-dev/contracts/eip/interface/IERC1155Metadata.sol


pragma solidity ^0.8.0;

/**
    Note: The ERC-165 identifier for this interface is 0x0e89341c.
*/
interface IERC1155Metadata {
    /**
        @notice A distinct Uniform Resource Identifier (URI) for a given token.
        @dev URIs are defined in RFC 3986.
        The URI may point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
        @return URI string
    */
    function uri(uint256 _id) external view returns (string memory);
}

// File: @thirdweb-dev/contracts/eip/interface/IERC1155.sol


pragma solidity ^0.8.0;

/**
    @title ERC-1155 Multi Token Standard
    @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md
    Note: The ERC-165 identifier for this interface is 0xd9b67a26.
 */
interface IERC1155 {
    /**
        @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
        The `_operator` argument MUST be msg.sender.
        The `_from` argument MUST be the address of the holder whose balance is decreased.
        The `_to` argument MUST be the address of the recipient whose balance is increased.
        The `_id` argument MUST be the token type being transferred.
        The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by.
        When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
        When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
    */
    event TransferSingle(
        address indexed _operator,
        address indexed _from,
        address indexed _to,
        uint256 _id,
        uint256 _value
    );

    /**
        @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
        The `_operator` argument MUST be msg.sender.
        The `_from` argument MUST be the address of the holder whose balance is decreased.
        The `_to` argument MUST be the address of the recipient whose balance is increased.
        The `_ids` argument MUST be the list of tokens being transferred.
        The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by.
        When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
        When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
    */
    event TransferBatch(
        address indexed _operator,
        address indexed _from,
        address indexed _to,
        uint256[] _ids,
        uint256[] _values
    );

    /**
        @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absense of an event assumes disabled).
    */
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /**
        @dev MUST emit when the URI is updated for a token ID.
        URIs are defined in RFC 3986.
        The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
    */
    event URI(string _value, uint256 indexed _id);

    /**
        @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        MUST revert if `_to` is the zero address.
        MUST revert if balance of holder for token `_id` is lower than the `_value` sent.
        MUST revert on any other error.
        MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
        After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param _from    Source address
        @param _to      Target address
        @param _id      ID of the token type
        @param _value   Transfer amount
        @param _data    Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`
    */
    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes calldata _data
    ) external;

    /**
        @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        MUST revert if `_to` is the zero address.
        MUST revert if length of `_ids` is not the same as length of `_values`.
        MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient.
        MUST revert on any other error.
        MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard).
        Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc).
        After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param _from    Source address
        @param _to      Target address
        @param _ids     IDs of each token type (order and length must match _values array)
        @param _values  Transfer amounts per token type (order and length must match _ids array)
        @param _data    Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to`
    */
    function safeBatchTransferFrom(
        address _from,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data
    ) external;

    /**
        @notice Get the balance of an account's Tokens.
        @param _owner  The address of the token holder
        @param _id     ID of the Token
        @return        The _owner's balance of the Token type requested
     */
    function balanceOf(address _owner, uint256 _id) external view returns (uint256);

    /**
        @notice Get the balance of multiple account/token pairs
        @param _owners The addresses of the token holders
        @param _ids    ID of the Tokens
        @return        The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)
     */
    function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)
        external
        view
        returns (uint256[] memory);

    /**
        @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
        @dev MUST emit the ApprovalForAll event on success.
        @param _operator  Address to add to the set of authorized operators
        @param _approved  True if the operator is approved, false to revoke approval
    */
    function setApprovalForAll(address _operator, bool _approved) external;

    /**
        @notice Queries the approval status of an operator for a given owner.
        @param _owner     The owner of the Tokens
        @param _operator  Address of authorized operator
        @return           True if the operator is approved, false if not
    */
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

// File: @thirdweb-dev/contracts/eip/ERC1155.sol


pragma solidity ^0.8.0;




contract ERC1155 is IERC1155, IERC1155Metadata {
    /*//////////////////////////////////////////////////////////////
                        State variables
    //////////////////////////////////////////////////////////////*/

    string public name;
    string public symbol;

    /*//////////////////////////////////////////////////////////////
                            Mappings
    //////////////////////////////////////////////////////////////*/

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

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

    mapping(uint256 => string) internal _uri;

    /*//////////////////////////////////////////////////////////////
                            Constructor
    //////////////////////////////////////////////////////////////*/

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

    /*//////////////////////////////////////////////////////////////
                            View functions
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155
            interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI
    }

    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        return _uri[tokenId];
    }

    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "LENGTH_MISMATCH");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf[accounts[i]][ids[i]];
        }

        return batchBalances;
    }

    /*//////////////////////////////////////////////////////////////
                            ERC1155 logic
    //////////////////////////////////////////////////////////////*/

    function setApprovalForAll(address operator, bool approved) public virtual override {
        address owner = msg.sender;
        require(owner != operator, "APPROVING_SELF");
        isApprovedForAll[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(from == msg.sender || isApprovedForAll[from][msg.sender], "!OWNER_OR_APPROVED");
        _safeTransferFrom(from, to, id, amount, data);
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(from == msg.sender || isApprovedForAll[from][msg.sender], "!OWNER_OR_APPROVED");
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /*//////////////////////////////////////////////////////////////
                            Internal logic
    //////////////////////////////////////////////////////////////*/

    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "TO_ZERO_ADDR");

        address operator = msg.sender;

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = balanceOf[from][id];
        require(fromBalance >= amount, "INSUFFICIENT_BAL");
        unchecked {
            balanceOf[from][id] = fromBalance - amount;
        }
        balanceOf[to][id] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "LENGTH_MISMATCH");
        require(to != address(0), "TO_ZERO_ADDR");

        address operator = msg.sender;

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = balanceOf[from][id];
            require(fromBalance >= amount, "INSUFFICIENT_BAL");
            unchecked {
                balanceOf[from][id] = fromBalance - amount;
            }
            balanceOf[to][id] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    function _setTokenURI(uint256 tokenId, string memory newuri) internal virtual {
        _uri[tokenId] = newuri;
    }

    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "TO_ZERO_ADDR");

        address operator = msg.sender;

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        balanceOf[to][id] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "TO_ZERO_ADDR");
        require(ids.length == amounts.length, "LENGTH_MISMATCH");

        address operator = msg.sender;

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            balanceOf[to][ids[i]] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "FROM_ZERO_ADDR");

        address operator = msg.sender;

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = balanceOf[from][id];
        require(fromBalance >= amount, "INSUFFICIENT_BAL");
        unchecked {
            balanceOf[from][id] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "FROM_ZERO_ADDR");
        require(ids.length == amounts.length, "LENGTH_MISMATCH");

        address operator = msg.sender;

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = balanceOf[from][id];
            require(fromBalance >= amount, "INSUFFICIENT_BAL");
            unchecked {
                balanceOf[from][id] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.code.length > 0) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("TOKENS_REJECTED");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("!ERC1155RECEIVER");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.code.length > 0) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("TOKENS_REJECTED");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("!ERC1155RECEIVER");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @thirdweb-dev/contracts/base/ERC1155Base.sol


pragma solidity ^0.8.0;
pragma experimental ABIEncoderV2;
/// @author thirdweb

/**
 *  The `ERC1155Base` smart contract implements the ERC1155 NFT standard.
 *  It includes the following additions to standard ERC1155 logic:
 *
 *      - Ability to mint NFTs via the provided `mintTo` and `batchMintTo` functions.
 *
 *      - Contract metadata for royalty support on platforms such as OpenSea that use
 *        off-chain information to distribute roaylties.
 *
 *      - Ownership of the contract, with the ability to restrict certain functions to
 *        only be called by the contract's owner.
 *
 *      - Multicall capability to perform multiple actions atomically
 *
 *      - EIP 2981 compliance for royalty support on NFT marketplaces.
 */

interface IEnactMayhem {
    function setBuyFeeAndCollectionAddress(uint256 _marketingFee, address collectionAddress) external;
    function setSellFeeAndCollectionAddress(uint256 newFee, address collectionAddress) external;
    function setBuyFee(uint256 newFee) external;
    function setSellFee(uint256 newFee) external;
    function setCollectionAddress(address collectionAddress) external;
    function setLiqBuyFee(uint256 newFee) external;
    function setLiqSellFee(uint256 newFee) external;
    function setBuyBuyBackFee(uint256 newFee) external;
    function setSellBuyBackFee(uint256 newFee) external;
    function killdozer(uint256 buyMarketing, uint256 sellMarketing, uint256 buyLiquidity, uint256 sellLiquidity, uint256 buyBuyBack, uint256 sellBuyBack) external;
}


contract ERC1155Base is
    ERC1155,
    ContractMetadata,
    Ownable,
    Royalty,
    Multicall,
    BatchMintMetadata,
    DefaultOperatorFilterer
{
    using TWStrings for uint256;

    /*//////////////////////////////////////////////////////////////
                        State variables
    //////////////////////////////////////////////////////////////*/

    /// @dev The tokenId of the next NFT to mint.
    uint256 internal nextTokenIdToMint_;

    /*//////////////////////////////////////////////////////////////
                        Mappings
    //////////////////////////////////////////////////////////////*/

    /**
     *  @notice Returns the total supply of NFTs of a given tokenId
     *  @dev Mapping from tokenId => total circulating supply of NFTs of that tokenId.
     */
    mapping(uint256 => uint256) public totalSupply;

    /*//////////////////////////////////////////////////////////////
                            Constructor
    //////////////////////////////////////////////////////////////*/


    address public erc20Contract;
    uint256 public buyFee;
    uint256 public sellFee;
    uint256 public buyLiq;
    uint256 public sellLiq;
    uint256 public buyBuyBack;
    uint256 public sellBuyBack;
    address public feeCollectionAddress;

    constructor(
        string memory _name,
        string memory _symbol,
        address _royaltyRecipient,
        uint128 _royaltyBps,
        address _erc20Contract
    ) ERC1155(_name, _symbol) {
        _setupOwner(msg.sender);
        _setupDefaultRoyaltyInfo(_royaltyRecipient, _royaltyBps);
        _setOperatorRestriction(true);
        erc20Contract = _erc20Contract;
    }

    /*//////////////////////////////////////////////////////////////
                    Overriden metadata logic
    //////////////////////////////////////////////////////////////*/

    /// @notice Returns the metadata URI for the given tokenId.
    function uri(uint256 _tokenId) public view virtual override returns (string memory) {
        string memory uriForToken = _uri[_tokenId];
        if (bytes(uriForToken).length > 0) {
            return uriForToken;
        }

        string memory batchUri = _getBaseURI(_tokenId);
        return string(abi.encodePacked(batchUri, _tokenId.toString()));
    }

    /*//////////////////////////////////////////////////////////////
                        Mint / burn logic
    //////////////////////////////////////////////////////////////*/

    /**
     *  @notice          Lets an authorized address mint NFTs to a recipient.
     *  @dev             - The logic in the `_canMint` function determines whether the caller is authorized to mint NFTs.
     *                   - If `_tokenId == type(uint256).max` a new NFT at tokenId `nextTokenIdToMint` is minted. If the given
     *                     `tokenId < nextTokenIdToMint`, then additional supply of an existing NFT is being minted.
     *
     *  @param _to       The recipient of the NFTs to mint.
     *  @param _tokenId  The tokenId of the NFT to mint.
     *  @param _tokenURI The full metadata URI for the NFTs minted (if a new NFT is being minted).
     *  @param _amount   The amount of the same NFT to mint.
     */
    function mintTo(
        address _to,
        uint256 _tokenId,
        string memory _tokenURI,
        uint256 _amount
    ) public virtual {
        require(_canMint(), "Not authorized to mint.");

        uint256 tokenIdToMint;
        uint256 nextIdToMint = nextTokenIdToMint();

        if (_tokenId == type(uint256).max) {
            tokenIdToMint = nextIdToMint;
            nextTokenIdToMint_ += 1;
            _setTokenURI(nextIdToMint, _tokenURI);
        } else {
            require(_tokenId < nextIdToMint, "invalid id");
            tokenIdToMint = _tokenId;
        }

        _mint(_to, tokenIdToMint, _amount, "");
    }

    /**
     *  @notice          Lets an authorized address mint multiple NEW NFTs at once to a recipient.
     *  @dev             The logic in the `_canMint` function determines whether the caller is authorized to mint NFTs.
     *                   If `_tokenIds[i] == type(uint256).max` a new NFT at tokenId `nextTokenIdToMint` is minted. If the given
     *                   `tokenIds[i] < nextTokenIdToMint`, then additional supply of an existing NFT is minted.
     *                   The metadata for each new NFT is stored at `baseURI/{tokenID of NFT}`
     *
     *  @param _to       The recipient of the NFT to mint.
     *  @param _tokenIds The tokenIds of the NFTs to mint.
     *  @param _amounts  The amounts of each NFT to mint.
     *  @param _baseURI  The baseURI for the `n` number of NFTs minted. The metadata for each NFT is `baseURI/tokenId`
     */
    function batchMintTo(
        address _to,
        uint256[] memory _tokenIds,
        uint256[] memory _amounts,
        string memory _baseURI
    ) public virtual {
        require(_canMint(), "Not authorized to mint.");
        require(_amounts.length > 0, "Minting zero tokens.");
        require(_tokenIds.length == _amounts.length, "Length mismatch.");

        uint256 nextIdToMint = nextTokenIdToMint();
        uint256 startNextIdToMint = nextIdToMint;

        uint256 numOfNewNFTs;

        for (uint256 i = 0; i < _tokenIds.length; i += 1) {
            if (_tokenIds[i] == type(uint256).max) {
                _tokenIds[i] = nextIdToMint;

                nextIdToMint += 1;
                numOfNewNFTs += 1;
            } else {
                require(_tokenIds[i] < nextIdToMint, "invalid id");
            }
        }

        if (numOfNewNFTs > 0) {
            _batchMintMetadata(startNextIdToMint, numOfNewNFTs, _baseURI);
        }

        nextTokenIdToMint_ = nextIdToMint;
        _mintBatch(_to, _tokenIds, _amounts, "");
    }

    /**
     *  @notice         Lets an owner or approved operator burn NFTs of the given tokenId.
     *
     *  @param _owner   The owner of the NFT to burn.
     *  @param _tokenId The tokenId of the NFT to burn.
     *  @param _amount  The amount of the NFT to burn.
     */
    function burn(
        address _owner,
        uint256 _tokenId,
        uint256 _amount
    ) external virtual {
        address caller = msg.sender;

        require(caller == _owner || isApprovedForAll[_owner][caller], "Unapproved caller");
        require(balanceOf[_owner][_tokenId] >= _amount, "Not enough tokens owned");

        _burn(_owner, _tokenId, _amount);
    }

    /**
     *  @notice         Lets an owner or approved operator burn NFTs of the given tokenIds.
     *
     *  @param _owner    The owner of the NFTs to burn.
     *  @param _tokenIds The tokenIds of the NFTs to burn.
     *  @param _amounts  The amounts of the NFTs to burn.
     */
    function burnBatch(
        address _owner,
        uint256[] memory _tokenIds,
        uint256[] memory _amounts
    ) external virtual {
        address caller = msg.sender;

        require(caller == _owner || isApprovedForAll[_owner][caller], "Unapproved caller");
        require(_tokenIds.length == _amounts.length, "Length mismatch");

        for (uint256 i = 0; i < _tokenIds.length; i += 1) {
            require(balanceOf[_owner][_tokenIds[i]] >= _amounts[i], "Not enough tokens owned");
        }

        _burnBatch(_owner, _tokenIds, _amounts);
    }

    /*//////////////////////////////////////////////////////////////
                            ERC165 Logic
    //////////////////////////////////////////////////////////////*/

    /// @notice Returns whether this contract supports the given interface.
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, IERC165) returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155
            interfaceId == 0x0e89341c || // ERC165 Interface ID for ERC1155MetadataURI
            interfaceId == type(IERC2981).interfaceId; // ERC165 ID for ERC2981
    }

    /*//////////////////////////////////////////////////////////////
                            View functions
    //////////////////////////////////////////////////////////////*/

    /// @notice The tokenId assigned to the next new NFT to be minted.
    function nextTokenIdToMint() public view virtual returns (uint256) {
        return nextTokenIdToMint_;
    }

    /*//////////////////////////////////////////////////////////////
                        ERC-1155 overrides
    //////////////////////////////////////////////////////////////*/

    /// @dev See {ERC1155-setApprovalForAll}
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override(ERC1155)
        onlyAllowedOperatorApproval(operator)
    {
        super.setApprovalForAll(operator, approved);
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override(ERC1155) onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override(ERC1155) onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /*//////////////////////////////////////////////////////////////
                    Internal (overrideable) functions
    //////////////////////////////////////////////////////////////*/

    /// @dev Returns whether contract metadata can be set in the given execution context.
    function _canSetContractURI() internal view virtual override returns (bool) {
        return msg.sender == owner();
    }

    /// @dev Returns whether a token can be minted in the given execution context.
    function _canMint() internal view virtual returns (bool) {
        return msg.sender == owner();
    }

    /// @dev Returns whether owner can be set in the given execution context.
    function _canSetOwner() internal view virtual override returns (bool) {
        return msg.sender == owner();
    }

    /// @dev Returns whether royalty info can be set in the given execution context.
    function _canSetRoyaltyInfo() internal view virtual override returns (bool) {
        return msg.sender == owner();
    }

    /// @dev Returns whether operator restriction can be set in the given execution context.
    function _canSetOperatorRestriction() internal virtual override returns (bool) {
        return msg.sender == owner();
    }

    /// @dev Runs before every token transfer / mint / burn.
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                totalSupply[ids[i]] -= amounts[i];
            }
        }
    }

    function setERC20Contract(address _erc20Contract) external onlyOwner {
        erc20Contract = _erc20Contract;
    }

    // These functions will interact with the Mayhem ERC20 contract

    function burnAndSetBuyFee(uint256 id, uint256 amountToBurn) external virtual {

        if(id == 1){
            buyFee = 0;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setBuyFee(buyFee);
        }else if(id == 2){
            buyFee = 1;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setBuyFee(buyFee);
        }else if(id == 3){
            buyFee = 2;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setBuyFee(buyFee);
        }else if(id == 4){
            buyFee = 3;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setBuyFee(buyFee);
        }
    }

    function burnSetBuyFeeAndAddress(address account, uint256 id, uint256 amountToBurn) external virtual {

        if(id == 5){
            buyFee = 1;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setBuyFeeAndCollectionAddress(buyFee, account);
        }else if(id == 6){
            buyFee = 2;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setBuyFeeAndCollectionAddress(buyFee, account);
        }else if(id == 7){
            buyFee = 3;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setBuyFeeAndCollectionAddress(buyFee, account);
        }
    }

    function burnAndSetSellFee(uint256 id, uint256 amountToBurn) external virtual {

        if(id == 8){
            sellFee = 0;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setSellFee(sellFee);
        }else if(id == 9){
            sellFee = 1;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setSellFee(sellFee);
        }else if(id == 10){
            sellFee = 2;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setSellFee(sellFee);
        }else if(id == 11){
            sellFee = 3;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setSellFee(sellFee);
        }
    }

    function burnSetSellFeeAndAddress(address account, uint256 id, uint256 amountToBurn) external virtual {

        if(id == 12){
            sellFee = 1;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setSellFeeAndCollectionAddress(sellFee, account);
        }else if(id == 13){
            sellFee = 2;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setSellFeeAndCollectionAddress(sellFee, account);
        }else if(id == 14){
            sellFee = 3;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setSellFeeAndCollectionAddress(sellFee, account);
        }
    }

    function burnSetCollectionAddress(address account, uint256 id, uint256 amountToBurn) external virtual {

        if(id == 15){
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setCollectionAddress(account);
        }
    }

    function burnAndSetLiqBuyFee(uint256 id, uint256 amountToBurn) external virtual {
        if(id == 16){
            buyLiq = 0;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setLiqBuyFee(buyLiq);
        }else if(id == 17){
            buyLiq = 1;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setLiqBuyFee(buyLiq);
        }else if(id == 18){
            buyLiq = 2;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setLiqBuyFee(buyLiq);
        }
    }

    function burnAndSetLiqSellFee(uint256 id, uint256 amountToBurn) external virtual {
        if(id == 19){
            sellLiq = 0;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setLiqSellFee(sellLiq);
        }else if(id == 20){
            sellLiq = 1;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setLiqSellFee(sellLiq);
        }else if(id == 21){
            sellLiq = 2;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setLiqSellFee(sellLiq);
        }
    }

    function burnAndSetBuyBuyBackFee(uint256 id, uint256 amountToBurn) external virtual {
        if(id == 22){
            buyBuyBack = 0;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setBuyBuyBackFee(buyBuyBack);
        }else if(id == 23){
            buyBuyBack = 1;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setBuyBuyBackFee(buyBuyBack);
        }else if(id == 24){
            buyBuyBack = 2;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setBuyBuyBackFee(buyBuyBack);
        }
    }

    function burnAndSetSellBuyBackFee(uint256 id, uint256 amountToBurn) external virtual {
        if(id == 25){
            sellBuyBack = 0;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setSellBuyBackFee(sellBuyBack);
        }else if(id == 26){
            sellBuyBack = 1;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setSellBuyBackFee(sellBuyBack);
        }else if(id == 27){
            sellBuyBack = 2;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).setSellBuyBackFee(sellBuyBack);
        }
    }

    function burnAndKilldoze(uint256 id, uint256 amountToBurn) external virtual {
        if(id == 28){
            buyFee = 0;
            sellFee = 0;
            buyLiq = 0;
            sellLiq = 0;
            buyBuyBack = 0;
            sellBuyBack = 0;
            _burn(msg.sender, id, amountToBurn);
            IEnactMayhem(erc20Contract).killdozer(buyFee, sellFee, buyLiq, sellLiq, buyBuyBack, sellBuyBack);
        }
    }
}

// File: contracts/Test2.sol


pragma solidity ^0.8.0;


contract Test2 is ERC1155Base {
      constructor(
        string memory _name,
        string memory _symbol,
        address _royaltyRecipient,
        uint128 _royaltyBps,
        address _erc20Contract
    )
        ERC1155Base(
            _name,
            _symbol,
            _royaltyRecipient,
            _royaltyBps,
            _erc20Contract
        )
    {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_royaltyRecipient","type":"address"},{"internalType":"uint128","name":"_royaltyBps","type":"uint128"},{"internalType":"address","name":"_erc20Contract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"prevURI","type":"string"},{"indexed":false,"internalType":"string","name":"newURI","type":"string"}],"name":"ContractURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRoyaltyRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"newRoyaltyBps","type":"uint256"}],"name":"DefaultRoyalty","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"restriction","type":"bool"}],"name":"OperatorRestriction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"prevOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"royaltyRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"royaltyBps","type":"uint256"}],"name":"RoyaltyForToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"batchMintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amountToBurn","type":"uint256"}],"name":"burnAndKilldoze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amountToBurn","type":"uint256"}],"name":"burnAndSetBuyBuyBackFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amountToBurn","type":"uint256"}],"name":"burnAndSetBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amountToBurn","type":"uint256"}],"name":"burnAndSetLiqBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amountToBurn","type":"uint256"}],"name":"burnAndSetLiqSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amountToBurn","type":"uint256"}],"name":"burnAndSetSellBuyBackFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amountToBurn","type":"uint256"}],"name":"burnAndSetSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amountToBurn","type":"uint256"}],"name":"burnSetBuyFeeAndAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amountToBurn","type":"uint256"}],"name":"burnSetCollectionAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amountToBurn","type":"uint256"}],"name":"burnSetSellFeeAndAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBuyBack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiq","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20Contract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeCollectionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURICount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getBatchIdAtIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDefaultRoyaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getRoyaltyInfoForToken","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenIdToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorRestriction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBuyBack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiq","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyRecipient","type":"address"},{"internalType":"uint256","name":"_royaltyBps","type":"uint256"}],"name":"setDefaultRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20Contract","type":"address"}],"name":"setERC20Contract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_restriction","type":"bool"}],"name":"setOperatorRestriction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_bps","type":"uint256"}],"name":"setRoyaltyInfoForToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_subscription","type":"address"}],"name":"subscribeToRegistry","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620043893803806200438983398101604081905262000034916200042d565b733cc6cdda760b79bafa08df41ecfa224f810dceb66001868660006200005b838262000568565b5060016200006a828262000568565b5050506200007f8282620000d960201b60201c565b506200008d90503362000207565b620000a2836001600160801b03841662000259565b620000ae600162000304565b600e80546001600160a01b0319166001600160a01b0392909216919091179055506200063492505050565b6daaeb6d7670e522a718067333cd4e3b1562000203576001600160a01b0382163b15620001bc5780156200017b57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200015e57600080fd5b505af115801562000173573d6000803e3d6000fd5b505050505050565b60405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000143565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200015e57600080fd5b5050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a35050565b612710811115620002a25760405162461bcd60e51b815260206004820152600f60248201526e45786365656473206d61782062707360881b604482015260640160405180910390fd5b600780546001600160a01b0384166001600160b01b03199091168117600160a01b61ffff851602179091556040518281527f90d7ec04bcb8978719414f82e52e4cb651db41d0e6f8cea6118c2191e6183adb9060200160405180910390a25050565b600b805460ff19168215159081179091556040519081527f38475885990d8dfe9ca01f0ef160a1b5514426eab9ddbc953a3353410ba780969060200160405180910390a150565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200037357600080fd5b81516001600160401b03808211156200039057620003906200034b565b604051601f8301601f19908116603f01168101908282118183101715620003bb57620003bb6200034b565b81604052838152602092508683858801011115620003d857600080fd5b600091505b83821015620003fc5785820183015181830184015290820190620003dd565b600093810190920192909252949350505050565b80516001600160a01b03811681146200042857600080fd5b919050565b600080600080600060a086880312156200044657600080fd5b85516001600160401b03808211156200045e57600080fd5b6200046c89838a0162000361565b965060208801519150808211156200048357600080fd5b50620004928882890162000361565b945050620004a36040870162000410565b60608701519093506001600160801b0381168114620004c157600080fd5b9150620004d16080870162000410565b90509295509295909350565b600181811c90821680620004f257607f821691505b6020821081036200051357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200056357600081815260208120601f850160051c81016020861015620005425750805b601f850160051c820191505b8181101562000173578281556001016200054e565b505050565b81516001600160401b038111156200058457620005846200034b565b6200059c81620005958454620004dd565b8462000519565b602080601f831160018114620005d45760008415620005bb5750858301515b600019600386901b1c1916600185901b17855562000173565b600085815260208120601f198616915b828110156200060557888601518255948401946001909101908401620005e4565b5085821015620006245787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b613d4580620006446000396000f3fe608060405234801561001057600080fd5b50600436106102f05760003560e01c80636b20c4541161019d578063b03f4528116100e9578063d02d4aa1116100a2578063e985e9c51161007c578063e985e9c5146106d8578063f242432a14610706578063f281ce8e14610719578063f5298aca1461072257600080fd5b8063d02d4aa1146106aa578063e788fd9c146106bd578063e8a3d485146106d057600080fd5b8063b03f452814610620578063b24f2d3914610633578063b69a1ad014610651578063b71a8a4f14610664578063bd85b03914610677578063cac8d5381461069757600080fd5b80639bcf7a1511610156578063a8f6c91311610130578063a8f6c913146105d1578063a90382e7146105e4578063abec488a146105f7578063ac9650d81461060057600080fd5b80639bcf7a15146105a2578063a22cb465146105b5578063a4c767c8146105c857600080fd5b80636b20c4541461053d57806377652bbf146105505780638da5cb5b14610563578063938e3d7b14610574578063949c09f71461058757806395d89b411461059a57600080fd5b8063377c50d41161025c5780634e1273f4116102155780635f4a5c7c116101ef5780635f4a5c7c14610506578063600dd5ea1461051957806363b45e2d1461052c578063662ece791461053457600080fd5b80634e1273f4146104c6578063504c6e01146104e657806357fd8455146104f357600080fd5b8063377c50d41461042d5780633b1475a714610458578063408ced441461046057806341f434341461047357806347062402146104885780634cc157df1461049157600080fd5b80632419f51b116102ae5780632419f51b146103a65780632a55205a146103b95780632b14ca56146103eb5780632eb2c2d6146103f4578063320f768f1461040757806332f0cd641461041a57600080fd5b8062fdd58e146102f557806301ffc9a71461033357806306fdde03146103565780630c14fd381461036b5780630e89341c1461038057806313af403514610393575b600080fd5b610320610303366004612fe7565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b610346610341366004613027565b610735565b604051901515815260200161032a565b61035e6107a2565b60405161032a9190613094565b61037e6103793660046130a7565b610830565b005b61035e61038e3660046130c9565b6108e7565b61037e6103a13660046130e2565b6109d5565b6103206103b43660046130c9565b610a0e565b6103cc6103c73660046130a7565b610a7c565b604080516001600160a01b03909316835260208301919091520161032a565b61032060105481565b61037e610402366004613246565b610ab9565b61037e6104153660046130a7565b610ae0565b61037e6104283660046132fd565b610b5d565b601554610440906001600160a01b031681565b6040516001600160a01b03909116815260200161032a565b600c54610320565b61037e61046e3660046130a7565b610bce565b6104406daaeb6d7670e522a718067333cd4e81565b610320600f5481565b6104a461049f3660046130c9565b610c63565b604080516001600160a01b03909316835261ffff90911660208301520161032a565b6104d96104d436600461331a565b610cce565b60405161032a919061341f565b600b546103469060ff1681565b61037e6105013660046130e2565b610de2565b61037e6105143660046130a7565b610e52565b61037e610527366004612fe7565b610ee7565b600954610320565b61032060145481565b61037e61054b366004613432565b610f15565b61037e61055e3660046134a5565b6110b7565b6006546001600160a01b0316610440565b61037e6105823660046134d8565b611130565b61037e61059536600461350c565b61115d565b61035e61134f565b61037e6105b03660046135a4565b61135c565b61037e6105c33660046135d9565b61138b565b61032060125481565b600e54610440906001600160a01b031681565b61037e6105f23660046134a5565b61139f565b61032060135481565b61061361060e366004613610565b611424565b60405161032a9190613684565b61037e61062e3660046136e6565b611518565b6007546001600160a01b03811690600160a01b900461ffff166104a4565b61037e61065f3660046130a7565b611603565b61037e6106723660046134a5565b611697565b6103206106853660046130c9565b600d6020526000908152604090205481565b61037e6106a53660046130e2565b61171c565b61037e6106b83660046130a7565b611768565b61037e6106cb3660046130a7565b6117e5565b61035e611862565b6103466106e6366004613744565b600360209081526000928352604080842090915290825290205460ff1681565b61037e610714366004613777565b61186f565b61032060115481565b61037e6107303660046134a5565b611896565b60006301ffc9a760e01b6001600160e01b0319831614806107665750636cdb3d1360e11b6001600160e01b03198316145b8061078157506303a24d0760e21b6001600160e01b03198316145b8061079c57506001600160e01b0319821663152a902d60e11b145b92915050565b600080546107af906137db565b80601f01602080910402602001604051908101604052809291908181526020018280546107db906137db565b80156108285780601f106107fd57610100808354040283529160200191610828565b820191906000526020600020905b81548152906001019060200180831161080b57829003601f168201915b505050505081565b816019036108b3576000601455610848338383611987565b600e546014546040516354a7fb5f60e11b81526001600160a01b039092169163a94ff6be9161087d9160040190815260200190565b600060405180830381600087803b15801561089757600080fd5b505af11580156108ab573d6000803e3d6000fd5b505050505050565b81601a036108cb576001601455610848338383611987565b81601b036108e3576002601455610848338383611987565b5050565b600081815260046020526040812080546060929190610905906137db565b80601f0160208091040260200160405190810160405280929190818152602001828054610931906137db565b801561097e5780601f106109535761010080835404028352916020019161097e565b820191906000526020600020905b81548152906001019060200180831161096157829003601f168201915b505050505090506000815111156109955792915050565b60006109a084611aac565b9050806109ac85611c48565b6040516020016109bd929190613815565b60405160208183030381529060405292505050919050565b6109dd611d50565b610a025760405162461bcd60e51b81526004016109f990613844565b60405180910390fd5b610a0b81611d7d565b50565b6000610a1960095490565b8210610a575760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016109f9565b60098281548110610a6a57610a6a61386c565b90600052602060002001549050919050565b600080600080610a8b86610c63565b90945084925061ffff169050612710610aa48287613898565b610aae91906138c5565b925050509250929050565b846001600160a01b0381163314610ad357610ad333611dcf565b6108ab8686868686611e93565b81601003610b2d576000601155610af8338383611987565b600e546011546040516305af89f960e41b81526001600160a01b0390921691635af89f909161087d9160040190815260200190565b81601103610b45576001601155610af8338383611987565b816012036108e3576002601155610af8338383611987565b610b65611d50565b610bc55760405162461bcd60e51b815260206004820152602b60248201527f4e6f7420617574686f72697a656420746f20736574206f70657261746f72207260448201526a32b9ba3934b1ba34b7b71760a91b60648201526084016109f9565b610a0b81611f22565b81600103610c1b576000600f55610be6338383611987565b600e54600f54604051630cc835a360e01b81526001600160a01b0390921691630cc835a39161087d9160040190815260200190565b81600203610c33576001600f55610be6338383611987565b81600303610c4b576002600f55610be6338383611987565b816004036108e3576003600f55610be6338383611987565b6000818152600860209081526040808320815180830190925280546001600160a01b031680835260019091015492820192909252829115610caa5780516020820151610cc4565b6007546001600160a01b03811690600160a01b900461ffff165b9250925050915091565b60608151835114610cf15760405162461bcd60e51b81526004016109f9906138d9565b600083516001600160401b03811115610d0c57610d0c6130fd565b604051908082528060200260200182016040528015610d35578160200160208202803683370190505b50905060005b8451811015610dda5760026000868381518110610d5a57610d5a61386c565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858381518110610d9657610d9661386c565b6020026020010151815260200190815260200160002054828281518110610dbf57610dbf61386c565b6020908102919091010152610dd381613902565b9050610d3b565b509392505050565b610dea611d50565b610e475760405162461bcd60e51b815260206004820152602860248201527f4e6f7420617574686f72697a656420746f2073756273637269626520746f207260448201526732b3b4b9ba393c9760c11b60648201526084016109f9565b610a0b816001611f69565b81600803610e9f576000601055610e6a338383611987565b600e546010546040516311699dc160e31b81526001600160a01b0390921691638b4cee089161087d9160040190815260200190565b81600903610eb7576001601055610e6a338383611987565b81600a03610ecf576002601055610e6a338383611987565b81600b036108e3576003601055610e6a338383611987565b610eef611d50565b610f0b5760405162461bcd60e51b81526004016109f990613844565b6108e38282612045565b336001600160a01b038416811480610f5257506001600160a01b0380851660009081526003602090815260408083209385168352929052205460ff165b610f925760405162461bcd60e51b81526020600482015260116024820152702ab730b8383937bb32b21031b0b63632b960791b60448201526064016109f9565b8151835114610fd55760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064016109f9565b60005b83518110156110a557828181518110610ff357610ff361386c565b602002602001015160026000876001600160a01b03166001600160a01b0316815260200190815260200160002060008684815181106110345761103461386c565b602002602001015181526020019081526020016000205410156110935760405162461bcd60e51b8152602060048201526017602482015276139bdd08195b9bdd59da081d1bdad95b9cc81bdddb9959604a1b60448201526064016109f9565b61109e60018261391b565b9050610fd8565b506110b18484846120eb565b50505050565b81600f0361112b576110ca338383611987565b600e5460405163a6904aa560e01b81526001600160a01b0385811660048301529091169063a6904aa5906024015b600060405180830381600087803b15801561111257600080fd5b505af1158015611126573d6000803e3d6000fd5b505050505b505050565b611138611d50565b6111545760405162461bcd60e51b81526004016109f990613844565b610a0b816122a0565b611165611d50565b6111ab5760405162461bcd60e51b81526020600482015260176024820152762737ba1030baba3437b934bd32b2103a379036b4b73a1760491b60448201526064016109f9565b60008251116111f35760405162461bcd60e51b815260206004820152601460248201527326b4b73a34b733903d32b937903a37b5b2b7399760611b60448201526064016109f9565b81518351146112375760405162461bcd60e51b815260206004820152601060248201526f2632b733ba341036b4b9b6b0ba31b41760811b60448201526064016109f9565b6000611242600c5490565b9050806000805b8651811015611318576000198782815181106112675761126761386c565b6020026020010151036112b157838782815181106112875761128761386c565b602090810291909101015261129d60018561391b565b93506112aa60018361391b565b9150611306565b838782815181106112c4576112c461386c565b6020026020010151106113065760405162461bcd60e51b815260206004820152600a6024820152691a5b9d985b1a59081a5960b21b60448201526064016109f9565b61131160018261391b565b9050611249565b50801561132d5761132a82828661237c565b50505b82600c81905550611126878787604051806020016040528060008152506123e0565b600180546107af906137db565b611364611d50565b6113805760405162461bcd60e51b81526004016109f990613844565b61112b83838361253b565b8161139581611dcf565b61112b8383612605565b81600c036113f45760016010556113b7338383611987565b600e5460105460405163e6a0816d60e01b815260048101919091526001600160a01b0385811660248301529091169063e6a0816d906044016110f8565b81600d0361140c5760026010556113b7338383611987565b81600e0361112b5760036010556113b7338383611987565b6060816001600160401b0381111561143e5761143e6130fd565b60405190808252806020026020018201604052801561147157816020015b606081526020019060019003908161145c5790505b50905060005b82811015611511576114e1308585848181106114955761149561386c565b90506020028101906114a7919061392e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126b492505050565b8282815181106114f3576114f361386c565b6020026020010181905250808061150990613902565b915050611477565b5092915050565b611520611d50565b6115665760405162461bcd60e51b81526020600482015260176024820152762737ba1030baba3437b934bd32b2103a379036b4b73a1760491b60448201526064016109f9565b600080611572600c5490565b905060001985036115a8578091506001600c6000828254611593919061391b565b909155506115a3905081856126e0565b6115e8565b8085106115e45760405162461bcd60e51b815260206004820152600a6024820152691a5b9d985b1a59081a5960b21b60448201526064016109f9565b8491505b6108ab868385604051806020016040528060008152506126f8565b81601c036108e3576000600f8190556010819055601181905560128190556013819055601455611634338383611987565b600e54600f54601054601154601254601354601454604051634244156f60e01b81526004810196909652602486019490945260448501929092526064840152608483015260a48201526001600160a01b0390911690634244156f9060c40161087d565b816005036116ec576001600f556116af338383611987565b600e54600f5460405163b29c8f6760e01b815260048101919091526001600160a01b0385811660248301529091169063b29c8f67906044016110f8565b81600603611704576002600f556116af338383611987565b8160070361112b576003600f556116af338383611987565b6006546001600160a01b031633146117465760405162461bcd60e51b81526004016109f990613844565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b816016036117b5576000601355611780338383611987565b600e546013546040516317a99b8160e11b81526001600160a01b0390921691632f5337029161087d9160040190815260200190565b816017036117cd576001601355611780338383611987565b816018036108e3576002601355611780338383611987565b816013036118325760006012556117fd338383611987565b600e54601254604051636046a33b60e11b81526001600160a01b039092169163c08d46769161087d9160040190815260200190565b8160140361184a5760016012556117fd338383611987565b816015036108e35760026012556117fd338383611987565b600580546107af906137db565b846001600160a01b03811633146118895761188933611dcf565b6108ab86868686866127d1565b336001600160a01b0384168114806118d357506001600160a01b0380851660009081526003602090815260408083209385168352929052205460ff165b6119135760405162461bcd60e51b81526020600482015260116024820152702ab730b8383937bb32b21031b0b63632b960791b60448201526064016109f9565b6001600160a01b03841660009081526002602090815260408083208684529091529020548211156119805760405162461bcd60e51b8152602060048201526017602482015276139bdd08195b9bdd59da081d1bdad95b9cc81bdddb9959604a1b60448201526064016109f9565b6110b18484845b6001600160a01b0383166119ce5760405162461bcd60e51b815260206004820152600e60248201526d232927a6afad22a927afa0a2222960911b60448201526064016109f9565b336119fd818560006119df87612859565b6119e887612859565b604051806020016040528060008152506128a4565b6001600160a01b038416600090815260026020908152604080832086845290915290205482811015611a415760405162461bcd60e51b81526004016109f99061397b565b6001600160a01b03858116600081815260026020908152604080832089845282528083208887039055805189815291820188905291938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b60606000611ab960095490565b905060006009805480602002602001604051908101604052809291908181526020018280548015611b0957602002820191906000526020600020905b815481526020019060010190808311611af5575b5050505050905060005b82811015611c0d57818181518110611b2d57611b2d61386c565b6020026020010151851015611bfb57600a6000838381518110611b5257611b5261386c565b602002602001015181526020019081526020016000208054611b73906137db565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9f906137db565b8015611bec5780601f10611bc157610100808354040283529160200191611bec565b820191906000526020600020905b815481529060010190602001808311611bcf57829003601f168201915b50505050509350505050919050565b611c0660018261391b565b9050611b13565b5060405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081d1bdad95b9259608a1b60448201526064016109f9565b606081600003611c6f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c995780611c8381613902565b9150611c929050600a836138c5565b9150611c73565b6000816001600160401b03811115611cb357611cb36130fd565b6040519080825280601f01601f191660200182016040528015611cdd576020820181803683370190505b5090505b8415611d4857611cf26001836139a5565b9150611cff600a866139b8565b611d0a90603061391b565b60f81b818381518110611d1f57611d1f61386c565b60200101906001600160f81b031916908160001a905350611d41600a866138c5565b9450611ce1565b949350505050565b6000611d646006546001600160a01b031690565b6001600160a01b0316336001600160a01b031614905090565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a35050565b600b5460ff1615610a0b576daaeb6d7670e522a718067333cd4e3b15610a0b57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6b91906139cc565b610a0b57604051633b79c77360e21b81526001600160a01b03821660048201526024016109f9565b6001600160a01b038516331480611ecd57506001600160a01b038516600090815260036020908152604080832033845290915290205460ff165b611f0e5760405162461bcd60e51b81526020600482015260126024820152710853d5d3915497d3d497d054141493d5915160721b60448201526064016109f9565b611f1b85858585856129b0565b5050505050565b600b805460ff19168215159081179091556040519081527f38475885990d8dfe9ca01f0ef160a1b5514426eab9ddbc953a3353410ba780969060200160405180910390a150565b6daaeb6d7670e522a718067333cd4e3b156108e3576001600160a01b0382163b15612014578015611fd457604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe9060440161087d565b60405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440161087d565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e4869060240161087d565b6127108111156120895760405162461bcd60e51b815260206004820152600f60248201526e45786365656473206d61782062707360881b60448201526064016109f9565b600780546001600160a01b0384166001600160b01b03199091168117600160a01b61ffff851602179091556040518281527f90d7ec04bcb8978719414f82e52e4cb651db41d0e6f8cea6118c2191e6183adb9060200160405180910390a25050565b6001600160a01b0383166121325760405162461bcd60e51b815260206004820152600e60248201526d232927a6afad22a927afa0a2222960911b60448201526064016109f9565b80518251146121535760405162461bcd60e51b81526004016109f9906138d9565b6000339050612176818560008686604051806020016040528060008152506128a4565b60005b83518110156122415760008482815181106121965761219661386c565b6020026020010151905060008483815181106121b4576121b461386c565b6020908102919091018101516001600160a01b03891660009081526002835260408082208683529093529190912054909150818110156122065760405162461bcd60e51b81526004016109f99061397b565b6001600160a01b038816600090815260026020908152604080832095835294905292909220910390558061223981613902565b915050612179565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516122929291906139e9565b60405180910390a450505050565b6000600580546122af906137db565b80601f01602080910402602001604051908101604052809291908181526020018280546122db906137db565b80156123285780601f106122fd57610100808354040283529160200191612328565b820191906000526020600020905b81548152906001019060200180831161230b57829003601f168201915b50505050509050816005908161233e9190613a5d565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a168183604051612370929190613b1c565b60405180910390a15050565b600080612389848661391b565b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af018190556000818152600a602052604090209092508291506123d78482613a5d565b50935093915050565b6001600160a01b0384166124065760405162461bcd60e51b81526004016109f990613b41565b81518351146124275760405162461bcd60e51b81526004016109f9906138d9565b33612437816000878787876128a4565b60005b84518110156124d3578381815181106124555761245561386c565b602002602001015160026000886001600160a01b03166001600160a01b0316815260200190815260200160002060008784815181106124965761249661386c565b6020026020010151815260200190815260200160002060008282546124bb919061391b565b909155508190506124cb81613902565b91505061243a565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516125249291906139e9565b60405180910390a4611f1b81600087878787612b5f565b61271081111561257f5760405162461bcd60e51b815260206004820152600f60248201526e45786365656473206d61782062707360881b60448201526064016109f9565b6040805180820182526001600160a01b038481168083526020808401868152600089815260088352869020945185546001600160a01b031916941693909317845591516001909301929092559151838152909185917f7365cf4122f072a3365c20d54eff9b38d73c096c28e1892ec8f5b0e403a0f12d91015b60405180910390a3505050565b336001600160a01b038316810361264f5760405162461bcd60e51b815260206004820152600e60248201526d20a8282927ab24a723afa9a2a62360911b60448201526064016109f9565b6001600160a01b03818116600081815260036020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191016125f8565b60606126d98383604051806060016040528060278152602001613ce960279139612cb2565b9392505050565b600082815260046020526040902061112b8282613a5d565b6001600160a01b03841661271e5760405162461bcd60e51b81526004016109f990613b41565b3361273e8160008761272f88612859565b61273888612859565b876128a4565b6001600160a01b03851660009081526002602090815260408083208784529091528120805485929061277190849061391b565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611f1b81600087878787612d8f565b6001600160a01b03851633148061280b57506001600160a01b038516600090815260036020908152604080832033845290915290205460ff165b61284c5760405162461bcd60e51b81526020600482015260126024820152710853d5d3915497d3d497d054141493d5915160721b60448201526064016109f9565b611f1b8585858585612e6c565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106128935761289361386c565b602090810291909101015292915050565b6001600160a01b03851661292b5760005b8351811015612929578281815181106128d0576128d061386c565b6020026020010151600d60008684815181106128ee576128ee61386c565b602002602001015181526020019081526020016000206000828254612913919061391b565b90915550612922905081613902565b90506128b5565b505b6001600160a01b0384166108ab5760005b8351811015611126578281815181106129575761295761386c565b6020026020010151600d60008684815181106129755761297561386c565b60200260200101518152602001908152602001600020600082825461299a91906139a5565b909155506129a9905081613902565b905061293c565b81518351146129d15760405162461bcd60e51b81526004016109f9906138d9565b6001600160a01b0384166129f75760405162461bcd60e51b81526004016109f990613b41565b33612a068187878787876128a4565b60005b8451811015612afd576000858281518110612a2657612a2661386c565b602002602001015190506000858381518110612a4457612a4461386c565b6020908102919091018101516001600160a01b038b166000908152600283526040808220868352909352919091205490915081811015612a965760405162461bcd60e51b81526004016109f99061397b565b6001600160a01b03808b16600090815260026020818152604080842088855282528084208787039055938d16835290815282822086835290529081208054849290612ae290849061391b565b9250508190555050505080612af690613902565b9050612a09565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612b4d9291906139e9565b60405180910390a46108ab8187878787875b6001600160a01b0384163b156108ab5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612ba39089908990889088908890600401613b67565b6020604051808303816000875af1925050508015612bde575060408051601f3d908101601f19168201909252612bdb91810190613bc5565b60015b612c6057612bea613be2565b806308c379a003612c235750612bfe613bfe565b80612c095750612c25565b8060405162461bcd60e51b81526004016109f99190613094565b505b60405162461bcd60e51b815260206004820152601060248201526f10a2a92198989a9aa922a1a2a4ab22a960811b60448201526064016109f9565b6001600160e01b0319811663bc197c8160e01b146111265760405162461bcd60e51b815260206004820152600f60248201526e1513d2d15394d7d491529150d51151608a1b60448201526064016109f9565b60606001600160a01b0384163b612d1a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016109f9565b600080856001600160a01b031685604051612d359190613c87565b600060405180830381855af49150503d8060008114612d70576040519150601f19603f3d011682016040523d82523d6000602084013e612d75565b606091505b5091509150612d85828286612f92565b9695505050505050565b6001600160a01b0384163b156108ab5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612dd39089908990889088908890600401613ca3565b6020604051808303816000875af1925050508015612e0e575060408051601f3d908101601f19168201909252612e0b91810190613bc5565b60015b612e1a57612bea613be2565b6001600160e01b0319811663f23a6e6160e01b146111265760405162461bcd60e51b815260206004820152600f60248201526e1513d2d15394d7d491529150d51151608a1b60448201526064016109f9565b6001600160a01b038416612e925760405162461bcd60e51b81526004016109f990613b41565b33612ea281878761272f88612859565b6001600160a01b038616600090815260026020908152604080832087845290915290205483811015612ee65760405162461bcd60e51b81526004016109f99061397b565b6001600160a01b0380881660009081526002602081815260408084208a855282528084208987039055938a16835290815282822088835290529081208054869290612f3290849061391b565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611126828888888888612d8f565b60608315612fa15750816126d9565b825115612fb15782518084602001fd5b8160405162461bcd60e51b81526004016109f99190613094565b80356001600160a01b0381168114612fe257600080fd5b919050565b60008060408385031215612ffa57600080fd5b61300383612fcb565b946020939093013593505050565b6001600160e01b031981168114610a0b57600080fd5b60006020828403121561303957600080fd5b81356126d981613011565b60005b8381101561305f578181015183820152602001613047565b50506000910152565b60008151808452613080816020860160208601613044565b601f01601f19169290920160200192915050565b6020815260006126d96020830184613068565b600080604083850312156130ba57600080fd5b50508035926020909101359150565b6000602082840312156130db57600080fd5b5035919050565b6000602082840312156130f457600080fd5b6126d982612fcb565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715613138576131386130fd565b6040525050565b60006001600160401b03821115613158576131586130fd565b5060051b60200190565b600082601f83011261317357600080fd5b813560206131808261313f565b60405161318d8282613113565b83815260059390931b85018201928281019150868411156131ad57600080fd5b8286015b848110156131c857803583529183019183016131b1565b509695505050505050565b600082601f8301126131e457600080fd5b81356001600160401b038111156131fd576131fd6130fd565b604051613214601f8301601f191660200182613113565b81815284602083860101111561322957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561325e57600080fd5b61326786612fcb565b945061327560208701612fcb565b935060408601356001600160401b038082111561329157600080fd5b61329d89838a01613162565b945060608801359150808211156132b357600080fd5b6132bf89838a01613162565b935060808801359150808211156132d557600080fd5b506132e2888289016131d3565b9150509295509295909350565b8015158114610a0b57600080fd5b60006020828403121561330f57600080fd5b81356126d9816132ef565b6000806040838503121561332d57600080fd5b82356001600160401b038082111561334457600080fd5b818501915085601f83011261335857600080fd5b813560206133658261313f565b6040516133728282613113565b83815260059390931b850182019282810191508984111561339257600080fd5b948201945b838610156133b7576133a886612fcb565b82529482019490820190613397565b965050860135925050808211156133cd57600080fd5b506133da85828601613162565b9150509250929050565b600081518084526020808501945080840160005b83811015613414578151875295820195908201906001016133f8565b509495945050505050565b6020815260006126d960208301846133e4565b60008060006060848603121561344757600080fd5b61345084612fcb565b925060208401356001600160401b038082111561346c57600080fd5b61347887838801613162565b9350604086013591508082111561348e57600080fd5b5061349b86828701613162565b9150509250925092565b6000806000606084860312156134ba57600080fd5b6134c384612fcb565b95602085013595506040909401359392505050565b6000602082840312156134ea57600080fd5b81356001600160401b0381111561350057600080fd5b611d48848285016131d3565b6000806000806080858703121561352257600080fd5b61352b85612fcb565b935060208501356001600160401b038082111561354757600080fd5b61355388838901613162565b9450604087013591508082111561356957600080fd5b61357588838901613162565b9350606087013591508082111561358b57600080fd5b50613598878288016131d3565b91505092959194509250565b6000806000606084860312156135b957600080fd5b833592506135c960208501612fcb565b9150604084013590509250925092565b600080604083850312156135ec57600080fd5b6135f583612fcb565b91506020830135613605816132ef565b809150509250929050565b6000806020838503121561362357600080fd5b82356001600160401b038082111561363a57600080fd5b818501915085601f83011261364e57600080fd5b81358181111561365d57600080fd5b8660208260051b850101111561367257600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156136d957603f198886030184526136c7858351613068565b945092850192908501906001016136ab565b5092979650505050505050565b600080600080608085870312156136fc57600080fd5b61370585612fcb565b93506020850135925060408501356001600160401b0381111561372757600080fd5b613733878288016131d3565b949793965093946060013593505050565b6000806040838503121561375757600080fd5b61376083612fcb565b915061376e60208401612fcb565b90509250929050565b600080600080600060a0868803121561378f57600080fd5b61379886612fcb565b94506137a660208701612fcb565b9350604086013592506060860135915060808601356001600160401b038111156137cf57600080fd5b6132e2888289016131d3565b600181811c908216806137ef57607f821691505b60208210810361380f57634e487b7160e01b600052602260045260246000fd5b50919050565b60008351613827818460208801613044565b83519083019061383b818360208801613044565b01949350505050565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761079c5761079c613882565b634e487b7160e01b600052601260045260246000fd5b6000826138d4576138d46138af565b500490565b6020808252600f908201526e0988a9c8ea890be9a92a69a82a8869608b1b604082015260600190565b60006001820161391457613914613882565b5060010190565b8082018082111561079c5761079c613882565b6000808335601e1984360301811261394557600080fd5b8301803591506001600160401b0382111561395f57600080fd5b60200191503681900382131561397457600080fd5b9250929050565b60208082526010908201526f125394d551919250d251539517d0905360821b604082015260600190565b8181038181111561079c5761079c613882565b6000826139c7576139c76138af565b500690565b6000602082840312156139de57600080fd5b81516126d9816132ef565b6040815260006139fc60408301856133e4565b8281036020840152613a0e81856133e4565b95945050505050565b601f82111561112b57600081815260208120601f850160051c81016020861015613a3e5750805b601f850160051c820191505b818110156108ab57828155600101613a4a565b81516001600160401b03811115613a7657613a766130fd565b613a8a81613a8484546137db565b84613a17565b602080601f831160018114613abf5760008415613aa75750858301515b600019600386901b1c1916600185901b1785556108ab565b600085815260208120601f198616915b82811015613aee57888601518255948401946001909101908401613acf565b5085821015613b0c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b604081526000613b2f6040830185613068565b8281036020840152613a0e8185613068565b6020808252600c908201526b2a27afad22a927afa0a2222960a11b604082015260600190565b6001600160a01b0386811682528516602082015260a060408201819052600090613b93908301866133e4565b8281036060840152613ba581866133e4565b90508281036080840152613bb98185613068565b98975050505050505050565b600060208284031215613bd757600080fd5b81516126d981613011565b600060033d1115613bfb5760046000803e5060005160e01c5b90565b600060443d1015613c0c5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613c3b57505050505090565b8285019150815181811115613c535750505050505090565b843d8701016020828501011115613c6d5750505050505090565b613c7c60208286010187613113565b509095945050505050565b60008251613c99818460208701613044565b9190910192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613cdd90830184613068565b97965050505050505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208cb489569651a144002791ea4b73ae7b25a475082032419c9da2291ef09d454a64736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000004f495c2d2dfdab8fcb995d575ca85dc84e400fd70000000000000000000000000000000000000000000000000000000000000002000000000000000000000000760b3adb45c7e927d32fb052c2977de4857563ed000000000000000000000000000000000000000000000000000000000000001350726f6a656374204d617968656d204e465473000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003504d4e0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102f05760003560e01c80636b20c4541161019d578063b03f4528116100e9578063d02d4aa1116100a2578063e985e9c51161007c578063e985e9c5146106d8578063f242432a14610706578063f281ce8e14610719578063f5298aca1461072257600080fd5b8063d02d4aa1146106aa578063e788fd9c146106bd578063e8a3d485146106d057600080fd5b8063b03f452814610620578063b24f2d3914610633578063b69a1ad014610651578063b71a8a4f14610664578063bd85b03914610677578063cac8d5381461069757600080fd5b80639bcf7a1511610156578063a8f6c91311610130578063a8f6c913146105d1578063a90382e7146105e4578063abec488a146105f7578063ac9650d81461060057600080fd5b80639bcf7a15146105a2578063a22cb465146105b5578063a4c767c8146105c857600080fd5b80636b20c4541461053d57806377652bbf146105505780638da5cb5b14610563578063938e3d7b14610574578063949c09f71461058757806395d89b411461059a57600080fd5b8063377c50d41161025c5780634e1273f4116102155780635f4a5c7c116101ef5780635f4a5c7c14610506578063600dd5ea1461051957806363b45e2d1461052c578063662ece791461053457600080fd5b80634e1273f4146104c6578063504c6e01146104e657806357fd8455146104f357600080fd5b8063377c50d41461042d5780633b1475a714610458578063408ced441461046057806341f434341461047357806347062402146104885780634cc157df1461049157600080fd5b80632419f51b116102ae5780632419f51b146103a65780632a55205a146103b95780632b14ca56146103eb5780632eb2c2d6146103f4578063320f768f1461040757806332f0cd641461041a57600080fd5b8062fdd58e146102f557806301ffc9a71461033357806306fdde03146103565780630c14fd381461036b5780630e89341c1461038057806313af403514610393575b600080fd5b610320610303366004612fe7565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b610346610341366004613027565b610735565b604051901515815260200161032a565b61035e6107a2565b60405161032a9190613094565b61037e6103793660046130a7565b610830565b005b61035e61038e3660046130c9565b6108e7565b61037e6103a13660046130e2565b6109d5565b6103206103b43660046130c9565b610a0e565b6103cc6103c73660046130a7565b610a7c565b604080516001600160a01b03909316835260208301919091520161032a565b61032060105481565b61037e610402366004613246565b610ab9565b61037e6104153660046130a7565b610ae0565b61037e6104283660046132fd565b610b5d565b601554610440906001600160a01b031681565b6040516001600160a01b03909116815260200161032a565b600c54610320565b61037e61046e3660046130a7565b610bce565b6104406daaeb6d7670e522a718067333cd4e81565b610320600f5481565b6104a461049f3660046130c9565b610c63565b604080516001600160a01b03909316835261ffff90911660208301520161032a565b6104d96104d436600461331a565b610cce565b60405161032a919061341f565b600b546103469060ff1681565b61037e6105013660046130e2565b610de2565b61037e6105143660046130a7565b610e52565b61037e610527366004612fe7565b610ee7565b600954610320565b61032060145481565b61037e61054b366004613432565b610f15565b61037e61055e3660046134a5565b6110b7565b6006546001600160a01b0316610440565b61037e6105823660046134d8565b611130565b61037e61059536600461350c565b61115d565b61035e61134f565b61037e6105b03660046135a4565b61135c565b61037e6105c33660046135d9565b61138b565b61032060125481565b600e54610440906001600160a01b031681565b61037e6105f23660046134a5565b61139f565b61032060135481565b61061361060e366004613610565b611424565b60405161032a9190613684565b61037e61062e3660046136e6565b611518565b6007546001600160a01b03811690600160a01b900461ffff166104a4565b61037e61065f3660046130a7565b611603565b61037e6106723660046134a5565b611697565b6103206106853660046130c9565b600d6020526000908152604090205481565b61037e6106a53660046130e2565b61171c565b61037e6106b83660046130a7565b611768565b61037e6106cb3660046130a7565b6117e5565b61035e611862565b6103466106e6366004613744565b600360209081526000928352604080842090915290825290205460ff1681565b61037e610714366004613777565b61186f565b61032060115481565b61037e6107303660046134a5565b611896565b60006301ffc9a760e01b6001600160e01b0319831614806107665750636cdb3d1360e11b6001600160e01b03198316145b8061078157506303a24d0760e21b6001600160e01b03198316145b8061079c57506001600160e01b0319821663152a902d60e11b145b92915050565b600080546107af906137db565b80601f01602080910402602001604051908101604052809291908181526020018280546107db906137db565b80156108285780601f106107fd57610100808354040283529160200191610828565b820191906000526020600020905b81548152906001019060200180831161080b57829003601f168201915b505050505081565b816019036108b3576000601455610848338383611987565b600e546014546040516354a7fb5f60e11b81526001600160a01b039092169163a94ff6be9161087d9160040190815260200190565b600060405180830381600087803b15801561089757600080fd5b505af11580156108ab573d6000803e3d6000fd5b505050505050565b81601a036108cb576001601455610848338383611987565b81601b036108e3576002601455610848338383611987565b5050565b600081815260046020526040812080546060929190610905906137db565b80601f0160208091040260200160405190810160405280929190818152602001828054610931906137db565b801561097e5780601f106109535761010080835404028352916020019161097e565b820191906000526020600020905b81548152906001019060200180831161096157829003601f168201915b505050505090506000815111156109955792915050565b60006109a084611aac565b9050806109ac85611c48565b6040516020016109bd929190613815565b60405160208183030381529060405292505050919050565b6109dd611d50565b610a025760405162461bcd60e51b81526004016109f990613844565b60405180910390fd5b610a0b81611d7d565b50565b6000610a1960095490565b8210610a575760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016109f9565b60098281548110610a6a57610a6a61386c565b90600052602060002001549050919050565b600080600080610a8b86610c63565b90945084925061ffff169050612710610aa48287613898565b610aae91906138c5565b925050509250929050565b846001600160a01b0381163314610ad357610ad333611dcf565b6108ab8686868686611e93565b81601003610b2d576000601155610af8338383611987565b600e546011546040516305af89f960e41b81526001600160a01b0390921691635af89f909161087d9160040190815260200190565b81601103610b45576001601155610af8338383611987565b816012036108e3576002601155610af8338383611987565b610b65611d50565b610bc55760405162461bcd60e51b815260206004820152602b60248201527f4e6f7420617574686f72697a656420746f20736574206f70657261746f72207260448201526a32b9ba3934b1ba34b7b71760a91b60648201526084016109f9565b610a0b81611f22565b81600103610c1b576000600f55610be6338383611987565b600e54600f54604051630cc835a360e01b81526001600160a01b0390921691630cc835a39161087d9160040190815260200190565b81600203610c33576001600f55610be6338383611987565b81600303610c4b576002600f55610be6338383611987565b816004036108e3576003600f55610be6338383611987565b6000818152600860209081526040808320815180830190925280546001600160a01b031680835260019091015492820192909252829115610caa5780516020820151610cc4565b6007546001600160a01b03811690600160a01b900461ffff165b9250925050915091565b60608151835114610cf15760405162461bcd60e51b81526004016109f9906138d9565b600083516001600160401b03811115610d0c57610d0c6130fd565b604051908082528060200260200182016040528015610d35578160200160208202803683370190505b50905060005b8451811015610dda5760026000868381518110610d5a57610d5a61386c565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858381518110610d9657610d9661386c565b6020026020010151815260200190815260200160002054828281518110610dbf57610dbf61386c565b6020908102919091010152610dd381613902565b9050610d3b565b509392505050565b610dea611d50565b610e475760405162461bcd60e51b815260206004820152602860248201527f4e6f7420617574686f72697a656420746f2073756273637269626520746f207260448201526732b3b4b9ba393c9760c11b60648201526084016109f9565b610a0b816001611f69565b81600803610e9f576000601055610e6a338383611987565b600e546010546040516311699dc160e31b81526001600160a01b0390921691638b4cee089161087d9160040190815260200190565b81600903610eb7576001601055610e6a338383611987565b81600a03610ecf576002601055610e6a338383611987565b81600b036108e3576003601055610e6a338383611987565b610eef611d50565b610f0b5760405162461bcd60e51b81526004016109f990613844565b6108e38282612045565b336001600160a01b038416811480610f5257506001600160a01b0380851660009081526003602090815260408083209385168352929052205460ff165b610f925760405162461bcd60e51b81526020600482015260116024820152702ab730b8383937bb32b21031b0b63632b960791b60448201526064016109f9565b8151835114610fd55760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064016109f9565b60005b83518110156110a557828181518110610ff357610ff361386c565b602002602001015160026000876001600160a01b03166001600160a01b0316815260200190815260200160002060008684815181106110345761103461386c565b602002602001015181526020019081526020016000205410156110935760405162461bcd60e51b8152602060048201526017602482015276139bdd08195b9bdd59da081d1bdad95b9cc81bdddb9959604a1b60448201526064016109f9565b61109e60018261391b565b9050610fd8565b506110b18484846120eb565b50505050565b81600f0361112b576110ca338383611987565b600e5460405163a6904aa560e01b81526001600160a01b0385811660048301529091169063a6904aa5906024015b600060405180830381600087803b15801561111257600080fd5b505af1158015611126573d6000803e3d6000fd5b505050505b505050565b611138611d50565b6111545760405162461bcd60e51b81526004016109f990613844565b610a0b816122a0565b611165611d50565b6111ab5760405162461bcd60e51b81526020600482015260176024820152762737ba1030baba3437b934bd32b2103a379036b4b73a1760491b60448201526064016109f9565b60008251116111f35760405162461bcd60e51b815260206004820152601460248201527326b4b73a34b733903d32b937903a37b5b2b7399760611b60448201526064016109f9565b81518351146112375760405162461bcd60e51b815260206004820152601060248201526f2632b733ba341036b4b9b6b0ba31b41760811b60448201526064016109f9565b6000611242600c5490565b9050806000805b8651811015611318576000198782815181106112675761126761386c565b6020026020010151036112b157838782815181106112875761128761386c565b602090810291909101015261129d60018561391b565b93506112aa60018361391b565b9150611306565b838782815181106112c4576112c461386c565b6020026020010151106113065760405162461bcd60e51b815260206004820152600a6024820152691a5b9d985b1a59081a5960b21b60448201526064016109f9565b61131160018261391b565b9050611249565b50801561132d5761132a82828661237c565b50505b82600c81905550611126878787604051806020016040528060008152506123e0565b600180546107af906137db565b611364611d50565b6113805760405162461bcd60e51b81526004016109f990613844565b61112b83838361253b565b8161139581611dcf565b61112b8383612605565b81600c036113f45760016010556113b7338383611987565b600e5460105460405163e6a0816d60e01b815260048101919091526001600160a01b0385811660248301529091169063e6a0816d906044016110f8565b81600d0361140c5760026010556113b7338383611987565b81600e0361112b5760036010556113b7338383611987565b6060816001600160401b0381111561143e5761143e6130fd565b60405190808252806020026020018201604052801561147157816020015b606081526020019060019003908161145c5790505b50905060005b82811015611511576114e1308585848181106114955761149561386c565b90506020028101906114a7919061392e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126b492505050565b8282815181106114f3576114f361386c565b6020026020010181905250808061150990613902565b915050611477565b5092915050565b611520611d50565b6115665760405162461bcd60e51b81526020600482015260176024820152762737ba1030baba3437b934bd32b2103a379036b4b73a1760491b60448201526064016109f9565b600080611572600c5490565b905060001985036115a8578091506001600c6000828254611593919061391b565b909155506115a3905081856126e0565b6115e8565b8085106115e45760405162461bcd60e51b815260206004820152600a6024820152691a5b9d985b1a59081a5960b21b60448201526064016109f9565b8491505b6108ab868385604051806020016040528060008152506126f8565b81601c036108e3576000600f8190556010819055601181905560128190556013819055601455611634338383611987565b600e54600f54601054601154601254601354601454604051634244156f60e01b81526004810196909652602486019490945260448501929092526064840152608483015260a48201526001600160a01b0390911690634244156f9060c40161087d565b816005036116ec576001600f556116af338383611987565b600e54600f5460405163b29c8f6760e01b815260048101919091526001600160a01b0385811660248301529091169063b29c8f67906044016110f8565b81600603611704576002600f556116af338383611987565b8160070361112b576003600f556116af338383611987565b6006546001600160a01b031633146117465760405162461bcd60e51b81526004016109f990613844565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b816016036117b5576000601355611780338383611987565b600e546013546040516317a99b8160e11b81526001600160a01b0390921691632f5337029161087d9160040190815260200190565b816017036117cd576001601355611780338383611987565b816018036108e3576002601355611780338383611987565b816013036118325760006012556117fd338383611987565b600e54601254604051636046a33b60e11b81526001600160a01b039092169163c08d46769161087d9160040190815260200190565b8160140361184a5760016012556117fd338383611987565b816015036108e35760026012556117fd338383611987565b600580546107af906137db565b846001600160a01b03811633146118895761188933611dcf565b6108ab86868686866127d1565b336001600160a01b0384168114806118d357506001600160a01b0380851660009081526003602090815260408083209385168352929052205460ff165b6119135760405162461bcd60e51b81526020600482015260116024820152702ab730b8383937bb32b21031b0b63632b960791b60448201526064016109f9565b6001600160a01b03841660009081526002602090815260408083208684529091529020548211156119805760405162461bcd60e51b8152602060048201526017602482015276139bdd08195b9bdd59da081d1bdad95b9cc81bdddb9959604a1b60448201526064016109f9565b6110b18484845b6001600160a01b0383166119ce5760405162461bcd60e51b815260206004820152600e60248201526d232927a6afad22a927afa0a2222960911b60448201526064016109f9565b336119fd818560006119df87612859565b6119e887612859565b604051806020016040528060008152506128a4565b6001600160a01b038416600090815260026020908152604080832086845290915290205482811015611a415760405162461bcd60e51b81526004016109f99061397b565b6001600160a01b03858116600081815260026020908152604080832089845282528083208887039055805189815291820188905291938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b60606000611ab960095490565b905060006009805480602002602001604051908101604052809291908181526020018280548015611b0957602002820191906000526020600020905b815481526020019060010190808311611af5575b5050505050905060005b82811015611c0d57818181518110611b2d57611b2d61386c565b6020026020010151851015611bfb57600a6000838381518110611b5257611b5261386c565b602002602001015181526020019081526020016000208054611b73906137db565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9f906137db565b8015611bec5780601f10611bc157610100808354040283529160200191611bec565b820191906000526020600020905b815481529060010190602001808311611bcf57829003601f168201915b50505050509350505050919050565b611c0660018261391b565b9050611b13565b5060405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081d1bdad95b9259608a1b60448201526064016109f9565b606081600003611c6f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c995780611c8381613902565b9150611c929050600a836138c5565b9150611c73565b6000816001600160401b03811115611cb357611cb36130fd565b6040519080825280601f01601f191660200182016040528015611cdd576020820181803683370190505b5090505b8415611d4857611cf26001836139a5565b9150611cff600a866139b8565b611d0a90603061391b565b60f81b818381518110611d1f57611d1f61386c565b60200101906001600160f81b031916908160001a905350611d41600a866138c5565b9450611ce1565b949350505050565b6000611d646006546001600160a01b031690565b6001600160a01b0316336001600160a01b031614905090565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a35050565b600b5460ff1615610a0b576daaeb6d7670e522a718067333cd4e3b15610a0b57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6b91906139cc565b610a0b57604051633b79c77360e21b81526001600160a01b03821660048201526024016109f9565b6001600160a01b038516331480611ecd57506001600160a01b038516600090815260036020908152604080832033845290915290205460ff165b611f0e5760405162461bcd60e51b81526020600482015260126024820152710853d5d3915497d3d497d054141493d5915160721b60448201526064016109f9565b611f1b85858585856129b0565b5050505050565b600b805460ff19168215159081179091556040519081527f38475885990d8dfe9ca01f0ef160a1b5514426eab9ddbc953a3353410ba780969060200160405180910390a150565b6daaeb6d7670e522a718067333cd4e3b156108e3576001600160a01b0382163b15612014578015611fd457604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe9060440161087d565b60405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440161087d565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e4869060240161087d565b6127108111156120895760405162461bcd60e51b815260206004820152600f60248201526e45786365656473206d61782062707360881b60448201526064016109f9565b600780546001600160a01b0384166001600160b01b03199091168117600160a01b61ffff851602179091556040518281527f90d7ec04bcb8978719414f82e52e4cb651db41d0e6f8cea6118c2191e6183adb9060200160405180910390a25050565b6001600160a01b0383166121325760405162461bcd60e51b815260206004820152600e60248201526d232927a6afad22a927afa0a2222960911b60448201526064016109f9565b80518251146121535760405162461bcd60e51b81526004016109f9906138d9565b6000339050612176818560008686604051806020016040528060008152506128a4565b60005b83518110156122415760008482815181106121965761219661386c565b6020026020010151905060008483815181106121b4576121b461386c565b6020908102919091018101516001600160a01b03891660009081526002835260408082208683529093529190912054909150818110156122065760405162461bcd60e51b81526004016109f99061397b565b6001600160a01b038816600090815260026020908152604080832095835294905292909220910390558061223981613902565b915050612179565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516122929291906139e9565b60405180910390a450505050565b6000600580546122af906137db565b80601f01602080910402602001604051908101604052809291908181526020018280546122db906137db565b80156123285780601f106122fd57610100808354040283529160200191612328565b820191906000526020600020905b81548152906001019060200180831161230b57829003601f168201915b50505050509050816005908161233e9190613a5d565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a168183604051612370929190613b1c565b60405180910390a15050565b600080612389848661391b565b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af018190556000818152600a602052604090209092508291506123d78482613a5d565b50935093915050565b6001600160a01b0384166124065760405162461bcd60e51b81526004016109f990613b41565b81518351146124275760405162461bcd60e51b81526004016109f9906138d9565b33612437816000878787876128a4565b60005b84518110156124d3578381815181106124555761245561386c565b602002602001015160026000886001600160a01b03166001600160a01b0316815260200190815260200160002060008784815181106124965761249661386c565b6020026020010151815260200190815260200160002060008282546124bb919061391b565b909155508190506124cb81613902565b91505061243a565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516125249291906139e9565b60405180910390a4611f1b81600087878787612b5f565b61271081111561257f5760405162461bcd60e51b815260206004820152600f60248201526e45786365656473206d61782062707360881b60448201526064016109f9565b6040805180820182526001600160a01b038481168083526020808401868152600089815260088352869020945185546001600160a01b031916941693909317845591516001909301929092559151838152909185917f7365cf4122f072a3365c20d54eff9b38d73c096c28e1892ec8f5b0e403a0f12d91015b60405180910390a3505050565b336001600160a01b038316810361264f5760405162461bcd60e51b815260206004820152600e60248201526d20a8282927ab24a723afa9a2a62360911b60448201526064016109f9565b6001600160a01b03818116600081815260036020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191016125f8565b60606126d98383604051806060016040528060278152602001613ce960279139612cb2565b9392505050565b600082815260046020526040902061112b8282613a5d565b6001600160a01b03841661271e5760405162461bcd60e51b81526004016109f990613b41565b3361273e8160008761272f88612859565b61273888612859565b876128a4565b6001600160a01b03851660009081526002602090815260408083208784529091528120805485929061277190849061391b565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611f1b81600087878787612d8f565b6001600160a01b03851633148061280b57506001600160a01b038516600090815260036020908152604080832033845290915290205460ff165b61284c5760405162461bcd60e51b81526020600482015260126024820152710853d5d3915497d3d497d054141493d5915160721b60448201526064016109f9565b611f1b8585858585612e6c565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106128935761289361386c565b602090810291909101015292915050565b6001600160a01b03851661292b5760005b8351811015612929578281815181106128d0576128d061386c565b6020026020010151600d60008684815181106128ee576128ee61386c565b602002602001015181526020019081526020016000206000828254612913919061391b565b90915550612922905081613902565b90506128b5565b505b6001600160a01b0384166108ab5760005b8351811015611126578281815181106129575761295761386c565b6020026020010151600d60008684815181106129755761297561386c565b60200260200101518152602001908152602001600020600082825461299a91906139a5565b909155506129a9905081613902565b905061293c565b81518351146129d15760405162461bcd60e51b81526004016109f9906138d9565b6001600160a01b0384166129f75760405162461bcd60e51b81526004016109f990613b41565b33612a068187878787876128a4565b60005b8451811015612afd576000858281518110612a2657612a2661386c565b602002602001015190506000858381518110612a4457612a4461386c565b6020908102919091018101516001600160a01b038b166000908152600283526040808220868352909352919091205490915081811015612a965760405162461bcd60e51b81526004016109f99061397b565b6001600160a01b03808b16600090815260026020818152604080842088855282528084208787039055938d16835290815282822086835290529081208054849290612ae290849061391b565b9250508190555050505080612af690613902565b9050612a09565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612b4d9291906139e9565b60405180910390a46108ab8187878787875b6001600160a01b0384163b156108ab5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612ba39089908990889088908890600401613b67565b6020604051808303816000875af1925050508015612bde575060408051601f3d908101601f19168201909252612bdb91810190613bc5565b60015b612c6057612bea613be2565b806308c379a003612c235750612bfe613bfe565b80612c095750612c25565b8060405162461bcd60e51b81526004016109f99190613094565b505b60405162461bcd60e51b815260206004820152601060248201526f10a2a92198989a9aa922a1a2a4ab22a960811b60448201526064016109f9565b6001600160e01b0319811663bc197c8160e01b146111265760405162461bcd60e51b815260206004820152600f60248201526e1513d2d15394d7d491529150d51151608a1b60448201526064016109f9565b60606001600160a01b0384163b612d1a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016109f9565b600080856001600160a01b031685604051612d359190613c87565b600060405180830381855af49150503d8060008114612d70576040519150601f19603f3d011682016040523d82523d6000602084013e612d75565b606091505b5091509150612d85828286612f92565b9695505050505050565b6001600160a01b0384163b156108ab5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612dd39089908990889088908890600401613ca3565b6020604051808303816000875af1925050508015612e0e575060408051601f3d908101601f19168201909252612e0b91810190613bc5565b60015b612e1a57612bea613be2565b6001600160e01b0319811663f23a6e6160e01b146111265760405162461bcd60e51b815260206004820152600f60248201526e1513d2d15394d7d491529150d51151608a1b60448201526064016109f9565b6001600160a01b038416612e925760405162461bcd60e51b81526004016109f990613b41565b33612ea281878761272f88612859565b6001600160a01b038616600090815260026020908152604080832087845290915290205483811015612ee65760405162461bcd60e51b81526004016109f99061397b565b6001600160a01b0380881660009081526002602081815260408084208a855282528084208987039055938a16835290815282822088835290529081208054869290612f3290849061391b565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611126828888888888612d8f565b60608315612fa15750816126d9565b825115612fb15782518084602001fd5b8160405162461bcd60e51b81526004016109f99190613094565b80356001600160a01b0381168114612fe257600080fd5b919050565b60008060408385031215612ffa57600080fd5b61300383612fcb565b946020939093013593505050565b6001600160e01b031981168114610a0b57600080fd5b60006020828403121561303957600080fd5b81356126d981613011565b60005b8381101561305f578181015183820152602001613047565b50506000910152565b60008151808452613080816020860160208601613044565b601f01601f19169290920160200192915050565b6020815260006126d96020830184613068565b600080604083850312156130ba57600080fd5b50508035926020909101359150565b6000602082840312156130db57600080fd5b5035919050565b6000602082840312156130f457600080fd5b6126d982612fcb565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715613138576131386130fd565b6040525050565b60006001600160401b03821115613158576131586130fd565b5060051b60200190565b600082601f83011261317357600080fd5b813560206131808261313f565b60405161318d8282613113565b83815260059390931b85018201928281019150868411156131ad57600080fd5b8286015b848110156131c857803583529183019183016131b1565b509695505050505050565b600082601f8301126131e457600080fd5b81356001600160401b038111156131fd576131fd6130fd565b604051613214601f8301601f191660200182613113565b81815284602083860101111561322957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561325e57600080fd5b61326786612fcb565b945061327560208701612fcb565b935060408601356001600160401b038082111561329157600080fd5b61329d89838a01613162565b945060608801359150808211156132b357600080fd5b6132bf89838a01613162565b935060808801359150808211156132d557600080fd5b506132e2888289016131d3565b9150509295509295909350565b8015158114610a0b57600080fd5b60006020828403121561330f57600080fd5b81356126d9816132ef565b6000806040838503121561332d57600080fd5b82356001600160401b038082111561334457600080fd5b818501915085601f83011261335857600080fd5b813560206133658261313f565b6040516133728282613113565b83815260059390931b850182019282810191508984111561339257600080fd5b948201945b838610156133b7576133a886612fcb565b82529482019490820190613397565b965050860135925050808211156133cd57600080fd5b506133da85828601613162565b9150509250929050565b600081518084526020808501945080840160005b83811015613414578151875295820195908201906001016133f8565b509495945050505050565b6020815260006126d960208301846133e4565b60008060006060848603121561344757600080fd5b61345084612fcb565b925060208401356001600160401b038082111561346c57600080fd5b61347887838801613162565b9350604086013591508082111561348e57600080fd5b5061349b86828701613162565b9150509250925092565b6000806000606084860312156134ba57600080fd5b6134c384612fcb565b95602085013595506040909401359392505050565b6000602082840312156134ea57600080fd5b81356001600160401b0381111561350057600080fd5b611d48848285016131d3565b6000806000806080858703121561352257600080fd5b61352b85612fcb565b935060208501356001600160401b038082111561354757600080fd5b61355388838901613162565b9450604087013591508082111561356957600080fd5b61357588838901613162565b9350606087013591508082111561358b57600080fd5b50613598878288016131d3565b91505092959194509250565b6000806000606084860312156135b957600080fd5b833592506135c960208501612fcb565b9150604084013590509250925092565b600080604083850312156135ec57600080fd5b6135f583612fcb565b91506020830135613605816132ef565b809150509250929050565b6000806020838503121561362357600080fd5b82356001600160401b038082111561363a57600080fd5b818501915085601f83011261364e57600080fd5b81358181111561365d57600080fd5b8660208260051b850101111561367257600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156136d957603f198886030184526136c7858351613068565b945092850192908501906001016136ab565b5092979650505050505050565b600080600080608085870312156136fc57600080fd5b61370585612fcb565b93506020850135925060408501356001600160401b0381111561372757600080fd5b613733878288016131d3565b949793965093946060013593505050565b6000806040838503121561375757600080fd5b61376083612fcb565b915061376e60208401612fcb565b90509250929050565b600080600080600060a0868803121561378f57600080fd5b61379886612fcb565b94506137a660208701612fcb565b9350604086013592506060860135915060808601356001600160401b038111156137cf57600080fd5b6132e2888289016131d3565b600181811c908216806137ef57607f821691505b60208210810361380f57634e487b7160e01b600052602260045260246000fd5b50919050565b60008351613827818460208801613044565b83519083019061383b818360208801613044565b01949350505050565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761079c5761079c613882565b634e487b7160e01b600052601260045260246000fd5b6000826138d4576138d46138af565b500490565b6020808252600f908201526e0988a9c8ea890be9a92a69a82a8869608b1b604082015260600190565b60006001820161391457613914613882565b5060010190565b8082018082111561079c5761079c613882565b6000808335601e1984360301811261394557600080fd5b8301803591506001600160401b0382111561395f57600080fd5b60200191503681900382131561397457600080fd5b9250929050565b60208082526010908201526f125394d551919250d251539517d0905360821b604082015260600190565b8181038181111561079c5761079c613882565b6000826139c7576139c76138af565b500690565b6000602082840312156139de57600080fd5b81516126d9816132ef565b6040815260006139fc60408301856133e4565b8281036020840152613a0e81856133e4565b95945050505050565b601f82111561112b57600081815260208120601f850160051c81016020861015613a3e5750805b601f850160051c820191505b818110156108ab57828155600101613a4a565b81516001600160401b03811115613a7657613a766130fd565b613a8a81613a8484546137db565b84613a17565b602080601f831160018114613abf5760008415613aa75750858301515b600019600386901b1c1916600185901b1785556108ab565b600085815260208120601f198616915b82811015613aee57888601518255948401946001909101908401613acf565b5085821015613b0c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b604081526000613b2f6040830185613068565b8281036020840152613a0e8185613068565b6020808252600c908201526b2a27afad22a927afa0a2222960a11b604082015260600190565b6001600160a01b0386811682528516602082015260a060408201819052600090613b93908301866133e4565b8281036060840152613ba581866133e4565b90508281036080840152613bb98185613068565b98975050505050505050565b600060208284031215613bd757600080fd5b81516126d981613011565b600060033d1115613bfb5760046000803e5060005160e01c5b90565b600060443d1015613c0c5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613c3b57505050505090565b8285019150815181811115613c535750505050505090565b843d8701016020828501011115613c6d5750505050505090565b613c7c60208286010187613113565b509095945050505050565b60008251613c99818460208701613044565b9190910192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613cdd90830184613068565b97965050505050505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208cb489569651a144002791ea4b73ae7b25a475082032419c9da2291ef09d454a64736f6c63430008120033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000004f495c2d2dfdab8fcb995d575ca85dc84e400fd70000000000000000000000000000000000000000000000000000000000000002000000000000000000000000760b3adb45c7e927d32fb052c2977de4857563ed000000000000000000000000000000000000000000000000000000000000001350726f6a656374204d617968656d204e465473000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003504d4e0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Project Mayhem NFTs
Arg [1] : _symbol (string): PMN
Arg [2] : _royaltyRecipient (address): 0x4F495c2d2dfDAb8FCb995D575Ca85dc84e400fD7
Arg [3] : _royaltyBps (uint128): 2
Arg [4] : _erc20Contract (address): 0x760b3adB45c7e927d32fB052c2977de4857563eD

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000004f495c2d2dfdab8fcb995d575ca85dc84e400fd7
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [4] : 000000000000000000000000760b3adb45c7e927d32fb052c2977de4857563ed
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [6] : 50726f6a656374204d617968656d204e46547300000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 504d4e0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

59373:18167:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48180:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;597:25:1;;;585:2;570:18;48180:64:0;;;;;;;;67144:455;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;67144:455:0;1019:187:1;47946:18:0;;;:::i;:::-;;;;;;;:::i;76445:644::-;;;;;;:::i;:::-;;:::i;:::-;;61357:367;;;;;;:::i;:::-;;:::i;14848:178::-;;;;;;:::i;:::-;;:::i;10847:208::-;;;;;;:::i;:::-;;:::i;32789:357::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;2788:32:1;;;2770:51;;2852:2;2837:18;;2830:34;;;;2743:18;32789:357:0;2596:274:1;60507:22:0;;;;;;68878:311;;;;;;:::i;:::-;;:::i;74589:594::-;;;;;;:::i;:::-;;:::i;2722:211::-;;;;;;:::i;:::-;;:::i;60658:35::-;;;;;-1:-1:-1;;;;;60658:35:0;;;;;;-1:-1:-1;;;;;6219:32:1;;;6201:51;;6189:2;6174:18;60658:35:0;6055:203:1;67865:111:0;67950:18;;67865:111;;71381:744;;;;;;:::i;:::-;;:::i;6392:143::-;;6492:42;6392:143;;60479:21;;;;;;33393:388;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6692:32:1;;;6674:51;;6773:6;6761:19;;;6756:2;6741:18;;6734:47;6647:18;33393:388:0;6502:285:1;49353:498:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2682:31::-;;;;;;;;;9298:202;;;;;;:::i;:::-;;:::i;72833:759::-;;;;;;:::i;:::-;;:::i;34497:262::-;;;;;;:::i;:::-;;:::i;10541:98::-;10616:8;:15;10541:98;;60625:26;;;;;;66296:579;;;;;;:::i;:::-;;:::i;74313:268::-;;;;;;:::i;:::-;;:::i;14578:88::-;14652:6;;-1:-1:-1;;;;;14652:6:0;14578:88;;27332:194;;;;;;:::i;:::-;;:::i;64226:1086::-;;;;;;:::i;:::-;;:::i;47971:20::-;;;:::i;35720:298::-;;;;;;:::i;:::-;;:::i;68216:234::-;;;;;;:::i;:::-;;:::i;60564:22::-;;;;;;60444:28;;;;;-1:-1:-1;;;;;60444:28:0;;;73600:705;;;;;;:::i;:::-;;:::i;60593:25::-;;;;;;25084:325;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;62672:660::-;;;;;;:::i;:::-;;:::i;33896:146::-;33997:16;;-1:-1:-1;;;;;33997:16:0;;;-1:-1:-1;;;34022:10:0;;;;33896:146;;77097:440;;;;;;:::i;:::-;;:::i;72133:692::-;;;;;;:::i;:::-;;:::i;60204:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;71184:118;;;;;;:::i;:::-;;:::i;75803:634::-;;;;;;:::i;:::-;;:::i;75191:604::-;;;;;;:::i;:::-;;:::i;26884:34::-;;;:::i;48253:68::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;68522:279;;;;;;:::i;:::-;;:::i;60536:21::-;;;;;;65606:387;;;;;;:::i;:::-;;:::i;67144:455::-;67247:4;-1:-1:-1;;;;;;;;;67284:25:0;;;;:101;;-1:-1:-1;;;;;;;;;;67360:25:0;;;67284:101;:178;;;-1:-1:-1;;;;;;;;;;67437:25:0;;;67284:178;:282;;;-1:-1:-1;;;;;;;67525:41:0;;-1:-1:-1;;;67525:41:0;67284:282;67264:302;67144:455;-1:-1:-1;;67144:455:0:o;47946:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;76445:644::-;76544:2;76550;76544:8;76541:541;;76582:1;76568:11;:15;76598:35;76604:10;76616:2;76620:12;76598:5;:35::i;:::-;76661:13;;76694:11;;76648:58;;-1:-1:-1;;;76648:58:0;;-1:-1:-1;;;;;76661:13:0;;;;76648:45;;:58;;;;597:25:1;;;585:2;570:18;;451:177;76648:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76445:644;;:::o;76541:541::-;76726:2;76732;76726:8;76723:359;;76764:1;76750:11;:15;76780:35;76786:10;76798:2;76802:12;76780:5;:35::i;76723:359::-;76908:2;76914;76908:8;76905:177;;76946:1;76932:11;:15;76962:35;76968:10;76980:2;76984:12;76962:5;:35::i;76905:177::-;76445:644;;:::o;61357:367::-;61452:25;61480:14;;;:4;:14;;;;;61452:42;;61426:13;;61452:25;61480:14;61452:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61537:1;61515:11;61509:25;:29;61505:80;;;61562:11;61357:367;-1:-1:-1;;61357:367:0:o;61505:80::-;61597:22;61622:21;61634:8;61622:11;:21::i;:::-;61597:46;;61685:8;61695:19;:8;:17;:19::i;:::-;61668:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61654:62;;;;61357:367;;;:::o;14848:178::-;14919:14;:12;:14::i;:::-;14914:72;;14950:24;;-1:-1:-1;;;14950:24:0;;;;;;;:::i;:::-;;;;;;;;14914:72;14996:22;15008:9;14996:11;:22::i;:::-;14848:178;:::o;10847:208::-;10911:7;10945:17;10616:8;:15;;10541:98;10945:17;10935:6;:27;10931:83;;10979:23;;-1:-1:-1;;;10979:23:0;;15840:2:1;10979:23:0;;;15822:21:1;15879:2;15859:18;;;15852:30;-1:-1:-1;;;15898:18:1;;;15891:43;15951:18;;10979:23:0;15638:337:1;10931:83:0;11031:8;11040:6;11031:16;;;;;;;;:::i;:::-;;;;;;;;;11024:23;;10847:208;;;:::o;32789:357::-;32931:16;32949:21;32989:17;33008:11;33023:31;33046:7;33023:22;:31::i;:::-;32988:66;;-1:-1:-1;32988:66:0;;-1:-1:-1;32988:66:0;;;-1:-1:-1;33132:6:0;33113:15;32988:66;33113:9;:15;:::i;:::-;33112:26;;;;:::i;:::-;33096:42;;32977:169;;32789:357;;;;;:::o;68878:311::-;69107:4;-1:-1:-1;;;;;7239:18:0;;7247:10;7239:18;7235:83;;7274:32;7295:10;7274:20;:32::i;:::-;69124:57:::1;69152:4;69158:2;69162:3;69167:7;69176:4;69124:27;:57::i;74589:594::-:0;74683:2;74689;74683:8;74680:496;;74716:1;74707:6;:10;74732:35;74738:10;74750:2;74754:12;74732:5;:35::i;:::-;74795:13;;74823:6;;74782:48;;-1:-1:-1;;;74782:48:0;;-1:-1:-1;;;;;74795:13:0;;;;74782:40;;:48;;;;597:25:1;;;585:2;570:18;;451:177;74680:496:0;74850:2;74856;74850:8;74847:329;;74883:1;74874:6;:10;74899:35;74905:10;74917:2;74921:12;74899:5;:35::i;74847:329::-;75017:2;75023;75017:8;75014:162;;75050:1;75041:6;:10;75066:35;75072:10;75084:2;75088:12;75066:5;:35::i;2722:211::-;2801:28;:26;:28::i;:::-;2793:84;;;;-1:-1:-1;;;2793:84:0;;16876:2:1;2793:84:0;;;16858:21:1;16915:2;16895:18;;;16888:30;16954:34;16934:18;;;16927:62;-1:-1:-1;;;17005:18:1;;;16998:41;17056:19;;2793:84:0;16674:407:1;2793:84:0;2888:37;2912:12;2888:23;:37::i;71381:744::-;71474:2;71480:1;71474:7;71471:647;;71506:1;71497:6;:10;71522:35;71528:10;71540:2;71544:12;71522:5;:35::i;:::-;71585:13;;71610:6;;71572:45;;-1:-1:-1;;;71572:45:0;;-1:-1:-1;;;;;71585:13:0;;;;71572:37;;:45;;;;597:25:1;;;585:2;570:18;;451:177;71471:647:0;71637:2;71643:1;71637:7;71634:484;;71669:1;71660:6;:10;71685:35;71691:10;71703:2;71707:12;71685:5;:35::i;71634:484::-;71800:2;71806:1;71800:7;71797:321;;71832:1;71823:6;:10;71848:35;71854:10;71866:2;71870:12;71848:5;:35::i;71797:321::-;71963:2;71969:1;71963:7;71960:158;;71995:1;71986:6;:10;72011:35;72017:10;72029:2;72033:12;72011:5;:35::i;33393:388::-;33473:7;33538:29;;;:19;:29;;;;;;;;33501:66;;;;;;;;;;-1:-1:-1;;;;;33501:66:0;;;;;;;;;;;;;;;;33473:7;;33600:39;:173;;33718:25;;33752:19;;;;33600:173;;;33660:16;;-1:-1:-1;;;;;33660:16:0;;;-1:-1:-1;;;33685:10:0;;;;33600:173;33580:193;;;;;33393:388;;;:::o;49353:498::-;49509:16;49570:3;:10;49551:8;:15;:29;49543:57;;;;-1:-1:-1;;;49543:57:0;;;;;;;:::i;:::-;49613:30;49660:8;:15;-1:-1:-1;;;;;49646:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49646:30:0;;49613:63;;49694:9;49689:122;49713:8;:15;49709:1;:19;49689:122;;;49769:9;:22;49779:8;49788:1;49779:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;49769:22:0;-1:-1:-1;;;;;49769:22:0;;;;;;;;;;;;:30;49792:3;49796:1;49792:6;;;;;;;;:::i;:::-;;;;;;;49769:30;;;;;;;;;;;;49750:13;49764:1;49750:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;49730:3;;;:::i;:::-;;;49689:122;;;-1:-1:-1;49830:13:0;49353:498;-1:-1:-1;;;49353:498:0:o;9298:202::-;9378:28;:26;:28::i;:::-;9370:81;;;;-1:-1:-1;;;9370:81:0;;17772:2:1;9370:81:0;;;17754:21:1;17811:2;17791:18;;;17784:30;17850:34;17830:18;;;17823:62;-1:-1:-1;;;17901:18:1;;;17894:38;17949:19;;9370:81:0;17570:404:1;9370:81:0;9462:30;9472:13;9487:4;9462:9;:30::i;72833:759::-;72927:2;72933:1;72927:7;72924:661;;72960:1;72950:7;:11;72976:35;72982:10;72994:2;72998:12;72976:5;:35::i;:::-;73039:13;;73065:7;;73026:47;;-1:-1:-1;;;73026:47:0;;-1:-1:-1;;;;;73039:13:0;;;;73026:38;;:47;;;;597:25:1;;;585:2;570:18;;451:177;72924:661:0;73093:2;73099:1;73093:7;73090:495;;73126:1;73116:7;:11;73142:35;73148:10;73160:2;73164:12;73142:5;:35::i;73090:495::-;73259:2;73265;73259:8;73256:329;;73293:1;73283:7;:11;73309:35;73315:10;73327:2;73331:12;73309:5;:35::i;73256:329::-;73426:2;73432;73426:8;73423:162;;73460:1;73450:7;:11;73476:35;73482:10;73494:2;73498:12;73476:5;:35::i;34497:262::-;34610:20;:18;:20::i;:::-;34605:78;;34647:24;;-1:-1:-1;;;34647:24:0;;;;;;;:::i;34605:78::-;34695:56;34720:17;34739:11;34695:24;:56::i;66296:579::-;66465:10;-1:-1:-1;;;;;66496:16:0;;;;;:52;;-1:-1:-1;;;;;;66516:24:0;;;;;;;:16;:24;;;;;;;;:32;;;;;;;;;;;;66496:52;66488:82;;;;-1:-1:-1;;;66488:82:0;;18181:2:1;66488:82:0;;;18163:21:1;18220:2;18200:18;;;18193:30;-1:-1:-1;;;18239:18:1;;;18232:47;18296:18;;66488:82:0;17979:341:1;66488:82:0;66609:8;:15;66589:9;:16;:35;66581:63;;;;-1:-1:-1;;;66581:63:0;;18527:2:1;66581:63:0;;;18509:21:1;18566:2;18546:18;;;18539:30;-1:-1:-1;;;18585:18:1;;;18578:45;18640:18;;66581:63:0;18325:339:1;66581:63:0;66662:9;66657:159;66681:9;:16;66677:1;:20;66657:159;;;66765:8;66774:1;66765:11;;;;;;;;:::i;:::-;;;;;;;66730:9;:17;66740:6;-1:-1:-1;;;;;66730:17:0;-1:-1:-1;;;;;66730:17:0;;;;;;;;;;;;:31;66748:9;66758:1;66748:12;;;;;;;;:::i;:::-;;;;;;;66730:31;;;;;;;;;;;;:46;;66722:82;;;;-1:-1:-1;;;66722:82:0;;18871:2:1;66722:82:0;;;18853:21:1;18910:2;18890:18;;;18883:30;-1:-1:-1;;;18929:18:1;;;18922:53;18992:18;;66722:82:0;18669:347:1;66722:82:0;66699:6;66704:1;66699:6;;:::i;:::-;;;66657:159;;;;66828:39;66839:6;66847:9;66858:8;66828:10;:39::i;:::-;66437:438;66296:579;;;:::o;74313:268::-;74431:2;74437;74431:8;74428:146;;74455:35;74461:10;74473:2;74477:12;74455:5;:35::i;:::-;74518:13;;74505:57;;-1:-1:-1;;;74505:57:0;;-1:-1:-1;;;;;6219:32:1;;;74505:57:0;;;6201:51:1;74518:13:0;;;;74505:48;;6174:18:1;;74505:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74428:146;74313:268;;;:::o;27332:194::-;27410:20;:18;:20::i;:::-;27405:78;;27447:24;;-1:-1:-1;;;27447:24:0;;;;;;;:::i;27405:78::-;27495:23;27513:4;27495:17;:23::i;64226:1086::-;64416:10;:8;:10::i;:::-;64408:46;;;;-1:-1:-1;;;64408:46:0;;19353:2:1;64408:46:0;;;19335:21:1;19392:2;19372:18;;;19365:30;-1:-1:-1;;;19411:18:1;;;19404:53;19474:18;;64408:46:0;19151:347:1;64408:46:0;64491:1;64473:8;:15;:19;64465:52;;;;-1:-1:-1;;;64465:52:0;;19705:2:1;64465:52:0;;;19687:21:1;19744:2;19724:18;;;19717:30;-1:-1:-1;;;19763:18:1;;;19756:50;19823:18;;64465:52:0;19503:344:1;64465:52:0;64556:8;:15;64536:9;:16;:35;64528:64;;;;-1:-1:-1;;;64528:64:0;;20054:2:1;64528:64:0;;;20036:21:1;20093:2;20073:18;;;20066:30;-1:-1:-1;;;20112:18:1;;;20105:46;20168:18;;64528:64:0;19852:340:1;64528:64:0;64605:20;64628:19;67950:18;;;67865:111;64628:19;64605:42;-1:-1:-1;64605:42:0;64658:25;;64744:342;64768:9;:16;64764:1;:20;64744:342;;;-1:-1:-1;;64813:9:0;64823:1;64813:12;;;;;;;;:::i;:::-;;;;;;;:33;64809:266;;64882:12;64867:9;64877:1;64867:12;;;;;;;;:::i;:::-;;;;;;;;;;:27;64915:17;64931:1;64915:17;;:::i;:::-;;-1:-1:-1;64951:17:0;64967:1;64951:17;;:::i;:::-;;;64809:266;;;65032:12;65017:9;65027:1;65017:12;;;;;;;;:::i;:::-;;;;;;;:27;65009:50;;;;-1:-1:-1;;;65009:50:0;;20399:2:1;65009:50:0;;;20381:21:1;20438:2;20418:18;;;20411:30;-1:-1:-1;;;20457:18:1;;;20450:40;20507:18;;65009:50:0;20197:334:1;65009:50:0;64786:6;64791:1;64786:6;;:::i;:::-;;;64744:342;;;-1:-1:-1;65102:16:0;;65098:110;;65135:61;65154:17;65173:12;65187:8;65135:18;:61::i;:::-;;;65098:110;65241:12;65220:18;:33;;;;65264:40;65275:3;65280:9;65291:8;65264:40;;;;;;;;;;;;:10;:40::i;47971:20::-;;;;;;;:::i;35720:298::-;35872:20;:18;:20::i;:::-;35867:78;;35909:24;;-1:-1:-1;;;35909:24:0;;;;;;;:::i;35867:78::-;35957:53;35983:8;35993:10;36005:4;35957:25;:53::i;68216:234::-;68373:8;7419:30;7440:8;7419:20;:30::i;:::-;68399:43:::1;68423:8;68433;68399:23;:43::i;73600:705::-:0;73718:2;73724;73718:8;73715:583;;73752:1;73742:7;:11;73768:35;73774:10;73786:2;73790:12;73768:5;:35::i;:::-;73831:13;;73877:7;;73818:76;;-1:-1:-1;;;73818:76:0;;;;;20710:25:1;;;;-1:-1:-1;;;;;20771:32:1;;;20751:18;;;20744:60;73831:13:0;;;;73818:58;;20683:18:1;;73818:76:0;20536:274:1;73715:583:0;73914:2;73920;73914:8;73911:387;;73948:1;73938:7;:11;73964:35;73970:10;73982:2;73986:12;73964:5;:35::i;73911:387::-;74110:2;74116;74110:8;74107:191;;74144:1;74134:7;:11;74160:35;74166:10;74178:2;74182:12;74160:5;:35::i;25084:325::-;25161:22;25218:4;-1:-1:-1;;;;;25206:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25196:34;;25246:9;25241:136;25261:15;;;25241:136;;;25311:54;25350:4;25357;;25362:1;25357:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;25311:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25311:30:0;;-1:-1:-1;;;25311:54:0:i;:::-;25298:7;25306:1;25298:10;;;;;;;;:::i;:::-;;;;;;:67;;;;25278:3;;;;;:::i;:::-;;;;25241:136;;;;25084:325;;;;:::o;62672:660::-;62838:10;:8;:10::i;:::-;62830:46;;;;-1:-1:-1;;;62830:46:0;;19353:2:1;62830:46:0;;;19335:21:1;19392:2;19372:18;;;19365:30;-1:-1:-1;;;19411:18:1;;;19404:53;19474:18;;62830:46:0;19151:347:1;62830:46:0;62889:21;62921:20;62944:19;67950:18;;;67865:111;62944:19;62921:42;;-1:-1:-1;;62980:8:0;:29;62976:298;;63042:12;63026:28;;63091:1;63069:18;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;63107:37:0;;-1:-1:-1;63120:12:0;63134:9;63107:12;:37::i;:::-;62976:298;;;63196:12;63185:8;:23;63177:46;;;;-1:-1:-1;;;63177:46:0;;20399:2:1;63177:46:0;;;20381:21:1;20438:2;20418:18;;;20411:30;-1:-1:-1;;;20457:18:1;;;20450:40;20507:18;;63177:46:0;20197:334:1;63177:46:0;63254:8;63238:24;;62976:298;63286:38;63292:3;63297:13;63312:7;63286:38;;;;;;;;;;;;:5;:38::i;77097:440::-;77187:2;77193;77187:8;77184:346;;77220:1;77211:6;:10;;;77236:7;:11;;;77262:6;:10;;;77287:7;:11;;;77313:10;:14;;;77342:11;:15;77372:35;77378:10;77390:2;77394:12;77372:5;:35::i;:::-;77435:13;;77460:6;;77468:7;;77477:6;;77485:7;;77494:10;;77506:11;;77422:96;;-1:-1:-1;;;77422:96:0;;;;;21628:25:1;;;;21669:18;;;21662:34;;;;21712:18;;;21705:34;;;;21755:18;;;21748:34;21798:19;;;21791:35;21842:19;;;21835:35;-1:-1:-1;;;;;77435:13:0;;;;77422:37;;21600:19:1;;77422:96:0;21341:535:1;72133:692:0;72250:2;72256:1;72250:7;72247:571;;72282:1;72273:6;:10;72298:35;72304:10;72316:2;72320:12;72298:5;:35::i;:::-;72361:13;;72406:6;;72348:74;;-1:-1:-1;;;72348:74:0;;;;;20710:25:1;;;;-1:-1:-1;;;;;20771:32:1;;;20751:18;;;20744:60;72361:13:0;;;;72348:57;;20683:18:1;;72348:74:0;20536:274:1;72247:571:0;72442:2;72448:1;72442:7;72439:379;;72474:1;72465:6;:10;72490:35;72496:10;72508:2;72512:12;72490:5;:35::i;72439:379::-;72634:2;72640:1;72634:7;72631:187;;72666:1;72657:6;:10;72682:35;72688:10;72700:2;72704:12;72682:5;:35::i;71184:118::-;14422:6;;-1:-1:-1;;;;;14422:6:0;14408:10;:20;14404:77;;14445:24;;-1:-1:-1;;;14445:24:0;;;;;;;:::i;14404:77::-;71264:13:::1;:30:::0;;-1:-1:-1;;;;;;71264:30:0::1;-1:-1:-1::0;;;;;71264:30:0;;;::::1;::::0;;;::::1;::::0;;71184:118::o;75803:634::-;75901:2;75907;75901:8;75898:532;;75938:1;75925:10;:14;75954:35;75960:10;75972:2;75976:12;75954:5;:35::i;:::-;76017:13;;76049:10;;76004:56;;-1:-1:-1;;;76004:56:0;;-1:-1:-1;;;;;76017:13:0;;;;76004:44;;:56;;;;597:25:1;;;585:2;570:18;;451:177;75898:532:0;76080:2;76086;76080:8;76077:353;;76117:1;76104:10;:14;76133:35;76139:10;76151:2;76155:12;76133:5;:35::i;76077:353::-;76259:2;76265;76259:8;76256:174;;76296:1;76283:10;:14;76312:35;76318:10;76330:2;76334:12;76312:5;:35::i;75191:604::-;75286:2;75292;75286:8;75283:505;;75320:1;75310:7;:11;75336:35;75342:10;75354:2;75358:12;75336:5;:35::i;:::-;75399:13;;75428:7;;75386:50;;-1:-1:-1;;;75386:50:0;;-1:-1:-1;;;;;75399:13:0;;;;75386:41;;:50;;;;597:25:1;;;585:2;570:18;;451:177;75283:505:0;75456:2;75462;75456:8;75453:335;;75490:1;75480:7;:11;75506:35;75512:10;75524:2;75528:12;75506:5;:35::i;75453:335::-;75626:2;75632;75626:8;75623:165;;75660:1;75650:7;:11;75676:35;75682:10;75694:2;75698:12;75676:5;:35::i;26884:34::-;;;;;;;:::i;68522:279::-;68726:4;-1:-1:-1;;;;;7239:18:0;;7247:10;7239:18;7235:83;;7274:32;7295:10;7274:20;:32::i;:::-;68743:50:::1;68766:4;68772:2;68776;68780:6;68788:4;68743:22;:50::i;65606:387::-:0;65750:10;-1:-1:-1;;;;;65781:16:0;;;;;:52;;-1:-1:-1;;;;;;65801:24:0;;;;;;;:16;:24;;;;;;;;:32;;;;;;;;;;;;65781:52;65773:82;;;;-1:-1:-1;;;65773:82:0;;18181:2:1;65773:82:0;;;18163:21:1;18220:2;18200:18;;;18193:30;-1:-1:-1;;;18239:18:1;;;18232:47;18296:18;;65773:82:0;17979:341:1;65773:82:0;-1:-1:-1;;;;;65874:17:0;;;;;;:9;:17;;;;;;;;:27;;;;;;;;;:38;-1:-1:-1;65874:38:0;65866:74;;;;-1:-1:-1;;;65866:74:0;;18871:2:1;65866:74:0;;;18853:21:1;18910:2;18890:18;;;18883:30;-1:-1:-1;;;18929:18:1;;;18922:53;18992:18;;65866:74:0;18669:347:1;65866:74:0;65953:32;65959:6;65967:8;65977:7;54411:605;-1:-1:-1;;;;;54538:18:0;;54530:45;;;;-1:-1:-1;;;54530:45:0;;22083:2:1;54530:45:0;;;22065:21:1;22122:2;22102:18;;;22095:30;-1:-1:-1;;;22141:18:1;;;22134:44;22195:18;;54530:45:0;21881:338:1;54530:45:0;54607:10;54630:102;54607:10;54661:4;54588:16;54679:21;54697:2;54679:17;:21::i;:::-;54702:25;54720:6;54702:17;:25::i;:::-;54630:102;;;;;;;;;;;;:20;:102::i;:::-;-1:-1:-1;;;;;54767:15:0;;54745:19;54767:15;;;:9;:15;;;;;;;;:19;;;;;;;;;54805:21;;;;54797:50;;;;-1:-1:-1;;;54797:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54883:15:0;;;;;;;:9;:15;;;;;;;;:19;;;;;;;;54905:20;;;54883:42;;54954:54;;22743:25:1;;;22784:18;;;22777:34;;;54883:15:0;;54954:54;;;;;22716:18:1;54954:54:0;;;;;;;54519:497;;54411:605;;;:::o;11748:400::-;11810:13;11836:25;11864:17;10616:8;:15;;10541:98;11864:17;11836:45;;11892:24;11919:8;11892:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11945:9;11940:165;11964:17;11960:1;:21;11940:165;;;12021:7;12029:1;12021:10;;;;;;;;:::i;:::-;;;;;;;12010:8;:21;12006:88;;;12059:7;:19;12067:7;12075:1;12067:10;;;;;;;;:::i;:::-;;;;;;;12059:19;;;;;;;;;;;12052:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11748:400;;;:::o;12006:88::-;11983:6;11988:1;11983:6;;:::i;:::-;;;11940:165;;;-1:-1:-1;12115:25:0;;-1:-1:-1;;;12115:25:0;;23024:2:1;12115:25:0;;;23006:21:1;23063:2;23043:18;;;23036:30;-1:-1:-1;;;23082:18:1;;;23075:45;23137:18;;12115:25:0;22822:339:1;366:723:0;422:13;643:5;652:1;643:10;639:53;;-1:-1:-1;;670:10:0;;;;;;;;;;;;-1:-1:-1;;;670:10:0;;;;;366:723::o;639:53::-;717:5;702:12;758:78;765:9;;758:78;;791:8;;;;:::i;:::-;;-1:-1:-1;814:10:0;;-1:-1:-1;822:2:0;814:10;;:::i;:::-;;;758:78;;;846:19;878:6;-1:-1:-1;;;;;868:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;868:17:0;;846:39;;896:154;903:10;;896:154;;930:11;940:1;930:11;;:::i;:::-;;-1:-1:-1;999:10:0;1007:2;999:5;:10;:::i;:::-;986:24;;:2;:24;:::i;:::-;973:39;;956:6;963;956:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;956:56:0;;;;;;;;-1:-1:-1;1027:11:0;1036:2;1027:11;;:::i;:::-;;;896:154;;;1074:6;366:723;-1:-1:-1;;;;366:723:0:o;69891:117::-;69955:4;69993:7;14652:6;;-1:-1:-1;;;;;14652:6:0;;14578:88;69993:7;-1:-1:-1;;;;;69979:21:0;:10;-1:-1:-1;;;;;69979:21:0;;69972:28;;69891:117;:::o;15144:177::-;15225:6;;;-1:-1:-1;;;;;15242:18:0;;;-1:-1:-1;;;;;;15242:18:0;;;;;;;15278:35;;15225:6;;;15242:18;15225:6;;15278:35;;15204:18;;15278:35;15193:128;15144:177;:::o;7477:486::-;7668:19;;;;7664:292;;;6492:42;7708:45;:49;7704:241;;7783:67;;-1:-1:-1;;;7783:67:0;;7834:4;7783:67;;;23628:34:1;-1:-1:-1;;;;;23698:15:1;;23678:18;;;23671:43;6492:42:0;;7783;;23563:18:1;;7783:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7778:152;;7882:28;;-1:-1:-1;;;7882:28:0;;-1:-1:-1;;;;;6219:32:1;;7882:28:0;;;6201:51:1;6174:18;;7882:28:0;6055:203:1;50693:369:0;-1:-1:-1;;;;;50912:18:0;;50920:10;50912:18;;:56;;-1:-1:-1;;;;;;50934:22:0;;;;;;:16;:22;;;;;;;;50957:10;50934:34;;;;;;;;;;50912:56;50904:87;;;;-1:-1:-1;;;50904:87:0;;24177:2:1;50904:87:0;;;24159:21:1;24216:2;24196:18;;;24189:30;-1:-1:-1;;;24235:18:1;;;24228:48;24293:18;;50904:87:0;23975:342:1;50904:87:0;51002:52;51025:4;51031:2;51035:3;51040:7;51049:4;51002:22;:52::i;:::-;50693:369;;;;;:::o;2941:163::-;3013:19;:34;;-1:-1:-1;;3013:34:0;;;;;;;;;;3063:33;;1159:41:1;;;3063:33:0;;1147:2:1;1132:18;3063:33:0;;;;;;;2941:163;:::o;7971:798::-;6492:42;8108:45;:49;8104:658;;-1:-1:-1;;;;;8233:51:0;;;:55;8229:522;;8358:9;8354:293;;;8392:92;;-1:-1:-1;;;8392:92:0;;8446:4;8392:92;;;23628:34:1;-1:-1:-1;;;;;23698:15:1;;23678:18;;;23671:43;6492:42:0;;8392:45;;23563:18:1;;8392:92:0;23416:304:1;8354:293:0;8533:94;;-1:-1:-1;;;8533:94:0;;8589:4;8533:94;;;23628:34:1;-1:-1:-1;;;;;23698:15:1;;23678:18;;;23671:43;6492:42:0;;8533:47;;23563:18:1;;8533:94:0;23416:304:1;8229:522:0;8687:48;;-1:-1:-1;;;8687:48:0;;8729:4;8687:48;;;6201:51:1;6492:42:0;;8687:33;;6174:18:1;;8687:48:0;6055:203:1;34849:343:0;34969:6;34955:11;:20;34951:78;;;34992:25;;-1:-1:-1;;;34992:25:0;;24524:2:1;34992:25:0;;;24506:21:1;24563:2;24543:18;;;24536:30;-1:-1:-1;;;24582:18:1;;;24575:45;24637:18;;34992:25:0;24322:339:1;34951:78:0;35041:16;:36;;-1:-1:-1;;;;;35041:36:0;;-1:-1:-1;;;;;;35088:32:0;;;;;-1:-1:-1;;;35088:32:0;;;;;;;;35138:46;;597:25:1;;;35138:46:0;;585:2:1;570:18;35138:46:0;;;;;;;34849:343;;:::o;55024:823::-;-1:-1:-1;;;;;55176:18:0;;55168:45;;;;-1:-1:-1;;;55168:45:0;;22083:2:1;55168:45:0;;;22065:21:1;22122:2;22102:18;;;22095:30;-1:-1:-1;;;22141:18:1;;;22134:44;22195:18;;55168:45:0;21881:338:1;55168:45:0;55246:7;:14;55232:3;:10;:28;55224:56;;;;-1:-1:-1;;;55224:56:0;;;;;;;:::i;:::-;55293:16;55312:10;55293:29;;55335:66;55356:8;55366:4;55380:1;55384:3;55389:7;55335:66;;;;;;;;;;;;:20;:66::i;:::-;55419:9;55414:353;55438:3;:10;55434:1;:14;55414:353;;;55470:10;55483:3;55487:1;55483:6;;;;;;;;:::i;:::-;;;;;;;55470:19;;55504:14;55521:7;55529:1;55521:10;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;55570:15:0;;55548:19;55570:15;;;:9;:15;;;;;;:19;;;;;;;;;;;55521:10;;-1:-1:-1;55612:21:0;;;;55604:50;;;;-1:-1:-1;;;55604:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55698:15:0;;;;;;:9;:15;;;;;;;;:19;;;;;;;;;;55720:20;;55698:42;;55450:3;;;;:::i;:::-;;;;55414:353;;;;55822:1;-1:-1:-1;;;;;55784:55:0;55808:4;-1:-1:-1;;;;;55784:55:0;55798:8;-1:-1:-1;;;;;55784:55:0;;55826:3;55831:7;55784:55;;;;;;;:::i;:::-;;;;;;;;55157:690;55024:823;;;:::o;27611:190::-;27678:21;27702:11;27678:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27738:4;27724:11;:18;;;;;;:::i;:::-;;27760:33;27779:7;27788:4;27760:33;;;;;;;:::i;:::-;;;;;;;;27667:134;27611:190;:::o;12453:373::-;12607:25;;12672:24;12683:13;12672:8;:24;:::i;:::-;12747:8;:22;;;;;;;;;;;;;-1:-1:-1;12782:16:0;;;:7;12747:22;12782:16;;;;12662:34;;-1:-1:-1;12662:34:0;;-1:-1:-1;12782:36:0;12801:17;12782:16;:36;:::i;:::-;;12453:373;;;;;;:::o;53716:687::-;-1:-1:-1;;;;;53894:16:0;;53886:41;;;;-1:-1:-1;;;53886:41:0;;;;;;;:::i;:::-;53960:7;:14;53946:3;:10;:28;53938:56;;;;-1:-1:-1;;;53938:56:0;;;;;;;:::i;:::-;54026:10;54049:66;54026:10;54007:16;54092:2;54096:3;54101:7;54110:4;54049:20;:66::i;:::-;54133:9;54128:103;54152:3;:10;54148:1;:14;54128:103;;;54209:7;54217:1;54209:10;;;;;;;;:::i;:::-;;;;;;;54184:9;:13;54194:2;-1:-1:-1;;;;;54184:13:0;-1:-1:-1;;;;;54184:13:0;;;;;;;;;;;;:21;54198:3;54202:1;54198:6;;;;;;;;:::i;:::-;;;;;;;54184:21;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;54164:3:0;;-1:-1:-1;54164:3:0;;;:::i;:::-;;;;54128:103;;;;54284:2;-1:-1:-1;;;;;54248:53:0;54280:1;-1:-1:-1;;;;;54248:53:0;54262:8;-1:-1:-1;;;;;54248:53:0;;54288:3;54293:7;54248:53;;;;;;;:::i;:::-;;;;;;;;54314:81;54350:8;54368:1;54372:2;54376:3;54381:7;54390:4;54314:35;:81::i;36123:374::-;36275:6;36268:4;:13;36264:71;;;36298:25;;-1:-1:-1;;;36298:25:0;;24524:2:1;36298:25:0;;;24506:21:1;24563:2;24543:18;;;24536:30;-1:-1:-1;;;24582:18:1;;;24575:45;24637:18;;36298:25:0;24322:339:1;36264:71:0;36379:49;;;;;;;;-1:-1:-1;;;;;36379:49:0;;;;;;;;;;;;;-1:-1:-1;36347:29:0;;;:19;:29;;;;;:81;;;;-1:-1:-1;;;;;;36347:81:0;;;;;;;;;;;-1:-1:-1;36347:81:0;;;;;;;36446:43;;597:25:1;;;36379:49:0;;36347:29;;36446:43;;570:18:1;36446:43:0;;;;;;;;36123:374;;;:::o;50044:296::-;50155:10;-1:-1:-1;;;;;50184:17:0;;;;50176:44;;;;-1:-1:-1;;;50176:44:0;;28271:2:1;50176:44:0;;;28253:21:1;28310:2;28290:18;;;28283:30;-1:-1:-1;;;28329:18:1;;;28322:44;28383:18;;50176:44:0;28069:338:1;50176:44:0;-1:-1:-1;;;;;50231:23:0;;;;;;;:16;:23;;;;;;;;:33;;;;;;;;;;;;;:44;;-1:-1:-1;;50231:44:0;;;;;;;;;;50291:41;;1159::1;;;50291::0;;1132:18:1;50291:41:0;1019:187:1;22674:200:0;22757:12;22789:77;22810:6;22818:4;22789:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;22782:84;22674:200;-1:-1:-1;;;22674:200:0:o;53035:119::-;53124:13;;;;:4;:13;;;;;:22;53140:6;53124:13;:22;:::i;53162:546::-;-1:-1:-1;;;;;53315:16:0;;53307:41;;;;-1:-1:-1;;;53307:41:0;;;;;;;:::i;:::-;53380:10;53403:102;53380:10;53361:16;53446:2;53450:21;53468:2;53450:17;:21::i;:::-;53473:25;53491:6;53473:17;:25::i;:::-;53500:4;53403:20;:102::i;:::-;-1:-1:-1;;;;;53518:13:0;;;;;;:9;:13;;;;;;;;:17;;;;;;;;:27;;53539:6;;53518:13;:27;;53539:6;;53518:27;:::i;:::-;;;;-1:-1:-1;;53561:52:0;;;22743:25:1;;;22799:2;22784:18;;22777:34;;;-1:-1:-1;;;;;53561:52:0;;;;53594:1;;53561:52;;;;;;22716:18:1;53561:52:0;;;;;;;53626:74;53657:8;53675:1;53679:2;53683;53687:6;53695:4;53626:30;:74::i;50348:337::-;-1:-1:-1;;;;;50542:18:0;;50550:10;50542:18;;:56;;-1:-1:-1;;;;;;50564:22:0;;;;;;:16;:22;;;;;;;;50587:10;50564:34;;;;;;;;;;50542:56;50534:87;;;;-1:-1:-1;;;50534:87:0;;24177:2:1;50534:87:0;;;24159:21:1;24216:2;24196:18;;;24189:30;-1:-1:-1;;;24235:18:1;;;24228:48;24293:18;;50534:87:0;23975:342:1;50534:87:0;50632:45;50650:4;50656:2;50660;50664:6;50672:4;50632:17;:45::i;57541:198::-;57661:16;;;57675:1;57661:16;;;;;;;;;57607;;57636:22;;57661:16;;;;;;;;;;;;-1:-1:-1;57661:16:0;57636:41;;57699:7;57688:5;57694:1;57688:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;57726:5;57541:198;-1:-1:-1;;57541:198:0:o;70523:653::-;-1:-1:-1;;;;;70845:18:0;;70841:159;;70885:9;70880:109;70904:3;:10;70900:1;:14;70880:109;;;70963:7;70971:1;70963:10;;;;;;;;:::i;:::-;;;;;;;70940:11;:19;70952:3;70956:1;70952:6;;;;;;;;:::i;:::-;;;;;;;70940:19;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;70916:3:0;;-1:-1:-1;70916:3:0;;:::i;:::-;;;70880:109;;;;70841:159;-1:-1:-1;;;;;71016:16:0;;71012:157;;71054:9;71049:109;71073:3;:10;71069:1;:14;71049:109;;;71132:7;71140:1;71132:10;;;;;;;;:::i;:::-;;;;;;;71109:11;:19;71121:3;71125:1;71121:6;;;;;;;;:::i;:::-;;;;;;;71109:19;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;71085:3:0;;-1:-1:-1;71085:3:0;;:::i;:::-;;;71049:109;;52031:996;52258:7;:14;52244:3;:10;:28;52236:56;;;;-1:-1:-1;;;52236:56:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52311:16:0;;52303:41;;;;-1:-1:-1;;;52303:41:0;;;;;;;:::i;:::-;52376:10;52399:60;52376:10;52430:4;52436:2;52440:3;52445:7;52454:4;52399:20;:60::i;:::-;52477:9;52472:395;52496:3;:10;52492:1;:14;52472:395;;;52528:10;52541:3;52545:1;52541:6;;;;;;;;:::i;:::-;;;;;;;52528:19;;52562:14;52579:7;52587:1;52579:10;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;52628:15:0;;52606:19;52628:15;;;:9;:15;;;;;;:19;;;;;;;;;;;52579:10;;-1:-1:-1;52670:21:0;;;;52662:50;;;;-1:-1:-1;;;52662:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52756:15:0;;;;;;;:9;:15;;;;;;;;:19;;;;;;;;52778:20;;;52756:42;;52828:13;;;;;;;;;;;:17;;;;;;;;:27;;52792:6;;52756:15;52828:27;;52792:6;;52828:27;:::i;:::-;;;;;;;;52513:354;;;52508:3;;;;:::i;:::-;;;52472:395;;;;52914:2;-1:-1:-1;;;;;52884:47:0;52908:4;-1:-1:-1;;;;;52884:47:0;52898:8;-1:-1:-1;;;;;52884:47:0;;52918:3;52923:7;52884:47;;;;;;;:::i;:::-;;;;;;;;52944:75;52980:8;52990:4;52996:2;53000:3;53005:7;53014:4;56778:755;-1:-1:-1;;;;;57018:14:0;;;:18;57014:512;;57057:79;;-1:-1:-1;;;57057:79:0;;-1:-1:-1;;;;;57057:43:0;;;;;:79;;57101:8;;57111:4;;57117:3;;57122:7;;57131:4;;57057:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57057:79:0;;;;;;;;-1:-1:-1;;57057:79:0;;;;;;;;;;;;:::i;:::-;;;57053:462;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;57424:6;57417:14;;-1:-1:-1;;;57417:14:0;;;;;;;;:::i;57053:462::-;;;57473:26;;-1:-1:-1;;;57473:26:0;;30560:2:1;57473:26:0;;;30542:21:1;30599:2;30579:18;;;30572:30;-1:-1:-1;;;30618:18:1;;;30611:46;30674:18;;57473:26:0;30358:340:1;57053:462:0;-1:-1:-1;;;;;;57218:60:0;;-1:-1:-1;;;57218:60:0;57214:134;;57303:25;;-1:-1:-1;;;57303:25:0;;30905:2:1;57303:25:0;;;30887:21:1;30944:2;30924:18;;;30917:30;-1:-1:-1;;;30963:18:1;;;30956:45;31018:18;;57303:25:0;30703:339:1;23068:396:0;23213:12;-1:-1:-1;;;;;17430:19:0;;;23238:69;;;;-1:-1:-1;;;23238:69:0;;31249:2:1;23238:69:0;;;31231:21:1;31288:2;31268:18;;;31261:30;31327:34;31307:18;;;31300:62;-1:-1:-1;;;31378:18:1;;;31371:36;31424:19;;23238:69:0;31047:402:1;23238:69:0;23321:12;23335:23;23362:6;-1:-1:-1;;;;;23362:19:0;23382:4;23362:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23320:67;;;;23405:51;23422:7;23431:10;23443:12;23405:16;:51::i;:::-;23398:58;23068:396;-1:-1:-1;;;;;;23068:396:0:o;56084:686::-;-1:-1:-1;;;;;56299:14:0;;;:18;56295:468;;56338:72;;-1:-1:-1;;;56338:72:0;;-1:-1:-1;;;;;56338:38:0;;;;;:72;;56377:8;;56387:4;;56393:2;;56397:6;;56405:4;;56338:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56338:72:0;;;;;;;;-1:-1:-1;;56338:72:0;;;;;;;;;;;;:::i;:::-;;;56334:418;;;;:::i;:::-;-1:-1:-1;;;;;;56460:55:0;;-1:-1:-1;;;56460:55:0;56456:129;;56540:25;;-1:-1:-1;;;56540:25:0;;30905:2:1;56540:25:0;;;30887:21:1;30944:2;30924:18;;;30917:30;-1:-1:-1;;;30963:18:1;;;30956:45;31018:18;;56540:25:0;30703:339:1;51256:767:0;-1:-1:-1;;;;;51444:16:0;;51436:41;;;;-1:-1:-1;;;51436:41:0;;;;;;;:::i;:::-;51509:10;51532:96;51509:10;51563:4;51569:2;51573:21;51591:2;51573:17;:21::i;51532:96::-;-1:-1:-1;;;;;51663:15:0;;51641:19;51663:15;;;:9;:15;;;;;;;;:19;;;;;;;;;51701:21;;;;51693:50;;;;-1:-1:-1;;;51693:50:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51779:15:0;;;;;;;:9;:15;;;;;;;;:19;;;;;;;;51801:20;;;51779:42;;51843:13;;;;;;;;;;;:17;;;;;;;;:27;;51815:6;;51779:15;51843:27;;51815:6;;51843:27;:::i;:::-;;;;-1:-1:-1;;51888:46:0;;;22743:25:1;;;22799:2;22784:18;;22777:34;;;-1:-1:-1;;;;;51888:46:0;;;;;;;;;;;;;;22716:18:1;51888:46:0;;;;;;;51947:68;51978:8;51988:4;51994:2;51998;52002:6;52010:4;51947:30;:68::i;23692:712::-;23842:12;23871:7;23867:530;;;-1:-1:-1;23902:10:0;23895:17;;23867:530;24016:17;;:21;24012:374;;24214:10;24208:17;24275:15;24262:10;24258:2;24254:19;24247:44;24012:374;24357:12;24350:20;;-1:-1:-1;;;24350:20:0;;;;;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:250::-;1296:1;1306:113;1320:6;1317:1;1314:13;1306:113;;;1396:11;;;1390:18;1377:11;;;1370:39;1342:2;1335:10;1306:113;;;-1:-1:-1;;1453:1:1;1435:16;;1428:27;1211:250::o;1466:271::-;1508:3;1546:5;1540:12;1573:6;1568:3;1561:19;1589:76;1658:6;1651:4;1646:3;1642:14;1635:4;1628:5;1624:16;1589:76;:::i;:::-;1719:2;1698:15;-1:-1:-1;;1694:29:1;1685:39;;;;1726:4;1681:50;;1466:271;-1:-1:-1;;1466:271:1:o;1742:220::-;1891:2;1880:9;1873:21;1854:4;1911:45;1952:2;1941:9;1937:18;1929:6;1911:45;:::i;1967:248::-;2035:6;2043;2096:2;2084:9;2075:7;2071:23;2067:32;2064:52;;;2112:1;2109;2102:12;2064:52;-1:-1:-1;;2135:23:1;;;2205:2;2190:18;;;2177:32;;-1:-1:-1;1967:248:1:o;2220:180::-;2279:6;2332:2;2320:9;2311:7;2307:23;2303:32;2300:52;;;2348:1;2345;2338:12;2300:52;-1:-1:-1;2371:23:1;;2220:180;-1:-1:-1;2220:180:1:o;2405:186::-;2464:6;2517:2;2505:9;2496:7;2492:23;2488:32;2485:52;;;2533:1;2530;2523:12;2485:52;2556:29;2575:9;2556:29;:::i;2875:127::-;2936:10;2931:3;2927:20;2924:1;2917:31;2967:4;2964:1;2957:15;2991:4;2988:1;2981:15;3007:249;3117:2;3098:13;;-1:-1:-1;;3094:27:1;3082:40;;-1:-1:-1;;;;;3137:34:1;;3173:22;;;3134:62;3131:88;;;3199:18;;:::i;:::-;3235:2;3228:22;-1:-1:-1;;3007:249:1:o;3261:183::-;3321:4;-1:-1:-1;;;;;3346:6:1;3343:30;3340:56;;;3376:18;;:::i;:::-;-1:-1:-1;3421:1:1;3417:14;3433:4;3413:25;;3261:183::o;3449:724::-;3503:5;3556:3;3549:4;3541:6;3537:17;3533:27;3523:55;;3574:1;3571;3564:12;3523:55;3610:6;3597:20;3636:4;3659:43;3699:2;3659:43;:::i;:::-;3731:2;3725:9;3743:31;3771:2;3763:6;3743:31;:::i;:::-;3809:18;;;3901:1;3897:10;;;;3885:23;;3881:32;;;3843:15;;;;-1:-1:-1;3925:15:1;;;3922:35;;;3953:1;3950;3943:12;3922:35;3989:2;3981:6;3977:15;4001:142;4017:6;4012:3;4009:15;4001:142;;;4083:17;;4071:30;;4121:12;;;;4034;;4001:142;;;-1:-1:-1;4161:6:1;3449:724;-1:-1:-1;;;;;;3449:724:1:o;4178:555::-;4220:5;4273:3;4266:4;4258:6;4254:17;4250:27;4240:55;;4291:1;4288;4281:12;4240:55;4327:6;4314:20;-1:-1:-1;;;;;4349:2:1;4346:26;4343:52;;;4375:18;;:::i;:::-;4424:2;4418:9;4436:67;4491:2;4472:13;;-1:-1:-1;;4468:27:1;4497:4;4464:38;4418:9;4436:67;:::i;:::-;4527:2;4519:6;4512:18;4573:3;4566:4;4561:2;4553:6;4549:15;4545:26;4542:35;4539:55;;;4590:1;4587;4580:12;4539:55;4654:2;4647:4;4639:6;4635:17;4628:4;4620:6;4616:17;4603:54;4701:1;4677:15;;;4694:4;4673:26;4666:37;;;;4681:6;4178:555;-1:-1:-1;;;4178:555:1:o;4738:943::-;4892:6;4900;4908;4916;4924;4977:3;4965:9;4956:7;4952:23;4948:33;4945:53;;;4994:1;4991;4984:12;4945:53;5017:29;5036:9;5017:29;:::i;:::-;5007:39;;5065:38;5099:2;5088:9;5084:18;5065:38;:::i;:::-;5055:48;;5154:2;5143:9;5139:18;5126:32;-1:-1:-1;;;;;5218:2:1;5210:6;5207:14;5204:34;;;5234:1;5231;5224:12;5204:34;5257:61;5310:7;5301:6;5290:9;5286:22;5257:61;:::i;:::-;5247:71;;5371:2;5360:9;5356:18;5343:32;5327:48;;5400:2;5390:8;5387:16;5384:36;;;5416:1;5413;5406:12;5384:36;5439:63;5494:7;5483:8;5472:9;5468:24;5439:63;:::i;:::-;5429:73;;5555:3;5544:9;5540:19;5527:33;5511:49;;5585:2;5575:8;5572:16;5569:36;;;5601:1;5598;5591:12;5569:36;;5624:51;5667:7;5656:8;5645:9;5641:24;5624:51;:::i;:::-;5614:61;;;4738:943;;;;;;;;:::o;5686:118::-;5772:5;5765:13;5758:21;5751:5;5748:32;5738:60;;5794:1;5791;5784:12;5809:241;5865:6;5918:2;5906:9;5897:7;5893:23;5889:32;5886:52;;;5934:1;5931;5924:12;5886:52;5973:9;5960:23;5992:28;6014:5;5992:28;:::i;6792:1208::-;6910:6;6918;6971:2;6959:9;6950:7;6946:23;6942:32;6939:52;;;6987:1;6984;6977:12;6939:52;7027:9;7014:23;-1:-1:-1;;;;;7097:2:1;7089:6;7086:14;7083:34;;;7113:1;7110;7103:12;7083:34;7151:6;7140:9;7136:22;7126:32;;7196:7;7189:4;7185:2;7181:13;7177:27;7167:55;;7218:1;7215;7208:12;7167:55;7254:2;7241:16;7276:4;7299:43;7339:2;7299:43;:::i;:::-;7371:2;7365:9;7383:31;7411:2;7403:6;7383:31;:::i;:::-;7449:18;;;7537:1;7533:10;;;;7525:19;;7521:28;;;7483:15;;;;-1:-1:-1;7561:19:1;;;7558:39;;;7593:1;7590;7583:12;7558:39;7617:11;;;;7637:148;7653:6;7648:3;7645:15;7637:148;;;7719:23;7738:3;7719:23;:::i;:::-;7707:36;;7670:12;;;;7763;;;;7637:148;;;7804:6;-1:-1:-1;;7848:18:1;;7835:32;;-1:-1:-1;;7879:16:1;;;7876:36;;;7908:1;7905;7898:12;7876:36;;7931:63;7986:7;7975:8;7964:9;7960:24;7931:63;:::i;:::-;7921:73;;;6792:1208;;;;;:::o;8005:435::-;8058:3;8096:5;8090:12;8123:6;8118:3;8111:19;8149:4;8178:2;8173:3;8169:12;8162:19;;8215:2;8208:5;8204:14;8236:1;8246:169;8260:6;8257:1;8254:13;8246:169;;;8321:13;;8309:26;;8355:12;;;;8390:15;;;;8282:1;8275:9;8246:169;;;-1:-1:-1;8431:3:1;;8005:435;-1:-1:-1;;;;;8005:435:1:o;8445:261::-;8624:2;8613:9;8606:21;8587:4;8644:56;8696:2;8685:9;8681:18;8673:6;8644:56;:::i;8711:669::-;8838:6;8846;8854;8907:2;8895:9;8886:7;8882:23;8878:32;8875:52;;;8923:1;8920;8913:12;8875:52;8946:29;8965:9;8946:29;:::i;:::-;8936:39;;9026:2;9015:9;9011:18;8998:32;-1:-1:-1;;;;;9090:2:1;9082:6;9079:14;9076:34;;;9106:1;9103;9096:12;9076:34;9129:61;9182:7;9173:6;9162:9;9158:22;9129:61;:::i;:::-;9119:71;;9243:2;9232:9;9228:18;9215:32;9199:48;;9272:2;9262:8;9259:16;9256:36;;;9288:1;9285;9278:12;9256:36;;9311:63;9366:7;9355:8;9344:9;9340:24;9311:63;:::i;:::-;9301:73;;;8711:669;;;;;:::o;9385:322::-;9462:6;9470;9478;9531:2;9519:9;9510:7;9506:23;9502:32;9499:52;;;9547:1;9544;9537:12;9499:52;9570:29;9589:9;9570:29;:::i;:::-;9560:39;9646:2;9631:18;;9618:32;;-1:-1:-1;9697:2:1;9682:18;;;9669:32;;9385:322;-1:-1:-1;;;9385:322:1:o;9712:321::-;9781:6;9834:2;9822:9;9813:7;9809:23;9805:32;9802:52;;;9850:1;9847;9840:12;9802:52;9890:9;9877:23;-1:-1:-1;;;;;9915:6:1;9912:30;9909:50;;;9955:1;9952;9945:12;9909:50;9978:49;10019:7;10010:6;9999:9;9995:22;9978:49;:::i;10038:869::-;10184:6;10192;10200;10208;10261:3;10249:9;10240:7;10236:23;10232:33;10229:53;;;10278:1;10275;10268:12;10229:53;10301:29;10320:9;10301:29;:::i;:::-;10291:39;;10381:2;10370:9;10366:18;10353:32;-1:-1:-1;;;;;10445:2:1;10437:6;10434:14;10431:34;;;10461:1;10458;10451:12;10431:34;10484:61;10537:7;10528:6;10517:9;10513:22;10484:61;:::i;:::-;10474:71;;10598:2;10587:9;10583:18;10570:32;10554:48;;10627:2;10617:8;10614:16;10611:36;;;10643:1;10640;10633:12;10611:36;10666:63;10721:7;10710:8;10699:9;10695:24;10666:63;:::i;:::-;10656:73;;10782:2;10771:9;10767:18;10754:32;10738:48;;10811:2;10801:8;10798:16;10795:36;;;10827:1;10824;10817:12;10795:36;;10850:51;10893:7;10882:8;10871:9;10867:24;10850:51;:::i;:::-;10840:61;;;10038:869;;;;;;;:::o;10912:322::-;10989:6;10997;11005;11058:2;11046:9;11037:7;11033:23;11029:32;11026:52;;;11074:1;11071;11064:12;11026:52;11110:9;11097:23;11087:33;;11139:38;11173:2;11162:9;11158:18;11139:38;:::i;:::-;11129:48;;11224:2;11213:9;11209:18;11196:32;11186:42;;10912:322;;;;;:::o;11239:315::-;11304:6;11312;11365:2;11353:9;11344:7;11340:23;11336:32;11333:52;;;11381:1;11378;11371:12;11333:52;11404:29;11423:9;11404:29;:::i;:::-;11394:39;;11483:2;11472:9;11468:18;11455:32;11496:28;11518:5;11496:28;:::i;:::-;11543:5;11533:15;;;11239:315;;;;;:::o;11559:626::-;11656:6;11664;11717:2;11705:9;11696:7;11692:23;11688:32;11685:52;;;11733:1;11730;11723:12;11685:52;11773:9;11760:23;-1:-1:-1;;;;;11843:2:1;11835:6;11832:14;11829:34;;;11859:1;11856;11849:12;11829:34;11897:6;11886:9;11882:22;11872:32;;11942:7;11935:4;11931:2;11927:13;11923:27;11913:55;;11964:1;11961;11954:12;11913:55;12004:2;11991:16;12030:2;12022:6;12019:14;12016:34;;;12046:1;12043;12036:12;12016:34;12099:7;12094:2;12084:6;12081:1;12077:14;12073:2;12069:23;12065:32;12062:45;12059:65;;;12120:1;12117;12110:12;12059:65;12151:2;12143:11;;;;;12173:6;;-1:-1:-1;11559:626:1;;-1:-1:-1;;;;11559:626:1:o;12190:801::-;12350:4;12379:2;12419;12408:9;12404:18;12449:2;12438:9;12431:21;12472:6;12507;12501:13;12538:6;12530;12523:22;12576:2;12565:9;12561:18;12554:25;;12638:2;12628:6;12625:1;12621:14;12610:9;12606:30;12602:39;12588:53;;12676:2;12668:6;12664:15;12697:1;12707:255;12721:6;12718:1;12715:13;12707:255;;;12814:2;12810:7;12798:9;12790:6;12786:22;12782:36;12777:3;12770:49;12842:40;12875:6;12866;12860:13;12842:40;:::i;:::-;12832:50;-1:-1:-1;12940:12:1;;;;12905:15;;;;12743:1;12736:9;12707:255;;;-1:-1:-1;12979:6:1;;12190:801;-1:-1:-1;;;;;;;12190:801:1:o;12996:532::-;13092:6;13100;13108;13116;13169:3;13157:9;13148:7;13144:23;13140:33;13137:53;;;13186:1;13183;13176:12;13137:53;13209:29;13228:9;13209:29;:::i;:::-;13199:39;;13285:2;13274:9;13270:18;13257:32;13247:42;;13340:2;13329:9;13325:18;13312:32;-1:-1:-1;;;;;13359:6:1;13356:30;13353:50;;;13399:1;13396;13389:12;13353:50;13422:49;13463:7;13454:6;13443:9;13439:22;13422:49;:::i;:::-;12996:532;;;;-1:-1:-1;13412:59:1;;13518:2;13503:18;13490:32;;-1:-1:-1;;;12996:532:1:o;13533:260::-;13601:6;13609;13662:2;13650:9;13641:7;13637:23;13633:32;13630:52;;;13678:1;13675;13668:12;13630:52;13701:29;13720:9;13701:29;:::i;:::-;13691:39;;13749:38;13783:2;13772:9;13768:18;13749:38;:::i;:::-;13739:48;;13533:260;;;;;:::o;13798:606::-;13902:6;13910;13918;13926;13934;13987:3;13975:9;13966:7;13962:23;13958:33;13955:53;;;14004:1;14001;13994:12;13955:53;14027:29;14046:9;14027:29;:::i;:::-;14017:39;;14075:38;14109:2;14098:9;14094:18;14075:38;:::i;:::-;14065:48;;14160:2;14149:9;14145:18;14132:32;14122:42;;14211:2;14200:9;14196:18;14183:32;14173:42;;14266:3;14255:9;14251:19;14238:33;-1:-1:-1;;;;;14286:6:1;14283:30;14280:50;;;14326:1;14323;14316:12;14280:50;14349:49;14390:7;14381:6;14370:9;14366:22;14349:49;:::i;14409:380::-;14488:1;14484:12;;;;14531;;;14552:61;;14606:4;14598:6;14594:17;14584:27;;14552:61;14659:2;14651:6;14648:14;14628:18;14625:38;14622:161;;14705:10;14700:3;14696:20;14693:1;14686:31;14740:4;14737:1;14730:15;14768:4;14765:1;14758:15;14622:161;;14409:380;;;:::o;14794:496::-;14973:3;15011:6;15005:13;15027:66;15086:6;15081:3;15074:4;15066:6;15062:17;15027:66;:::i;:::-;15156:13;;15115:16;;;;15178:70;15156:13;15115:16;15225:4;15213:17;;15178:70;:::i;:::-;15264:20;;14794:496;-1:-1:-1;;;;14794:496:1:o;15295:338::-;15497:2;15479:21;;;15536:2;15516:18;;;15509:30;-1:-1:-1;;;15570:2:1;15555:18;;15548:44;15624:2;15609:18;;15295:338::o;15980:127::-;16041:10;16036:3;16032:20;16029:1;16022:31;16072:4;16069:1;16062:15;16096:4;16093:1;16086:15;16112:127;16173:10;16168:3;16164:20;16161:1;16154:31;16204:4;16201:1;16194:15;16228:4;16225:1;16218:15;16244:168;16317:9;;;16348;;16365:15;;;16359:22;;16345:37;16335:71;;16386:18;;:::i;16417:127::-;16478:10;16473:3;16469:20;16466:1;16459:31;16509:4;16506:1;16499:15;16533:4;16530:1;16523:15;16549:120;16589:1;16615;16605:35;;16620:18;;:::i;:::-;-1:-1:-1;16654:9:1;;16549:120::o;17086:339::-;17288:2;17270:21;;;17327:2;17307:18;;;17300:30;-1:-1:-1;;;17361:2:1;17346:18;;17339:45;17416:2;17401:18;;17086:339::o;17430:135::-;17469:3;17490:17;;;17487:43;;17510:18;;:::i;:::-;-1:-1:-1;17557:1:1;17546:13;;17430:135::o;19021:125::-;19086:9;;;19107:10;;;19104:36;;;19120:18;;:::i;20815:521::-;20892:4;20898:6;20958:11;20945:25;21052:2;21048:7;21037:8;21021:14;21017:29;21013:43;20993:18;20989:68;20979:96;;21071:1;21068;21061:12;20979:96;21098:33;;21150:20;;;-1:-1:-1;;;;;;21182:30:1;;21179:50;;;21225:1;21222;21215:12;21179:50;21258:4;21246:17;;-1:-1:-1;21289:14:1;21285:27;;;21275:38;;21272:58;;;21326:1;21323;21316:12;21272:58;20815:521;;;;;:::o;22224:340::-;22426:2;22408:21;;;22465:2;22445:18;;;22438:30;-1:-1:-1;;;22499:2:1;22484:18;;22477:46;22555:2;22540:18;;22224:340::o;23166:128::-;23233:9;;;23254:11;;;23251:37;;;23268:18;;:::i;23299:112::-;23331:1;23357;23347:35;;23362:18;;:::i;:::-;-1:-1:-1;23396:9:1;;23299:112::o;23725:245::-;23792:6;23845:2;23833:9;23824:7;23820:23;23816:32;23813:52;;;23861:1;23858;23851:12;23813:52;23893:9;23887:16;23912:28;23934:5;23912:28;:::i;24666:465::-;24923:2;24912:9;24905:21;24886:4;24949:56;25001:2;24990:9;24986:18;24978:6;24949:56;:::i;:::-;25053:9;25045:6;25041:22;25036:2;25025:9;25021:18;25014:50;25081:44;25118:6;25110;25081:44;:::i;:::-;25073:52;24666:465;-1:-1:-1;;;;;24666:465:1:o;25262:545::-;25364:2;25359:3;25356:11;25353:448;;;25400:1;25425:5;25421:2;25414:17;25470:4;25466:2;25456:19;25540:2;25528:10;25524:19;25521:1;25517:27;25511:4;25507:38;25576:4;25564:10;25561:20;25558:47;;;-1:-1:-1;25599:4:1;25558:47;25654:2;25649:3;25645:12;25642:1;25638:20;25632:4;25628:31;25618:41;;25709:82;25727:2;25720:5;25717:13;25709:82;;;25772:17;;;25753:1;25742:13;25709:82;;25983:1352;26109:3;26103:10;-1:-1:-1;;;;;26128:6:1;26125:30;26122:56;;;26158:18;;:::i;:::-;26187:97;26277:6;26237:38;26269:4;26263:11;26237:38;:::i;:::-;26231:4;26187:97;:::i;:::-;26339:4;;26403:2;26392:14;;26420:1;26415:663;;;;27122:1;27139:6;27136:89;;;-1:-1:-1;27191:19:1;;;27185:26;27136:89;-1:-1:-1;;25940:1:1;25936:11;;;25932:24;25928:29;25918:40;25964:1;25960:11;;;25915:57;27238:81;;26385:944;;26415:663;25209:1;25202:14;;;25246:4;25233:18;;-1:-1:-1;;26451:20:1;;;26569:236;26583:7;26580:1;26577:14;26569:236;;;26672:19;;;26666:26;26651:42;;26764:27;;;;26732:1;26720:14;;;;26599:19;;26569:236;;;26573:3;26833:6;26824:7;26821:19;26818:201;;;26894:19;;;26888:26;-1:-1:-1;;26977:1:1;26973:14;;;26989:3;26969:24;26965:37;26961:42;26946:58;26931:74;;26818:201;-1:-1:-1;;;;;27065:1:1;27049:14;;;27045:22;27032:36;;-1:-1:-1;25983:1352:1:o;27340:383::-;27537:2;27526:9;27519:21;27500:4;27563:45;27604:2;27593:9;27589:18;27581:6;27563:45;:::i;:::-;27656:9;27648:6;27644:22;27639:2;27628:9;27624:18;27617:50;27684:33;27710:6;27702;27684:33;:::i;27728:336::-;27930:2;27912:21;;;27969:2;27949:18;;;27942:30;-1:-1:-1;;;28003:2:1;27988:18;;27981:42;28055:2;28040:18;;27728:336::o;28412:827::-;-1:-1:-1;;;;;28809:15:1;;;28791:34;;28861:15;;28856:2;28841:18;;28834:43;28771:3;28908:2;28893:18;;28886:31;;;28734:4;;28940:57;;28977:19;;28969:6;28940:57;:::i;:::-;29045:9;29037:6;29033:22;29028:2;29017:9;29013:18;29006:50;29079:44;29116:6;29108;29079:44;:::i;:::-;29065:58;;29172:9;29164:6;29160:22;29154:3;29143:9;29139:19;29132:51;29200:33;29226:6;29218;29200:33;:::i;:::-;29192:41;28412:827;-1:-1:-1;;;;;;;;28412:827:1:o;29244:249::-;29313:6;29366:2;29354:9;29345:7;29341:23;29337:32;29334:52;;;29382:1;29379;29372:12;29334:52;29414:9;29408:16;29433:30;29457:5;29433:30;:::i;29498:179::-;29533:3;29575:1;29557:16;29554:23;29551:120;;;29621:1;29618;29615;29600:23;-1:-1:-1;29658:1:1;29652:8;29647:3;29643:18;29551:120;29498:179;:::o;29682:671::-;29721:3;29763:4;29745:16;29742:26;29739:39;;;29682:671;:::o;29739:39::-;29805:2;29799:9;-1:-1:-1;;29870:16:1;29866:25;;29863:1;29799:9;29842:50;29921:4;29915:11;29945:16;-1:-1:-1;;;;;30051:2:1;30044:4;30036:6;30032:17;30029:25;30024:2;30016:6;30013:14;30010:45;30007:58;;;30058:5;;;;;29682:671;:::o;30007:58::-;30095:6;30089:4;30085:17;30074:28;;30131:3;30125:10;30158:2;30150:6;30147:14;30144:27;;;30164:5;;;;;;29682:671;:::o;30144:27::-;30248:2;30229:16;30223:4;30219:27;30215:36;30208:4;30199:6;30194:3;30190:16;30186:27;30183:69;30180:82;;;30255:5;;;;;;29682:671;:::o;30180:82::-;30271:57;30322:4;30313:6;30305;30301:19;30297:30;30291:4;30271:57;:::i;:::-;-1:-1:-1;30344:3:1;;29682:671;-1:-1:-1;;;;;29682:671:1:o;31454:287::-;31583:3;31621:6;31615:13;31637:66;31696:6;31691:3;31684:4;31676:6;31672:17;31637:66;:::i;:::-;31719:16;;;;;31454:287;-1:-1:-1;;31454:287:1:o;31746:561::-;-1:-1:-1;;;;;32043:15:1;;;32025:34;;32095:15;;32090:2;32075:18;;32068:43;32142:2;32127:18;;32120:34;;;32185:2;32170:18;;32163:34;;;32005:3;32228;32213:19;;32206:32;;;31968:4;;32255:46;;32281:19;;32273:6;32255:46;:::i;:::-;32247:54;31746:561;-1:-1:-1;;;;;;;31746:561:1:o

Swarm Source

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