ETH Price: $3,249.92 (+2.59%)
Gas: 4 Gwei

Token

Seeing Red (CNRED)
 

Overview

Max Total Supply

0 CNRED

Holders

76

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
gonkulator.eth
Balance
7 CNRED
0xfeeaf7572313aba280663dc6cc4322b044435edf
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Mikaboshi community minters get involved at seeingred.io.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
IERC20NFTMintMarketplace

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 140 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: UNLICENSED

/* 
LFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFG
                                                                               
                                     %%.                                        
                             ./.(&&&#*,/%&&&%,/..                               
                    /%%%#(,,,,,,,,,,,,,,,,,,,,,,,,*%%%&%      .                 
          *(&%&%&%&&%.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*#%%%&**,*(/%&&&#         
       /&%/*,,,/%/,,&#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(&*.&%,,,,,,,,*&#       
      %&/,,,,,,,*(&%*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(##,,,,,,,,,,(&,      
      #&/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#&#      
      #&/,,,,,,,,,,,,,,,,,&@@@*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#&/      
      &&*,,,,,,,,,,,,,,,,/@@@@*,,,,,,,,,,,,,,,,,,,,,,,(@@@@&,,,,,,,,,,,#&/      
      *&(,,,,,,,,,,,,,,,%@@@@@@@@@@@@@@(,%@@(.,,,,,,,,/@@@@@,,,,,,,,,,,*&(      
      *%(,,,,,,,,,,,,,.@@@@@@@@@@@@@@@@.,,(@@@@%,,,,,,%@@@@*,,,,,,,,,,,(%*      
      #&/,,,,,,,,,,,,(@@@@,.,,,,@@@@@.,,,,,,*@@@@@.,,&@@@@.,,,,,,,,,,,,/%,      
      %%/,,,,,,,,,,/@@@@*,,,,,&@@@@@*,,,,,,,,,*@@/,&@@@@%,,,,,,,,,,,,,,/&,      
      (%/,,,,,,,,,,,,,,*@@,&@@@@@@@,,,,,,,,,,,,,,,@@@@&,,,,,,,,,,,,,,,,*&/      
      #&*,,,,,,,,,,,,(@@@@@@@@@@#.,,,,,,,,,,,,,/@@@@&,,,,,,,,,,,,,,,,,,/&(      
      *#*,,,,,,,,,,,,%@@@@@@@@,,,,,,,,,,,,,,#@@@@@(,,,,,,,,,,,,,,,,,,,,*&/      
      (&(,,,,,,,,,,,,,#@@@&,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*%/      
      *%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/%(      
      (%/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*&(      
      (#*,,,,,,,,,,,,@@@@&,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%(      
      #&/,,,,,,,,,,,,/@@@%.,,/(((&@@@@&,,,,,,,,/(*,,,,,,,,,,,,,,,,,,,,,*&(      
      #&/,,,,,,,,,,,,@@@@@@@@@@@@@@@@@@,,,*@@@@@@@@@@@@@@@.,,,,,,,,,,,,*#,      
      #&*,,,,,,,,,,/@@@@@@@@*,,,,,,,,,,,,,,,,,,,,,@@%,,%@€/@@@(,,,,,,,,*&(      
      (&*,,,,,,,.@@@@@@@@(@@@@@@@@@@@@@@@#@@@@@@@@@@@@@@@@@@@@%,,,,,,,,*&/      
      /&/,,,,,,,,,.%@@@%,,,,,,,*(@@@@/(#/,,./%%@@@@@&@@@(,,,,,,,,,,,,,,*&(      
      %&/,,,,,,,,,&@#@@%,,,#@@/,,%@@@#,,,,@@@@@@@@@@@@@@@@#,,,,,,,,,,,,*%(      
      /&/,,,,,,,,,,,,@@%,,(@@@@#,(@@@#,,,,*@@@@@&€/,,,,./%,,,,,,,,,,,,,*&(      
      ,%/,,,,,,,,,,,,@@@*,,@@@@@@(@@@@,,,,,,/@@@@@@@@@@@@*,,,,,,,,,,,,,*&(      
      %&/,,,,,,,,,,,%@@@/,,,&@@@@@@@@@,,,,,,,,,,,***€/*,,,,,,,,,,,,,,,,*&#      
      (%/,,,,,,,,,,,,#@@*,,,,,@@@@@@@*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*&(      
      /&*,,,,,,,,,,,,,,,,,,,,,,,./#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*&,      
      #%/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%(      
      #%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@,,,,/@@@@@@*,,,,,,,,,,,,,,,,,,,*%(      
      (&(,,,,,,,,,,,,,,,,,,,,,,.%&&@@@@@@@@@@@@@@@@&&&#,,,,,,,,,,,,,,,,,#(      
      *#(,,,,,,,,,,,,,,,,,,,,,%@@@@%/%@@@@@@@@@@@@@@@@&,,,,,,,,,,,,,,,,*&#      
      ,%,,,,,,,,,,,,,,,,,,,,,,(%@@@@@##@@(..,,,,,,,,,,,,,,,,,,,,,,,,,,,*%#      
      %&(,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,*%(      
      #&*,,,,,,,,,,,,,,,,,,,,,,,,(@@@@@@@@@@&,,,,,,,,,,,,,,,,,,,,,,,,,,,#&,     
      *&(,,,,,,,,,,,,,,,,,,,,,,,%@@@/.&@@(/@@@%,,,,,,,,,,,,,,,,,,,,,,,,*%#.     
      (&(,,,,,,,,,,,,,,,,,,,,,,,&@@@@@@@%.,.@@@@%,,,,,,,,,,,,,,,,,,,,,,,##      
      *&(,,,,,,,,,,,,,,,,,,,,,,,,#@%#*,,,,,,,.%@@/,,,,,,,,,,,,,,,,,,,,,,#%.     
      *&/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#(      
      ,&(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%.     
      /&(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*%%.     
      /#/,,,,,,,,,,,,,,..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(&,     
      *&/,,,,,,,,,,,,,,@@.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/#      
      (&(,,,,,,,,,,,,,.@@.,,,,,,,,,,,,,,,,,,,,,,,%@*,,,,,,,,,,,,,,,,,,,,#%.     
      *&/,,,,,,,,,,,,,&@@.,,,,,,,,,,,,,,,,,,,,,,,%@@,,,€/@@*,,,,,,,,,,,,##      
      *&/,,,,,,,,,,,,,&@@.,,,,,,,,,(&(,,,,,,,,,,,%@@@@@@@@%,,,,,,,,,,,,,(&.     
      *&(,,,,,,,,,,,,,&@@%,,,,,,,/@@@@,,,,,,,,.(%@@@%,,,,,,,,,,,,,,,,,,,##      
      ,&(,,,,,,,,,,,,,(@@@**(%@@@@@@@/,,,,,.&@@@@@@@@@/.,,,,,,,,,,,,,,,,#&.     
      *&(,,,,,,,,,,,,,,*@@@@@@@@@%/,,,,,,,,%@@@@@@@@&@@@@@@@/@,,,,,,,,,,(%.     
      *%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.&@@@@@%,,,,,*&@@@@(,,,,,,,,,##      
      /#/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(&.     
      ,&(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#&,     
      *&(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#&,     
      /&(,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@@/€/€/€,,,,,,,,,,,,,,,,,,,,,,,,(&.     
      /%/,,,,,,,,,,,,,,,,,,,,,,,,.@@@@@@@@@@@@@@&,,,,,,,,,,,,,,,,,,,,,,,#&.     
      *&(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@,,,,,,,,,,,,,,,,,,,,,,,,#%.     
      *&(,,,,,,,,,,,,,,,,,,,,,./&@@@@@@@@@@@@@@@#,,,,,,,,,,,,,,,,,,,,,,,(&.     
      *&(,,,,,,,,,,,,,,,,,,,,,#@@&#(,,,,,,,.#@@@@/,,,,,,,,,,,,,,,,,,,,,,(&.     
      ,%(,,,,,,,,,,,,,,,,,,,,,,,,,,./@,,,,/@@@@@&,,,,,,,,,,,,,,,,,,,,,,,(&.     
      *&(,,,,,,,,,,,,,,,,,,,,,,,(@@@@#@@@@@@@@@/,,,,,,,,,,,,,,,,,,,,,,,,(&.     
      *%(,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@@@@#*,,,,,,,,,,,,,,,,,,,,,,,,,,,((,     
      *&(,,,,,,,,,,,,,,,,,,,,,,,,/@@&((,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%,     
      *&(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*%/     
      *&/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(&,     
      *&(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(%*     
      *&(,,,,,,,,(%%/,,#&/,,,,,,,,,,,,,,,,,,,,,,,,,,*#%&%**#%%%,,,,,,,,,*&*     
      /&/,,,,,,*&#,,#%&#,,,,,,,,,,,,,,,,,,,,,,,,,,,*&#,,%%&&.,&%,,,,,,,,/%.     
        /%&%#/@/@/@/@/@/@(&((%#,,,,,,,,,,,,,,,,,,,,,(#&%.%&(*.,,,,,,*#&@.      
              /          ,./#&(&&&&%&%(%(%(&&&&&&&%%%/       //###%,#/.         
                                                                               
LFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFGLFG
*/
// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: contracts/Market.sol


pragma solidity ^0.8.4;





interface IP {
    function totalSupply() external view returns (uint);
    function balanceOf(address account) external view returns (uint);
    function transfer(address recipient, uint amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

contract IERC20NFTMintMarketplace is ERC721URIStorage, Ownable {


    using Counters for Counters.Counter;

    Counters.Counter private _Ids;
    Counters.Counter private _iSold;
    Counters.Counter private _mIds;

    // mika contract
    address public PTA; // payment Token Address done
    uint256 public minMintablePerSubmission = 1; //done
    uint256 public maxMintablePerSubmission = 1000; //done
    uint256 public maxMintablePerTX = 8; //done
    uint256 public listingPrice = 21000000 ether; //done
    uint public maxMintableDays = 15; //done
    // lowest percentage to mint to user
    uint public mintToUserPercentagePoint = 500; //done
    uint public mintToUserMaxCount = 10; //done

    uint inBids;
    uint public platformFees = 500; // done
    uint public platformFeesAftermarket = 150; //done
    uint public burnPercentagePoints = 6500;  // done
    uint public burnPercentagePointsMint = 1000;  // done
    uint256 fees;
    uint256 feesCollected;
    bool paused = false; // done

    mapping(uint256 => MI) m;

    mapping(uint256 => Offer[]) idOM; // idToOfferMint

    mapping(uint256 => Offer[]) idOT; //idToOffToken

    mapping(uint256 => MItem) idM; //idToMarketitem

    struct MI { // mintableItem
      address payable creator;
      uint256 mintPrice;
      uint256 close;
      uint256 max;
      string tokenURI; //arweave Hash
      uint supply;
      uint accrued;
      uint collected;
      uint id;
      bool approved;
      uint artistMints;
    }



    struct MItem { // Market Item
      uint256 tokenId;
      uint256 mintId;
      address payable seller;
      address payable owner;
      address payable creator;
      uint256 price;
      bool sold;
    }
    struct MItemO { // mintableItem
      MItem item;
      Offer[] oM;
      Offer[] oT;
    }


    struct Offer {
     address from;
     uint bid;
    }



    constructor(  address cAddress) ERC721("Seeing Red", "CNRED") {
      PTA = cAddress;
    }

    function ceil(uint a, uint mo) pure public returns (uint ) {
       return ((a + mo - 1) / mo) * mo;
   }

    function updateListingPrice(uint _price) public payable onlyOwner {

      listingPrice = _price;
    }

    function updateMaxMintsPerTX(uint _max) public payable onlyOwner {

      maxMintablePerTX = _max;
    }
    function updateMaxMintableDays(uint _max) public payable onlyOwner {

      maxMintableDays = _max;
    }

    function updateMintToUserMaxCount(uint _max) public payable onlyOwner {

      mintToUserMaxCount = _max;
    }


    function updateMaxMintablePerSubmission(uint _max) public payable onlyOwner {

      maxMintablePerSubmission = _max;
    }

    function updateMinMintablePerSubmission(uint _min) public payable onlyOwner {

      minMintablePerSubmission = _min;
    }


    function updatePlatFees(uint _fee) public payable onlyOwner {

      platformFees = _fee;
    }

    function updatePlatFeesAftermarket(uint _fee) public payable onlyOwner {
      platformFeesAftermarket = _fee;
    }

    function updatePaused(bool _p) public payable onlyOwner {

      paused = _p;
    }

    function updatePaymentToken(address _new) public payable onlyOwner {

      PTA = _new;
    }


    function updateMintToUserPoints(uint _min) public payable  onlyOwner {
      mintToUserPercentagePoint = _min;
    }

    function updateBurnPercentagePoints(uint _burnPoints) public payable  onlyOwner {
      burnPercentagePoints = _burnPoints;
    }

    function updateBurnPercentagePointsMint(uint _burnPointsM) public payable  onlyOwner {
      burnPercentagePointsMint = _burnPointsM;
    }

    function getListingPrice() public view returns (uint256) {
      return listingPrice;
    }


     function updateArweaveHash(uint id, string memory _hash) public onlyOwner(){
       uint iCT = _Ids.current();
       m[id].tokenURI = _hash;

       for (uint i=1; i <= iCT; i++) {
         if(idM[i].mintId == id){
           _setTokenURI(i, string(abi.encodePacked('https://arweave.net/',m[id].tokenURI)));
         }
       }
     }

     function offerOnMintId(uint id, uint bid) public payable{

       require(m[id].id == id,"id match");
       require(m[id].approved,'approved');

       require(bid>0,"0 bid");
       // is user approved allowance(address owner, address spender)
       require(IP(PTA).allowance(msg.sender, address(this)) >= bid, "allowance");
       // does user have enough balance?
       require(IP(PTA).balanceOf(msg.sender)>= bid,"bid");

       bool has = false;
       for (uint i; i < idOM[id].length ; i++) {
         if(idOM[id][i].from == msg.sender){
           idOM[id][i].bid = bid;
           has = true;
         }
       }
       if(!has){
          idOM[id].push(Offer(msg.sender, bid));
       }

       require(IP(PTA).transferFrom(msg.sender, address(this),bid),"transfer");

       inBids += bid;


     }
     function getFees() public view onlyOwner returns (uint256) {
       return fees;
     }

     function offerOnTokenId(uint id, uint bid) public payable{

       require(_exists(id),"exist");

       require(bid>0,"bid");
       // is user approved allowance(address owner, address spender)
       require(IP(PTA).allowance(msg.sender, address(this)) >= bid, "allowance");
       // does user have enough balance?
       require(IP(PTA).balanceOf(msg.sender)>= bid,"balance");

       bool has;
       for (uint i; i < idOT[id].length ; i++) {
         if(idOT[id][i].from == msg.sender){
           idOT[id][i].bid = bid;
           has = true;
         }
       }
       if(!has){
          idOT[id].push(Offer(msg.sender, bid));
       }

       require(IP(PTA).transferFrom(msg.sender, address(this),bid),"transfer");

       inBids += bid;
     }

     function cancelOfferOnMintId(uint id) public payable{
       uint removalIndex;
       bool has;
       for (uint i ; i < idOM[id].length ; i++) {
         if(idOM[id][i].from == msg.sender){

           require(IP(PTA).approve(address(this), idOM[id][i].bid), "approve");
           // transfer
           require(IP(PTA).transfer(msg.sender,  idOM[id][i].bid), "funds");

           inBids -= idOM[id][i].bid;
           idOM[id][i].bid = 0;
           has = true;
           removalIndex = i;
         }
       }
       if(has){
         removeMOffer(id,removalIndex);
       }
     }

     function removeMOffer(uint id, uint index) private{
      idOM[id][index] = idOM[id][idOM[id].length-1];
      idOM[id].pop();
    }

    function cancelOfferTokenId(uint id) public payable{
      uint removalIndex;
      bool has;
      for (uint i; i < idOT[id].length ; i++) {
        if(idOT[id][i].from == msg.sender){

          require(IP(PTA).approve(address(this), idOT[id][i].bid), "funds");
          // transfer
          require(IP(PTA).transfer(msg.sender,  idOT[id][i].bid), "funds");

          inBids -= idOT[id][i].bid;
          idOT[id][i].bid = 0;
          has = true;
          removalIndex = i;
        }
      }
      if(has){
        removeTOffer(id,removalIndex);
      }
    }

    function removeTOffer(uint id, uint index) private{
     idOT[id][index] = idOT[id][idOT[id].length-1];
     idOT[id].pop();
   }

   function acceptOffer(uint tId, uint mId, uint bid, address from, bool isTokenBuy) public payable {
      // owns tokenid // can only sell a token you own or have for sale.
      require(idM[tId].owner == msg.sender || idM[tId].seller == msg.sender, "owns");

      require(isTokenBuy ? true:idM[tId].mintId == mId, "mintId");

      Offer[] memory offers = isTokenBuy ? idOT[tId]:idOM[mId];

      bool hasBid;
      uint oI;
      for (uint i; i < offers.length ; i++) {
          if(offers[i].bid == bid && offers[i].from == from){
            hasBid = true;
            oI = i;
          }
        }
      require(hasBid,"no matching offer");

      // transer and set values
      if(!idM[tId].sold){
        _iSold.increment();
        idM[tId].sold = true;
      }
       if(idM[tId].owner == msg.sender){
         _transfer(msg.sender, from, tId);
       } else {
         _transfer(address(this), from, tId);
       }


       idM[tId].owner = payable(from);
       idM[tId].seller = payable(address(0));
       idM[tId].price = 0;

       inBids -= offers[oI].bid;

       uint platFees = (offers[oI].bid*platformFeesAftermarket)/10000;
       fees += platFees;
       uint256 toSeller = (offers[oI].bid-platFees);

        //take payment from contract and send from 'from' to 'msg.sender'
        require(IP(PTA).approve(address(this), toSeller));
        // transfer
        require(IP(PTA).transfer(msg.sender,  toSeller));

        isTokenBuy ? removeTOffer(tId,oI) : removeMOffer(mId,oI);
   }


    function createMintable(uint256 price, uint256 close, uint256 max, string memory tokenURI) public {
      require(!paused, "paused.");
      require(maxMintablePerSubmission>=max,"many");
      require(minMintablePerSubmission<=max,"low");
      require(close> (block.timestamp + (1 * 1 days)), "short");
      require(close<= (block.timestamp + (maxMintableDays * 1 days)), "long");
      // is user approved allowance(address owner, address spender)
      require(IP(PTA).allowance(msg.sender, address(this)) >= listingPrice,"NA");
      // does user have enough balance?
      require(IP(PTA).balanceOf(msg.sender)>= listingPrice,"balance");


      require(price > 0, "price");

      // Deal with fees....
      uint burn = (listingPrice*burnPercentagePoints)/10000;
      fees += (listingPrice-burn);

      require(IP(PTA).transferFrom(msg.sender, address(this),listingPrice),"Send");
      require(IP(PTA).transfer(0x000000000000000000000000000000000000dEaD, burn),"Burn");

      uint256 mId = _mIds.current();

      //figure out how many to mint user here.
      uint uM = ceil((max*mintToUserPercentagePoint)/10000,1);
      if(uM > mintToUserMaxCount){
        uM = mintToUserMaxCount;
      }
      m[mId] = MI(payable(msg.sender),price,close,max,tokenURI,0,0,0,mId, false, uM);

      _mIds.increment();

    }


    function artistMint(uint mId, uint count) public payable {
      require(!paused, "paused");
      require(msg.sender == m[mId].creator,"creator");
      require(m[mId].artistMints >= count,"avail");

      uint256 cMId = _mIds.current();
      require(mId<cMId,'ID');
      require(m[mId].approved == true,'NA');
      require(m[mId].supply+count<=m[mId].max, "many");
      require(m[mId].close>block.timestamp,"closed");

      inMint(mId, count);
      m[mId].artistMints = m[mId].artistMints - count;
      return;
    }


    function mint(uint mId, uint count) public payable {
      require(!paused, "paused");
      uint256 cMId = _mIds.current();
      require(mId<cMId,'id');

      require(m[mId].approved,'NA');
      require(m[mId].supply+count<=m[mId].max, "avail");
      require(m[mId].close>block.timestamp,"active");

      // is user approved  allowance(address owner, address spender)
      uint price = m[mId].mintPrice*count;
      require(IP(PTA).allowance(msg.sender, address(this)) >= price,"NA");

      uint burn = (price*burnPercentagePointsMint)/10000;
      uint platFees = (price*platformFees)/10000;

      // pay for mint and burn burnable
      require(IP(PTA).transferFrom(msg.sender, address(this),price),"send");
      require(IP(PTA).transfer(0x000000000000000000000000000000000000dEaD, burn),"burn");

      m[mId].accrued += (price-burn)-platFees;
      fees += platFees;

      inMint(mId, count);

      return;
    }

    function inMint(uint mId, uint count) private  {
      for (uint i; i < count; i++) {
        _iSold.increment();
        _Ids.increment();
        m[mId].supply ++;

        uint256 tId = _Ids.current();

        idM[tId] = MItem(tId,m[mId].id,payable(address(0)), payable(msg.sender),m[mId].creator,0,true);

        _mint(msg.sender, tId);
        _setTokenURI(tId, string(abi.encodePacked('https://arweave.net/',m[mId].tokenURI)));

      }
      return;
    }

    function approveMintable(uint mId, bool approved) public payable onlyOwner{
        m[mId].approved = approved;
    }

    function sellToken(uint256 tId, uint256 price) public payable {
      require(idM[tId].owner == msg.sender, "owns");
      require(price > 0, "price");
      idM[tId].sold = false;
      idM[tId].price = price;
      idM[tId].seller = payable(msg.sender);
      idM[tId].owner = payable(address(this));
      _iSold.decrement();
      _transfer(msg.sender, address(this), tId);
    }

    function buyToken(uint256 tId) public payable {
      uint price = idM[tId].price;

      // verify its for sale.
      require(idM[tId].sold ==false,"sold");
      // check its in our escrow...
      require(ownerOf(tId)>= address(this),"escrow");

      // does user have enough balance?
      require(IP(PTA).balanceOf(msg.sender)>= (price),"balance");

      // is user approved  allowance(address owner, address spender)
      require(IP(PTA).allowance(msg.sender, address(this)) >= (price),"NA");


      uint platFees = (price*platformFeesAftermarket)/10000;

      fees += platFees;

      uint256 toSeller = (price-platFees);

      require(IP(PTA).transferFrom(msg.sender, address(this),platFees),"fees");
      require(IP(PTA).transferFrom(msg.sender, address(idM[tId].seller),toSeller),"payment");



       idM[tId].owner = payable(msg.sender);
       idM[tId].sold = true;
       idM[tId].seller = payable(address(0));
       idM[tId].price = 0;

       _iSold.increment();
       _transfer(address(this), msg.sender, tId);

    }


    function cancelListing(uint256 tId) public payable {

      require(idM[tId].seller == msg.sender, "owner");

       idM[tId].owner = payable(msg.sender);
       idM[tId].sold = true;
       idM[tId].price = 0;
       idM[tId].seller = payable(address(0));
       _iSold.increment();
      _transfer(address(this), msg.sender, tId);

    }

    function fetchMintables(bool approved) public view returns (MI[] memory) {
      uint itemCount = _mIds.current();

      uint vMs;

      for (uint i; i < itemCount; i++) {
        bool p = approved ? m[i].approved:true;
        if(m[i].close > block.timestamp && p){
          vMs++;
        }
      }

      uint cI;

      MI[] memory it = new MI[](vMs);

      for (uint i; i <= itemCount; i++) {
        bool p = approved ? m[i].approved:true;
        if(m[i].close > block.timestamp && p){

          uint cID = i;

          MI storage cItem = m[cID];

          it[cI] = cItem;

          cI += 1;

        }
      }

      return it;
    }


    function fetchMyMintables(address mOwner) public view returns (MI[] memory) {
      uint iC = _mIds.current();

      uint vMs;

      for (uint i; i < iC + 1; i++) {
        if(m[i].creator == mOwner){
          vMs++;
        }
      }

      uint cI;

      MI[] memory it = new MI[](vMs);

      for (uint i; i < iC; i++) {
        if(m[i].creator == mOwner){

          uint cID = i;

          MI storage cItem = m[cID];

          it[cI] = cItem;

          cI += 1;

        }
      }

      return it;
    }



    function marketItems() public view returns (  MItemO[] memory) {
      uint iC = _Ids.current();
      uint cSold = _iSold.current();
      uint x = (_Ids.current() - cSold);
      uint cI;
      MItemO[] memory it = new MItemO[](x);

      if((_Ids.current() - cSold) == 0){
        return it;
      }
      for (uint i; i < iC; i++) {

        if (idM[i+1].owner == address(this)) {

          uint cID = i + 1;

          MItem storage cItem = idM[cID];
          it[cI] = MItemO(cItem,idOM[idM[cID].mintId],idOT[cID]);

          cI += 1;
        }
      }

      return it;
    }

    function myCollection(address user) public view returns (MItemO[] memory) {
      uint tIC = _Ids.current();
      uint iC;
      uint cI;

      for (uint i; i < tIC; i++) {
        // check if nft is mine
        if (idM[i+1].owner == user || idM[i+1].seller == user) {
          iC += 1;
        }
      }

      MItemO[] memory it = new MItemO[](iC);
      for (uint i; i < tIC; i++) {

        if (idM[i+1].owner == user || idM[i+1].seller == user) {
          uint cID = i+1;
          MItem storage cItem = idM[cID];
          it[cI] = MItemO(cItem,idOM[idM[cID].mintId],idOT[cID]);
          cI += 1;
        }
      }
      return it;
    }
    function getMarketItem(uint id) public view returns (MItemO memory){
      return MItemO(idM[id],idOM[idM[id].mintId],idOT[id]);
    }
    function listings() public view returns (MItemO[] memory) {
      uint tIC = _Ids.current();
      uint iC;
      uint cI;

      for (uint i; i < tIC; i++) {
        if (idM[i + 1].seller == msg.sender) {
          iC++;
        }
      }

      MItemO[] memory it = new MItemO[](iC);
      for (uint i; i < tIC; i++) {
        if (idM[i + 1].seller == msg.sender) {
          uint cID = i + 1;
          MItem storage cItem = idM[cID];
          it[cI] = MItemO(cItem,idOM[idM[cID].mintId],idOT[cID]);
          cI ++;
        }
      }

      return it;
    }

    function withdrawMikaForToken(uint id) external payable {
      require(m[id].creator == msg.sender,"creator");
      // approve move
      require(IP(PTA).approve(address(this), m[id].accrued));
      // transfer
      require(IP(PTA).transfer(msg.sender,  m[id].accrued));

      m[id].collected += m[id].accrued;
      m[id].accrued = 0;
    }

    function withdraw() external payable onlyOwner{
      // approve move
      require(IP(PTA).approve(address(this), fees));
      // transfer
      require(IP(PTA).transfer(msg.sender,  fees));
      // collected fees, so reset fees collectable.
      feesCollected += fees;
      fees = 0;
      payable(msg.sender).transfer(address(this).balance);
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) override internal {
          super._beforeTokenTransfer(from, to, tokenId);
          if(!(from == address(0) || ((to == address(this) && (from == idM[tokenId].seller||from == idM[tokenId].owner ))||(from == address(this) && (to == idM[tokenId].seller||to == idM[tokenId].owner )) ))) {
            if(idM[tokenId].sold == false){
              _iSold.increment();
              idM[tokenId].sold = true;
            }
            idM[tokenId].owner = payable(address(to));
            idM[tokenId].seller = payable(address(0));
            idM[tokenId].price = 0;
          }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"cAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PTA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tId","type":"uint256"},{"internalType":"uint256","name":"mId","type":"uint256"},{"internalType":"uint256","name":"bid","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"bool","name":"isTokenBuy","type":"bool"}],"name":"acceptOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mId","type":"uint256"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"approveMintable","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"artistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnPercentagePoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnPercentagePointsMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tId","type":"uint256"}],"name":"buyToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tId","type":"uint256"}],"name":"cancelListing","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"cancelOfferOnMintId","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"cancelOfferTokenId","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"mo","type":"uint256"}],"name":"ceil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"close","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"createMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"approved","type":"bool"}],"name":"fetchMintables","outputs":[{"components":[{"internalType":"address payable","name":"creator","type":"address"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"close","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"accrued","type":"uint256"},{"internalType":"uint256","name":"collected","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"approved","type":"bool"},{"internalType":"uint256","name":"artistMints","type":"uint256"}],"internalType":"struct IERC20NFTMintMarketplace.MI[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mOwner","type":"address"}],"name":"fetchMyMintables","outputs":[{"components":[{"internalType":"address payable","name":"creator","type":"address"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"close","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"accrued","type":"uint256"},{"internalType":"uint256","name":"collected","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"approved","type":"bool"},{"internalType":"uint256","name":"artistMints","type":"uint256"}],"internalType":"struct IERC20NFTMintMarketplace.MI[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getListingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getMarketItem","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"mintId","type":"uint256"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"address payable","name":"creator","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"sold","type":"bool"}],"internalType":"struct IERC20NFTMintMarketplace.MItem","name":"item","type":"tuple"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"bid","type":"uint256"}],"internalType":"struct IERC20NFTMintMarketplace.Offer[]","name":"oM","type":"tuple[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"bid","type":"uint256"}],"internalType":"struct IERC20NFTMintMarketplace.Offer[]","name":"oT","type":"tuple[]"}],"internalType":"struct IERC20NFTMintMarketplace.MItemO","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listings","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"mintId","type":"uint256"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"address payable","name":"creator","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"sold","type":"bool"}],"internalType":"struct IERC20NFTMintMarketplace.MItem","name":"item","type":"tuple"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"bid","type":"uint256"}],"internalType":"struct IERC20NFTMintMarketplace.Offer[]","name":"oM","type":"tuple[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"bid","type":"uint256"}],"internalType":"struct IERC20NFTMintMarketplace.Offer[]","name":"oT","type":"tuple[]"}],"internalType":"struct IERC20NFTMintMarketplace.MItemO[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketItems","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"mintId","type":"uint256"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"address payable","name":"creator","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"sold","type":"bool"}],"internalType":"struct IERC20NFTMintMarketplace.MItem","name":"item","type":"tuple"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"bid","type":"uint256"}],"internalType":"struct IERC20NFTMintMarketplace.Offer[]","name":"oM","type":"tuple[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"bid","type":"uint256"}],"internalType":"struct IERC20NFTMintMarketplace.Offer[]","name":"oT","type":"tuple[]"}],"internalType":"struct IERC20NFTMintMarketplace.MItemO[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintableDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintablePerSubmission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintablePerTX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minMintablePerSubmission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintToUserMaxCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintToUserPercentagePoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"myCollection","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"mintId","type":"uint256"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"address payable","name":"creator","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"sold","type":"bool"}],"internalType":"struct IERC20NFTMintMarketplace.MItem","name":"item","type":"tuple"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"bid","type":"uint256"}],"internalType":"struct IERC20NFTMintMarketplace.Offer[]","name":"oM","type":"tuple[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"bid","type":"uint256"}],"internalType":"struct IERC20NFTMintMarketplace.Offer[]","name":"oT","type":"tuple[]"}],"internalType":"struct IERC20NFTMintMarketplace.MItemO[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"bid","type":"uint256"}],"name":"offerOnMintId","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"bid","type":"uint256"}],"name":"offerOnTokenId","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFeesAftermarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"sellToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"_hash","type":"string"}],"name":"updateArweaveHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnPoints","type":"uint256"}],"name":"updateBurnPercentagePoints","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnPointsM","type":"uint256"}],"name":"updateBurnPercentagePointsMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updateListingPrice","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"updateMaxMintableDays","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"updateMaxMintablePerSubmission","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"updateMaxMintsPerTX","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"updateMinMintablePerSubmission","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"updateMintToUserMaxCount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"updateMintToUserPoints","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_p","type":"bool"}],"name":"updatePaused","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"updatePaymentToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updatePlatFees","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updatePlatFeesAftermarket","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"withdrawMikaForToken","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526001600c556103e8600d8190556008600e556a115eec47f6cf7e35000000600f9081556010556101f46011819055600a6012556014556096601555611964601655601755601a805460ff191690553480156200005f57600080fd5b506040516200629138038062006291833981016040819052620000829162000226565b604080518082018252600a81526914d9595a5b99c814995960b21b60208083019182528351808501909452600584526410d394915160da1b908401528151919291620000d19160009162000180565b508051620000e790600190602084019062000180565b50505062000104620000fe6200012a60201b60201c565b6200012e565b600b80546001600160a01b0319166001600160a01b039290921691909117905562000295565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200018e9062000258565b90600052602060002090601f016020900481019282620001b25760008555620001fd565b82601f10620001cd57805160ff1916838001178555620001fd565b82800160010185558215620001fd579182015b82811115620001fd578251825591602001919060010190620001e0565b506200020b9291506200020f565b5090565b5b808211156200020b576000815560010162000210565b6000602082840312156200023957600080fd5b81516001600160a01b03811681146200025157600080fd5b9392505050565b600181811c908216806200026d57607f821691505b602082108114156200028f57634e487b7160e01b600052602260045260246000fd5b50919050565b615fec80620002a56000396000f3fe60806040526004361061035d5760003560e01c8063724eb1a8116101cd578063b88d4fde11610108578063c87b56dd116100ab578063e264ed0d1161007a578063e264ed0d1461095f578063e985e9c514610975578063f2fde38b14610995578063f3c89048146109b5578063f6c94deb146109c857600080fd5b8063c87b56dd14610904578063ca3eadea14610924578063d2f82a9a14610937578063db8d55f11461094a57600080fd5b8063b88d4fde14610828578063bd7e5c7b14610848578063bf1be88814610868578063bf30fdc014610888578063c36ddbc11461089b578063c78f19f9146108ae578063c7be7a49146108c4578063c800144c146108f157600080fd5b806395d89b411161017057806395d89b4114610774578063a22cb46514610789578063a376288f146107a9578063a4ea6889146107bc578063a6f0cea8146107cf578063ad4881e9146107e2578063ad48c6c914610802578063ae677aa31461081557600080fd5b8063724eb1a814610698578063789cc05a146106b85780638587be6e146106d8578063875bf268146106f8578063883f74831461071a5780638da5cb5b1461073057806391599bab1461074e578063954fabd01461076157600080fd5b80632ba96f4f1161029d5780634f2220bc116102405780634f2220bc146105de578063557725a0146105f45780635cd9a7651461060757806360015c611461061a5780636054475c146106305780636352211e1461064357806370a0823114610663578063715018a61461068357600080fd5b80632ba96f4f146105415780632d296bf114610554578063305a67a8146105675780633b12a7371461057a5780633ccfd60b1461059057806342842e0e14610598578063456e39fd146105b85780634ccf1b34146105cb57600080fd5b80630b427ce7116103055780630b427ce71461048e5780630c92a3e2146104a457806312e85585146104ba5780631897bcf3146104cf578063194a4e7e146104e25780631b2ef1ca146104f857806323b872dd1461050b5780632b330a641461052b57600080fd5b80621a6307146103625780630131b0681461039857806301ffc9a7146103ad57806306fdde03146103dd578063081812fc146103ff5780630898181a1461043757806308cdc2a81461045b578063095ea7b31461046e575b600080fd5b34801561036e57600080fd5b5061038261037d3660046154ca565b6109dd565b60405161038f9190615a99565b60405180910390f35b6103ab6103a63660046156a4565b610c3d565b005b3480156103b957600080fd5b506103cd6103c836600461566a565b610efa565b604051901515815260200161038f565b3480156103e957600080fd5b506103f2610f4c565b60405161038f9190615bdd565b34801561040b57600080fd5b5061041f61041a3660046156a4565b610fde565b6040516001600160a01b03909116815260200161038f565b34801561044357600080fd5b5061044d60115481565b60405190815260200161038f565b6103ab610469366004615630565b611005565b34801561047a57600080fd5b506103ab610489366004615606565b611020565b34801561049a57600080fd5b5061044d60125481565b3480156104b057600080fd5b5061044d600d5481565b3480156104c657600080fd5b50600f5461044d565b6103ab6104dd366004615741565b611131565b3480156104ee57600080fd5b5061044d60145481565b6103ab610506366004615741565b6111e9565b34801561051757600080fd5b506103ab610526366004615518565b6115e5565b34801561053757600080fd5b5061044d60105481565b6103ab61054f3660046156a4565b611616565b6103ab6105623660046156a4565b611623565b6103ab6105753660046156a4565b611a2a565b34801561058657600080fd5b5061044d600e5481565b6103ab611add565b3480156105a457600080fd5b506103ab6105b3366004615518565b611c4f565b6103ab6105c63660046156a4565b611c6a565b6103ab6105d93660046154ca565b611c77565b3480156105ea57600080fd5b5061044d60165481565b6103ab6106023660046156a4565b611ca1565b6103ab6106153660046156a4565b611cae565b34801561062657600080fd5b5061044d60175481565b6103ab61063e3660046156a4565b611cbb565b34801561064f57600080fd5b5061041f61065e3660046156a4565b611cc8565b34801561066f57600080fd5b5061044d61067e3660046154ca565b611cfd565b34801561068f57600080fd5b506103ab611d83565b3480156106a457600080fd5b50600b5461041f906001600160a01b031681565b3480156106c457600080fd5b506103ab6106d33660046157b7565b611d97565b3480156106e457600080fd5b5061044d6106f3366004615741565b61232e565b34801561070457600080fd5b5061070d612363565b60405161038f9190615b7b565b34801561072657600080fd5b5061044d600c5481565b34801561073c57600080fd5b506007546001600160a01b031661041f565b6103ab61075c3660046156a4565b61260d565b6103ab61076f366004615741565b61261a565b34801561078057600080fd5b506103f261299a565b34801561079557600080fd5b506103ab6107a43660046155cf565b6129a9565b6103ab6107b73660046156a4565b6129b4565b6103ab6107ca3660046156a4565b612b6a565b6103ab6107dd3660046156d6565b612b77565b3480156107ee57600080fd5b506103826107fd366004615630565b612ba2565b6103ab6108103660046156a4565b612e3d565b6103ab6108233660046156a4565b612e4a565b34801561083457600080fd5b506103ab610843366004615554565b612e57565b34801561085457600080fd5b5061070d6108633660046154ca565b612e89565b34801561087457600080fd5b506103ab6108833660046156fb565b6131dc565b6103ab6108963660046156a4565b61328b565b6103ab6108a9366004615763565b613298565b3480156108ba57600080fd5b5061044d600f5481565b3480156108d057600080fd5b506108e46108df3660046156a4565b613767565b60405161038f9190615e19565b6103ab6108ff3660046156a4565b6138ea565b34801561091057600080fd5b506103f261091f3660046156a4565b6138f7565b6103ab6109323660046156a4565b613a08565b6103ab610945366004615741565b613cd1565b34801561095657600080fd5b5061044d614014565b34801561096b57600080fd5b5061044d60155481565b34801561098157600080fd5b506103cd6109903660046154e5565b614025565b3480156109a157600080fd5b506103ab6109b03660046154ca565b614053565b6103ab6109c3366004615741565b6140c9565b3480156109d457600080fd5b5061070d614296565b606060006109ea600a5490565b90506000805b6109fb836001615e2c565b811015610a44576000818152601b60205260409020546001600160a01b0386811691161415610a325781610a2e81615ef5565b9250505b80610a3c81615ef5565b9150506109f0565b50600080826001600160401b03811115610a6057610a60615f7c565b604051908082528060200260200182016040528015610a9957816020015b610a866152c3565b815260200190600190039081610a7e5790505b50905060005b84811015610c33576000818152601b60205260409020546001600160a01b0388811691161415610c21576000818152601b602090815260409182902082516101608101845281546001600160a01b0316815260018201549281019290925260028101549282019290925260038201546060820152600482018054849392918391608084019190610b2e90615eba565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5a90615eba565b8015610ba75780601f10610b7c57610100808354040283529160200191610ba7565b820191906000526020600020905b815481529060010190602001808311610b8a57829003601f168201915b505050918352505060058201546020820152600682015460408201526007820154606082015260088201546080820152600982015460ff16151560a0820152600a9091015460c0909101528451859087908110610c0657610c06615f66565b6020908102919091010152610c1c600186615e2c565b945050505b80610c2b81615ef5565b915050610a9f565b5095945050505050565b60008060005b6000848152601d6020526040902054811015610ee4576000848152601d60205260409020805433919083908110610c7c57610c7c615f66565b60009182526020909120600290910201546001600160a01b03161415610ed257600b546000858152601d6020526040902080546001600160a01b039092169163095ea7b391309185908110610cd357610cd3615f66565b9060005260206000209060020201600101546040518363ffffffff1660e01b8152600401610d02929190615a80565b602060405180830381600087803b158015610d1c57600080fd5b505af1158015610d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d54919061564d565b610d795760405162461bcd60e51b8152600401610d7090615cdc565b60405180910390fd5b600b546000858152601d6020526040902080546001600160a01b039092169163a9059cbb91339185908110610db057610db0615f66565b9060005260206000209060020201600101546040518363ffffffff1660e01b8152600401610ddf929190615a80565b602060405180830381600087803b158015610df957600080fd5b505af1158015610e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e31919061564d565b610e4d5760405162461bcd60e51b8152600401610d7090615cdc565b6000848152601d60205260409020805482908110610e6d57610e6d615f66565b90600052602060002090600202016001015460136000828254610e909190615e77565b90915550506000848152601d60205260408120805483908110610eb557610eb5615f66565b906000526020600020906002020160010181905550600191508092505b80610edc81615ef5565b915050610c43565b508015610ef557610ef58383614565565b505050565b60006001600160e01b031982166380ac58cd60e01b1480610f2b57506001600160e01b03198216635b5e139f60e01b145b80610f4657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610f5b90615eba565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8790615eba565b8015610fd45780601f10610fa957610100808354040283529160200191610fd4565b820191906000526020600020905b815481529060010190602001808311610fb757829003601f168201915b5050505050905090565b6000610fe982614648565b506000908152600460205260409020546001600160a01b031690565b61100d61466d565b601a805460ff1916911515919091179055565b600061102b82611cc8565b9050806001600160a01b0316836001600160a01b031614156110995760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d70565b336001600160a01b03821614806110b557506110b58133614025565b6111275760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610d70565b610ef583836146c7565b6000828152601e60205260409020600301546001600160a01b0316331461116a5760405162461bcd60e51b8152600401610d7090615bf0565b6000811161118a5760405162461bcd60e51b8152600401610d7090615ca0565b6000828152601e6020526040902060068101805460ff19169055600581018290556002810180546001600160a01b0319908116331790915560039091018054909116301790556111da6009614735565b6111e533308461478c565b5050565b601a5460ff161561120c5760405162461bcd60e51b8152600401610d7090615df9565b6000611217600a5490565b905080831061124d5760405162461bcd60e51b81526020600482015260026024820152611a5960f21b6044820152606401610d70565b6000838152601b602052604090206009015460ff1661127e5760405162461bcd60e51b8152600401610d7090615d4b565b6000838152601b6020526040902060038101546005909101546112a2908490615e2c565b11156112c05760405162461bcd60e51b8152600401610d7090615c81565b6000838152601b602052604090206002015442106113095760405162461bcd60e51b815260206004820152600660248201526561637469766560d01b6044820152606401610d70565b6000838152601b6020526040812060010154611326908490615e58565b600b54604051636eb1769f60e11b815291925082916001600160a01b039091169063dd62ed3e9061135d9033903090600401615a05565b60206040518083038186803b15801561137557600080fd5b505afa158015611389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ad91906156bd565b10156113cb5760405162461bcd60e51b8152600401610d7090615d4b565b6000612710601754836113de9190615e58565b6113e89190615e44565b90506000612710601454846113fd9190615e58565b6114079190615e44565b600b546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd9061143c90339030908890600401615a1f565b602060405180830381600087803b15801561145657600080fd5b505af115801561146a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148e919061564d565b6114c35760405162461bcd60e51b8152600401610d70906020808252600490820152631cd95b9960e21b604082015260600190565b600b5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906114f79061dead908690600401615a80565b602060405180830381600087803b15801561151157600080fd5b505af1158015611525573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611549919061564d565b61157e5760405162461bcd60e51b8152600401610d7090602080825260049082015263313ab93760e11b604082015260600190565b806115898385615e77565b6115939190615e77565b6000878152601b6020526040812060060180549091906115b4908490615e2c565b9250508190555080601860008282546115cd9190615e2c565b909155506115dd90508686614933565b505050505050565b6115ef3382614aa2565b61160b5760405162461bcd60e51b8152600401610d7090615dab565b610ef583838361478c565b61161e61466d565b601155565b6000818152601e60205260409020600581015460069091015460ff16156116755760405162461bcd60e51b8152600401610d70906020808252600490820152631cdbdb1960e21b604082015260600190565b3061167f83611cc8565b6001600160a01b031610156116bf5760405162461bcd60e51b8152602060048201526006602482015265657363726f7760d01b6044820152606401610d70565b600b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b15801561170257600080fd5b505afa158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a91906156bd565b10156117585760405162461bcd60e51b8152600401610d7090615d8a565b600b54604051636eb1769f60e11b815282916001600160a01b03169063dd62ed3e9061178a9033903090600401615a05565b60206040518083038186803b1580156117a257600080fd5b505afa1580156117b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117da91906156bd565b10156117f85760405162461bcd60e51b8152600401610d7090615d4b565b60006127106015548361180b9190615e58565b6118159190615e44565b905080601860008282546118299190615e2c565b909155506000905061183b8284615e77565b600b546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd9061187090339030908790600401615a1f565b602060405180830381600087803b15801561188a57600080fd5b505af115801561189e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c2919061564d565b6118f75760405162461bcd60e51b8152600401610d70906020808252600490820152636665657360e01b604082015260600190565b600b546000858152601e6020526040908190206002015490516323b872dd60e01b81526001600160a01b03928316926323b872dd92611940923392909116908690600401615a1f565b602060405180830381600087803b15801561195a57600080fd5b505af115801561196e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611992919061564d565b6119c85760405162461bcd60e51b81526020600482015260076024820152661c185e5b595b9d60ca1b6044820152606401610d70565b6000848152601e602052604081206003810180546001600160a01b0319908116331790915560068201805460ff19166001179055600282018054909116905560050155611a19600980546001019055565b611a2430338661478c565b50505050565b6000818152601e60205260409020600201546001600160a01b03163314611a7b5760405162461bcd60e51b815260206004820152600560248201526437bbb732b960d91b6044820152606401610d70565b6000818152601e602052604081206003810180546001600160a01b0319908116331790915560068201805460ff19166001179055600582019290925560020180549091169055611acf600980546001019055565b611ada30338361478c565b50565b611ae561466d565b600b5460185460405163095ea7b360e01b81526001600160a01b039092169163095ea7b391611b1991309190600401615a80565b602060405180830381600087803b158015611b3357600080fd5b505af1158015611b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6b919061564d565b611b7457600080fd5b600b5460185460405163a9059cbb60e01b81526001600160a01b039092169163a9059cbb91611ba891339190600401615a80565b602060405180830381600087803b158015611bc257600080fd5b505af1158015611bd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfa919061564d565b611c0357600080fd5b60185460196000828254611c179190615e2c565b90915550506000601881905560405133914780156108fc02929091818181858888f19350505050158015611ada573d6000803e3d6000fd5b610ef583838360405180602001604052806000815250612e57565b611c7261466d565b600c55565b611c7f61466d565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b611ca961466d565b601255565b611cb661466d565b601055565b611cc361466d565b601455565b6000818152600260205260408120546001600160a01b031680610f465760405162461bcd60e51b8152600401610d7090615cfb565b60006001600160a01b038216611d675760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610d70565b506001600160a01b031660009081526003602052604090205490565b611d8b61466d565b611d956000614b00565b565b601a5460ff1615611dd45760405162461bcd60e51b81526020600482015260076024820152663830bab9b2b21760c91b6044820152606401610d70565b81600d541015611df65760405162461bcd60e51b8152600401610d7090615d2d565b81600c541115611e2e5760405162461bcd60e51b81526020600482015260036024820152626c6f7760e81b6044820152606401610d70565b611e3b4262015180615e2c565b8311611e715760405162461bcd60e51b81526020600482015260056024820152641cda1bdc9d60da1b6044820152606401610d70565b601054611e819062015180615e58565b611e8b9042615e2c565b831115611ec35760405162461bcd60e51b8152600401610d70906020808252600490820152636c6f6e6760e01b604082015260600190565b600f54600b54604051636eb1769f60e11b81526001600160a01b039091169063dd62ed3e90611ef89033903090600401615a05565b60206040518083038186803b158015611f1057600080fd5b505afa158015611f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4891906156bd565b1015611f665760405162461bcd60e51b8152600401610d7090615d4b565b600f54600b546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611fac57600080fd5b505afa158015611fc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe491906156bd565b10156120025760405162461bcd60e51b8152600401610d7090615d8a565b600084116120225760405162461bcd60e51b8152600401610d7090615ca0565b6000612710601654600f546120379190615e58565b6120419190615e44565b905080600f546120519190615e77565b601860008282546120629190615e2c565b9091555050600b54600f546040516323b872dd60e01b81526001600160a01b03909216916323b872dd9161209c9133913091600401615a1f565b602060405180830381600087803b1580156120b657600080fd5b505af11580156120ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ee919061564d565b6121235760405162461bcd60e51b8152600401610d709060208082526004908201526314d95b9960e21b604082015260600190565b600b5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906121579061dead908590600401615a80565b602060405180830381600087803b15801561217157600080fd5b505af1158015612185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a9919061564d565b6121de5760405162461bcd60e51b8152600401610d7090602080825260049082015263213ab93760e11b604082015260600190565b60006121e9600a5490565b90506000612212612710601154876122019190615e58565b61220b9190615e44565b600161232e565b905060125481111561222357506012545b604080516101608101825233815260208082018a81528284018a8152606084018a8152608085018a8152600060a0870181905260c0870181905260e0870181905261010087018a905261012087018190526101408701899052898152601b865296909620855181546001600160a01b0319166001600160a01b039091161781559251600184015590516002830155516003820155925180519293926122ce9260048501920190615328565b5060a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012082015160098201805460ff191691151591909117905561014090910151600a918201558054600101905550505050505050565b60008180600161233e8287615e2c565b6123489190615e77565b6123529190615e44565b61235c9190615e58565b9392505050565b6060600061237060085490565b9050600061237d60095490565b905060008161238b60085490565b6123959190615e77565b9050600080826001600160401b038111156123b2576123b2615f7c565b6040519080825280602002602001820160405280156123eb57816020015b6123d86153ac565b8152602001906001900390816123d05790505b509050836123f860085490565b6124029190615e77565b61240f5795945050505050565b60005b85811015610c335730601e600061242a846001615e2c565b81526020810191909152604001600020600301546001600160a01b031614156125fb57600061245a826001615e2c565b6000818152601e6020908152604080832081516101408101835281546060820190815260018301546080830181905260028401546001600160a01b0390811660a08501526003850154811660c085015260048501541660e08401526005840154610100840152600684015460ff1615156101208401529082528552601c84528285208054845181870281018701909552808552969750919590948585019484015b82821015612543576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016124fb565b505050508152602001601d6000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156125c7576000848152602090819020604080518082019091526002850290910180546001600160a01b0316825260019081015482840152908352909201910161257f565b505050508152508486815181106125e0576125e0615f66565b60209081029190910101526125f6600186615e2c565b945050505b8061260581615ef5565b915050612412565b61261561466d565b601655565b61262382614b52565b6126575760405162461bcd60e51b8152602060048201526005602482015264195e1a5cdd60da1b6044820152606401610d70565b600081116126775760405162461bcd60e51b8152600401610d7090615cbf565b600b54604051636eb1769f60e11b815282916001600160a01b03169063dd62ed3e906126a99033903090600401615a05565b60206040518083038186803b1580156126c157600080fd5b505afa1580156126d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f991906156bd565b10156127175760405162461bcd60e51b8152600401610d7090615d67565b600b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b15801561275a57600080fd5b505afa15801561276e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279291906156bd565b10156127b05760405162461bcd60e51b8152600401610d7090615d8a565b6000805b6000848152601d602052604090205481101561285c576000848152601d602052604090208054339190839081106127ed576127ed615f66565b60009182526020909120600290910201546001600160a01b0316141561284a576000848152601d6020526040902080548491908390811061283057612830615f66565b906000526020600020906002020160010181905550600191505b8061285481615ef5565b9150506127b4565b50806128c1576000838152601d602090815260408083208151808301909252338252818301868152815460018082018455928652939094209151600290930290910180546001600160a01b0319166001600160a01b0390931692909217825591519101555b600b546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906128f590339030908790600401615a1f565b602060405180830381600087803b15801561290f57600080fd5b505af1158015612923573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612947919061564d565b61297e5760405162461bcd60e51b81526020600482015260086024820152673a3930b739b332b960c11b6044820152606401610d70565b81601360008282546129909190615e2c565b9091555050505050565b606060018054610f5b90615eba565b6111e5338383614b6f565b6000818152601b60205260409020546001600160a01b031633146129ea5760405162461bcd60e51b8152600401610d7090615c0e565b600b546000828152601b60205260409081902060060154905163095ea7b360e01b81526001600160a01b039092169163095ea7b391612a2e91309190600401615a80565b602060405180830381600087803b158015612a4857600080fd5b505af1158015612a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a80919061564d565b612a8957600080fd5b600b546000828152601b60205260409081902060060154905163a9059cbb60e01b81526001600160a01b039092169163a9059cbb91612acd91339190600401615a80565b602060405180830381600087803b158015612ae757600080fd5b505af1158015612afb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1f919061564d565b612b2857600080fd5b6000818152601b6020526040812060068101546007909101805491929091612b51908490615e2c565b90915550506000908152601b6020526040812060060155565b612b7261466d565b600d55565b612b7f61466d565b6000918252601b6020526040909120600901805460ff1916911515919091179055565b60606000612baf600a5490565b90506000805b82811015612c2757600085612bcb576001612be1565b6000828152601b602052604090206009015460ff165b6000838152601b602052604090206002015490915042108015612c015750805b15612c145782612c1081615ef5565b9350505b5080612c1f81615ef5565b915050612bb5565b50600080826001600160401b03811115612c4357612c43615f7c565b604051908082528060200260200182016040528015612c7c57816020015b612c696152c3565b815260200190600190039081612c615790505b50905060005b848111610c3357600087612c97576001612cad565b6000828152601b602052604090206009015460ff165b6000838152601b602052604090206002015490915042108015612ccd5750805b15612e2a576000828152601b602090815260409182902082516101608101845281546001600160a01b0316815260018201549281019290925260028101549282019290925260038201546060820152600482018054859392918391608084019190612d3790615eba565b80601f0160208091040260200160405190810160405280929190818152602001828054612d6390615eba565b8015612db05780601f10612d8557610100808354040283529160200191612db0565b820191906000526020600020905b815481529060010190602001808311612d9357829003601f168201915b505050918352505060058201546020820152600682015460408201526007820154606082015260088201546080820152600982015460ff16151560a0820152600a9091015460c0909101528551869088908110612e0f57612e0f615f66565b6020908102919091010152612e25600187615e2c565b955050505b5080612e3581615ef5565b915050612c82565b612e4561466d565b601755565b612e5261466d565b600f55565b612e613383614aa2565b612e7d5760405162461bcd60e51b8152600401610d7090615dab565b611a2484848484614c3e565b60606000612e9660085490565b905060008060005b83811015612f40576001600160a01b038616601e6000612ebf846001615e2c565b81526020810191909152604001600020600301546001600160a01b03161480612f1b57506001600160a01b038616601e6000612efc846001615e2c565b81526020810191909152604001600020600201546001600160a01b0316145b15612f2e57612f2b600184615e2c565b92505b80612f3881615ef5565b915050612e9e565b506000826001600160401b03811115612f5b57612f5b615f7c565b604051908082528060200260200182016040528015612f9457816020015b612f816153ac565b815260200190600190039081612f795790505b50905060005b84811015610c33576001600160a01b038716601e6000612fbb846001615e2c565b81526020810191909152604001600020600301546001600160a01b0316148061301757506001600160a01b038716601e6000612ff8846001615e2c565b81526020810191909152604001600020600201546001600160a01b0316145b156131ca576000613029826001615e2c565b6000818152601e6020908152604080832081516101408101835281546060820190815260018301546080830181905260028401546001600160a01b0390811660a08501526003850154811660c085015260048501541660e08401526005840154610100840152600684015460ff1615156101208401529082528552601c84528285208054845181870281018701909552808552969750919590948585019484015b82821015613112576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016130ca565b505050508152602001601d6000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015613196576000848152602090819020604080518082019091526002850290910180546001600160a01b0316825260019081015482840152908352909201910161314e565b505050508152508486815181106131af576131af615f66565b60209081029190910101526131c5600186615e2c565b945050505b806131d481615ef5565b915050612f9a565b6131e461466d565b60006131ef60085490565b6000848152601b60209081526040909120845192935061321792600490910191850190615328565b5060015b818111611a24576000818152601e60205260409020600101548414156132795761327981601b60008781526020019081526020016000206004016040516020016132659190615943565b604051602081830303815290604052614c71565b8061328381615ef5565b91505061321b565b61329361466d565b600e55565b6000858152601e60205260409020600301546001600160a01b03163314806132d957506000858152601e60205260409020600201546001600160a01b031633145b6132f55760405162461bcd60e51b8152600401610d7090615bf0565b80613313576000858152601e60205260409020600101548414613316565b60015b61334b5760405162461bcd60e51b81526020600482015260066024820152651b5a5b9d125960d21b6044820152606401610d70565b600081613365576000858152601c60205260409020613374565b6000868152601d602052604090205b805480602002602001604051908101604052809291908181526020016000905b828210156133dc576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101613394565b50505050905060008060005b835181101561346a578684828151811061340457613404615f66565b60200260200101516020015114801561344b5750856001600160a01b031684828151811061343457613434615f66565b6020026020010151600001516001600160a01b0316145b1561345857600192508091505b8061346281615ef5565b9150506133e8565b50816134ac5760405162461bcd60e51b815260206004820152601160248201527037379036b0ba31b434b7339037b33332b960791b6044820152606401610d70565b6000888152601e602052604090206006015460ff166134f0576134d3600980546001019055565b6000888152601e60205260409020600601805460ff191660011790555b6000888152601e60205260409020600301546001600160a01b03163314156135225761351d33868a61478c565b61352d565b61352d30868a61478c565b6000888152601e602052604081206003810180546001600160a01b0389166001600160a01b031991821617909155600282018054909116905560050155825183908290811061357e5761357e615f66565b6020026020010151602001516013600082825461359b9190615e77565b9250508190555060006127106015548584815181106135bc576135bc615f66565b6020026020010151602001516135d29190615e58565b6135dc9190615e44565b905080601860008282546135f09190615e2c565b9250508190555060008185848151811061360c5761360c615f66565b6020026020010151602001516136229190615e77565b600b5460405163095ea7b360e01b81529192506001600160a01b03169063095ea7b3906136559030908590600401615a80565b602060405180830381600087803b15801561366f57600080fd5b505af1158015613683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136a7919061564d565b6136b057600080fd5b600b5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906136e29033908590600401615a80565b602060405180830381600087803b1580156136fc57600080fd5b505af1158015613710573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613734919061564d565b61373d57600080fd5b856137515761374c8984614cfc565b61375b565b61375b8a84614565565b50505050505050505050565b61376f6153ac565b604080516000848152601e60209081528382206101408401855280546060850190815260018201546080860181905260028301546001600160a01b0390811660a08801526003840154811660c088015260048401541660e0870152600583015461010087015260069092015460ff16151561012086015284528252601c815283822080548551818402810184019096528086529394828601949093919290919084015b8282101561385a576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101613812565b505050508152602001601d6000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156138de576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101613896565b50505091525092915050565b6138f261466d565b601555565b606061390282614648565b6000828152600660205260408120805461391b90615eba565b80601f016020809104026020016040519081016040528092919081815260200182805461394790615eba565b80156139945780601f1061396957610100808354040283529160200191613994565b820191906000526020600020905b81548152906001019060200180831161397757829003601f168201915b5050505050905060006139b260408051602081019091526000815290565b90508051600014156139c5575092915050565b8151156139f75780826040516020016139df929190615914565b60405160208183030381529060405292505050919050565b613a0084614db2565b949350505050565b60008060005b6000848152601c6020526040902054811015613cc0576000848152601c60205260409020805433919083908110613a4757613a47615f66565b60009182526020909120600290910201546001600160a01b03161415613cae57600b546000858152601c6020526040902080546001600160a01b039092169163095ea7b391309185908110613a9e57613a9e615f66565b9060005260206000209060020201600101546040518363ffffffff1660e01b8152600401613acd929190615a80565b602060405180830381600087803b158015613ae757600080fd5b505af1158015613afb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b1f919061564d565b613b555760405162461bcd60e51b8152602060048201526007602482015266617070726f766560c81b6044820152606401610d70565b600b546000858152601c6020526040902080546001600160a01b039092169163a9059cbb91339185908110613b8c57613b8c615f66565b9060005260206000209060020201600101546040518363ffffffff1660e01b8152600401613bbb929190615a80565b602060405180830381600087803b158015613bd557600080fd5b505af1158015613be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c0d919061564d565b613c295760405162461bcd60e51b8152600401610d7090615cdc565b6000848152601c60205260409020805482908110613c4957613c49615f66565b90600052602060002090600202016001015460136000828254613c6c9190615e77565b90915550506000848152601c60205260408120805483908110613c9157613c91615f66565b906000526020600020906002020160010181905550600191508092505b80613cb881615ef5565b915050613a0e565b508015610ef557610ef58383614cfc565b6000828152601b60205260409020600801548214613d1c5760405162461bcd60e51b81526020600482015260086024820152670d2c840dac2e8c6d60c31b6044820152606401610d70565b6000828152601b602052604090206009015460ff16613d685760405162461bcd60e51b8152602060048201526008602482015267185c1c1c9bdd995960c21b6044820152606401610d70565b60008111613da05760405162461bcd60e51b81526020600482015260056024820152640c08189a5960da1b6044820152606401610d70565b600b54604051636eb1769f60e11b815282916001600160a01b03169063dd62ed3e90613dd29033903090600401615a05565b60206040518083038186803b158015613dea57600080fd5b505afa158015613dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e2291906156bd565b1015613e405760405162461bcd60e51b8152600401610d7090615d67565b600b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b158015613e8357600080fd5b505afa158015613e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ebb91906156bd565b1015613ed95760405162461bcd60e51b8152600401610d7090615cbf565b6000805b6000848152601c6020526040902054811015613f85576000848152601c60205260409020805433919083908110613f1657613f16615f66565b60009182526020909120600290910201546001600160a01b03161415613f73576000848152601c60205260409020805484919083908110613f5957613f59615f66565b906000526020600020906002020160010181905550600191505b80613f7d81615ef5565b915050613edd565b50806128c1576000838152601c602090815260408083208151808301835233808252818501888152835460018082018655948852959096209151600290950290910180546001600160a01b0319166001600160a01b0395861617815594519490910193909355600b5490516323b872dd60e01b81529116916323b872dd916128f5919030908790600401615a1f565b600061401e61466d565b5060185490565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61405b61466d565b6001600160a01b0381166140c05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d70565b611ada81614b00565b601a5460ff16156140ec5760405162461bcd60e51b8152600401610d7090615df9565b6000828152601b60205260409020546001600160a01b031633146141225760405162461bcd60e51b8152600401610d7090615c0e565b6000828152601b60205260409020600a01548111156141535760405162461bcd60e51b8152600401610d7090615c81565b600061415e600a5490565b90508083106141945760405162461bcd60e51b8152602060048201526002602482015261125160f21b6044820152606401610d70565b6000838152601b602052604090206009015460ff1615156001146141ca5760405162461bcd60e51b8152600401610d7090615d4b565b6000838152601b6020526040902060038101546005909101546141ee908490615e2c565b111561420c5760405162461bcd60e51b8152600401610d7090615d2d565b6000838152601b602052604090206002015442106142555760405162461bcd60e51b815260206004820152600660248201526518db1bdcd95960d21b6044820152606401610d70565b61425f8383614933565b6000838152601b60205260409020600a015461427c908390615e77565b6000938452601b6020526040909320600a01929092555050565b606060006142a360085490565b905060008060005b838110156143065733601e60006142c3846001615e2c565b81526020810191909152604001600020600201546001600160a01b031614156142f457826142f081615ef5565b9350505b806142fe81615ef5565b9150506142ab565b506000826001600160401b0381111561432157614321615f7c565b60405190808252806020026020018201604052801561435a57816020015b6143476153ac565b81526020019060019003908161433f5790505b50905060005b8481101561455c5733601e6000614378846001615e2c565b81526020810191909152604001600020600201546001600160a01b0316141561454a5760006143a8826001615e2c565b6000818152601e6020908152604080832081516101408101835281546060820190815260018301546080830181905260028401546001600160a01b0390811660a08501526003850154811660c085015260048501541660e08401526005840154610100840152600684015460ff1615156101208401529082528552601c84528285208054845181870281018701909552808552969750919590948585019484015b82821015614491576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101614449565b505050508152602001601d6000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015614515576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016144cd565b5050505081525084868151811061452e5761452e615f66565b6020026020010181905250848061454490615ef5565b95505050505b8061455481615ef5565b915050614360565b50949350505050565b6000828152601d60205260409020805461458190600190615e77565b8154811061459157614591615f66565b9060005260206000209060020201601d600084815260200190815260200160002082815481106145c3576145c3615f66565b60009182526020808320845460029093020180546001600160a01b0319166001600160a01b039093169290921782556001938401549390910192909255838152601d9091526040902080548061461b5761461b615f50565b60008281526020812060026000199093019283020180546001600160a01b03191681556001015590555050565b61465181614b52565b611ada5760405162461bcd60e51b8152600401610d7090615cfb565b6007546001600160a01b03163314611d955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d70565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906146fc82611cc8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8054806147845760405162461bcd60e51b815260206004820152601b60248201527f436f756e7465723a2064656372656d656e74206f766572666c6f7700000000006044820152606401610d70565b600019019055565b826001600160a01b031661479f82611cc8565b6001600160a01b0316146148035760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d70565b6001600160a01b0382166148655760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d70565b614870838383614e25565b61487b6000826146c7565b6001600160a01b03831660009081526003602052604081208054600192906148a4908490615e77565b90915550506001600160a01b03821660009081526003602052604081208054600192906148d2908490615e2c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b81811015610ef55761494c600980546001019055565b61495a600880546001019055565b6000838152601b6020526040812060050180549161497783615ef5565b9190505550600061498760085490565b6040805160e0810182528281526000878152601b60209081528382206008810154828501908152848601848152336060870181815293546001600160a01b039081166080890190815260a08901888152600160c08b018181528d8b52601e9099529a9098209851895593519888019890985590516002870180546001600160a01b0319908116928a16929092179055925160038701805485169189169190911790559051600486018054909316961695909517905590516005830155516006909101805460ff1916911515919091179055909150614a659082614f7a565b614a8f81601b60008781526020019081526020016000206004016040516020016132659190615943565b5080614a9a81615ef5565b915050614936565b600080614aae83611cc8565b9050806001600160a01b0316846001600160a01b03161480614ad55750614ad58185614025565b80613a005750836001600160a01b0316614aee84610fde565b6001600160a01b031614949350505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000908152600260205260409020546001600160a01b0316151590565b816001600160a01b0316836001600160a01b03161415614bd15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d70565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b614c4984848461478c565b614c55848484846150b9565b611a245760405162461bcd60e51b8152600401610d7090615c2f565b614c7a82614b52565b614cdd5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610d70565b60008281526006602090815260409091208251610ef592840190615328565b6000828152601c602052604090208054614d1890600190615e77565b81548110614d2857614d28615f66565b9060005260206000209060020201601c60008481526020019081526020016000208281548110614d5a57614d5a615f66565b60009182526020808320845460029093020180546001600160a01b0319166001600160a01b039093169290921782556001938401549390910192909255838152601c9091526040902080548061461b5761461b615f50565b6060614dbd82614648565b6000614dd460408051602081019091526000815290565b90506000815111614df4576040518060200160405280600081525061235c565b80614dfe846151c6565b604051602001614e0f929190615914565b6040516020818303038152906040529392505050565b6001600160a01b0383161580614ef057506001600160a01b03821630148015614e9057506000818152601e60205260409020600201546001600160a01b0384811691161480614e9057506000818152601e60205260409020600301546001600160a01b038481169116145b80614ef057506001600160a01b03831630148015614ef057506000818152601e60205260409020600201546001600160a01b0383811691161480614ef057506000818152601e60205260409020600301546001600160a01b038381169116145b610ef5576000818152601e602052604090206006015460ff16614f3857614f1b600980546001019055565b6000818152601e60205260409020600601805460ff191660011790555b6000818152601e602052604081206003810180546001600160a01b0386166001600160a01b031991821617909155600282018054909116905560050155505050565b6001600160a01b038216614fd05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d70565b614fd981614b52565b156150265760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d70565b61503260008383614e25565b6001600160a01b038216600090815260036020526040812080546001929061505b908490615e2c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156151bb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906150fd903390899088908890600401615a43565b602060405180830381600087803b15801561511757600080fd5b505af1925050508015615147575060408051601f3d908101601f1916820190925261514491810190615687565b60015b6151a1573d808015615175576040519150601f19603f3d011682016040523d82523d6000602084013e61517a565b606091505b5080516151995760405162461bcd60e51b8152600401610d7090615c2f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613a00565b506001949350505050565b6060816151ea5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561521457806151fe81615ef5565b915061520d9050600a83615e44565b91506151ee565b6000816001600160401b0381111561522e5761522e615f7c565b6040519080825280601f01601f191660200182016040528015615258576020820181803683370190505b5090505b8415613a005761526d600183615e77565b915061527a600a86615f10565b615285906030615e2c565b60f81b81838151811061529a5761529a615f66565b60200101906001600160f81b031916908160001a9053506152bc600a86615e44565b945061525c565b60405180610160016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016060815260200160008152602001600081526020016000815260200160008152602001600015158152602001600081525090565b82805461533490615eba565b90600052602060002090601f016020900481019282615356576000855561539c565b82601f1061536f57805160ff191683800117855561539c565b8280016001018555821561539c579182015b8281111561539c578251825591602001919060010190615381565b506153a8929150615404565b5090565b6040805161014081019091526000606082018181526080830182905260a0830182905260c0830182905260e0830182905261010083018290526101208301919091528190815260200160608152602001606081525090565b5b808211156153a85760008155600101615405565b60006001600160401b038084111561543357615433615f7c565b604051601f8501601f19908116603f0116810190828211818310171561545b5761545b615f7c565b8160405280935085815286868601111561547457600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146154a557600080fd5b919050565b600082601f8301126154bb57600080fd5b61235c83833560208501615419565b6000602082840312156154dc57600080fd5b61235c8261548e565b600080604083850312156154f857600080fd5b6155018361548e565b915061550f6020840161548e565b90509250929050565b60008060006060848603121561552d57600080fd5b6155368461548e565b92506155446020850161548e565b9150604084013590509250925092565b6000806000806080858703121561556a57600080fd5b6155738561548e565b93506155816020860161548e565b92506040850135915060608501356001600160401b038111156155a357600080fd5b8501601f810187136155b457600080fd5b6155c387823560208401615419565b91505092959194509250565b600080604083850312156155e257600080fd5b6155eb8361548e565b915060208301356155fb81615f92565b809150509250929050565b6000806040838503121561561957600080fd5b6156228361548e565b946020939093013593505050565b60006020828403121561564257600080fd5b813561235c81615f92565b60006020828403121561565f57600080fd5b815161235c81615f92565b60006020828403121561567c57600080fd5b813561235c81615fa0565b60006020828403121561569957600080fd5b815161235c81615fa0565b6000602082840312156156b657600080fd5b5035919050565b6000602082840312156156cf57600080fd5b5051919050565b600080604083850312156156e957600080fd5b8235915060208301356155fb81615f92565b6000806040838503121561570e57600080fd5b8235915060208301356001600160401b0381111561572b57600080fd5b615737858286016154aa565b9150509250929050565b6000806040838503121561575457600080fd5b50508035926020909101359150565b600080600080600060a0868803121561577b57600080fd5b8535945060208601359350604086013592506157996060870161548e565b915060808601356157a981615f92565b809150509295509295909350565b600080600080608085870312156157cd57600080fd5b84359350602085013592506040850135915060608501356001600160401b038111156157f857600080fd5b6155c3878288016154aa565b600081518084526020808501945080840160005b8381101561584857815180516001600160a01b031688528301518388015260409096019590820190600101615818565b509495945050505050565b6000815180845261586b816020860160208601615e8e565b601f01601f19169290920160200192915050565b600061012082518051855260208101516020860152604081015160018060a01b038082166040880152806060840151166060880152806080840151166080880152505060a081015160a086015260c0810151151560c08601525060208301518160e08601526158f082860182615804565b915050604083015184820361010086015261590b8282615804565b95945050505050565b60008351615926818460208801615e8e565b83519083019061593a818360208801615e8e565b01949350505050565b7368747470733a2f2f617277656176652e6e65742f60601b8152600060146000845481600182811c91508083168061597c57607f831692505b602080841082141561599c57634e487b7160e01b86526022600452602486fd5b8180156159b057600181146159c5576159f6565b60ff1986168a890152848a01880196506159f6565b60008b81526020902060005b868110156159ec5781548c82018b01529085019083016159d1565b505087858b010196505b50949998505050505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615a7690830184615853565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015615b6d57888303603f19018552815180516001600160a01b031684526101608882015189860152878201518886015260608083015181870152506080808301518282880152615b1583880182615853565b60a0858101519089015260c0808601519089015260e080860151908901526101008086015190890152610120808601511515908901526101409485015194909701939093525050509386019390860190600101615ac0565b509098975050505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015615bd057603f19888603018452615bbe85835161587f565b94509285019290850190600101615ba2565b5092979650505050505050565b60208152600061235c6020830184615853565b6020808252600490820152636f776e7360e01b604082015260600190565b60208082526007908201526631b932b0ba37b960c91b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260059082015264185d985a5b60da1b604082015260600190565b602080825260059082015264707269636560d81b604082015260600190565b602080825260039082015262189a5960ea1b604082015260600190565b60208082526005908201526466756e647360d81b604082015260600190565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b6020808252600490820152636d616e7960e01b604082015260600190565b6020808252600290820152614e4160f01b604082015260600190565b602080825260099082015268616c6c6f77616e636560b81b604082015260600190565b60208082526007908201526662616c616e636560c81b604082015260600190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252600690820152651c185d5cd95960d21b604082015260600190565b60208152600061235c602083018461587f565b60008219821115615e3f57615e3f615f24565b500190565b600082615e5357615e53615f3a565b500490565b6000816000190483118215151615615e7257615e72615f24565b500290565b600082821015615e8957615e89615f24565b500390565b60005b83811015615ea9578181015183820152602001615e91565b83811115611a245750506000910152565b600181811c90821680615ece57607f821691505b60208210811415615eef57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615f0957615f09615f24565b5060010190565b600082615f1f57615f1f615f3a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611ada57600080fd5b6001600160e01b031981168114611ada57600080fdfea26469706673582212205fe58f2197cff4d696dc16da25f49c23c1d3180c1ef7c718ce5ae233285debc064736f6c63430008070033000000000000000000000000d44fc10f34b260d4ce7af7359012ea4ae1967ebf

Deployed Bytecode

0x60806040526004361061035d5760003560e01c8063724eb1a8116101cd578063b88d4fde11610108578063c87b56dd116100ab578063e264ed0d1161007a578063e264ed0d1461095f578063e985e9c514610975578063f2fde38b14610995578063f3c89048146109b5578063f6c94deb146109c857600080fd5b8063c87b56dd14610904578063ca3eadea14610924578063d2f82a9a14610937578063db8d55f11461094a57600080fd5b8063b88d4fde14610828578063bd7e5c7b14610848578063bf1be88814610868578063bf30fdc014610888578063c36ddbc11461089b578063c78f19f9146108ae578063c7be7a49146108c4578063c800144c146108f157600080fd5b806395d89b411161017057806395d89b4114610774578063a22cb46514610789578063a376288f146107a9578063a4ea6889146107bc578063a6f0cea8146107cf578063ad4881e9146107e2578063ad48c6c914610802578063ae677aa31461081557600080fd5b8063724eb1a814610698578063789cc05a146106b85780638587be6e146106d8578063875bf268146106f8578063883f74831461071a5780638da5cb5b1461073057806391599bab1461074e578063954fabd01461076157600080fd5b80632ba96f4f1161029d5780634f2220bc116102405780634f2220bc146105de578063557725a0146105f45780635cd9a7651461060757806360015c611461061a5780636054475c146106305780636352211e1461064357806370a0823114610663578063715018a61461068357600080fd5b80632ba96f4f146105415780632d296bf114610554578063305a67a8146105675780633b12a7371461057a5780633ccfd60b1461059057806342842e0e14610598578063456e39fd146105b85780634ccf1b34146105cb57600080fd5b80630b427ce7116103055780630b427ce71461048e5780630c92a3e2146104a457806312e85585146104ba5780631897bcf3146104cf578063194a4e7e146104e25780631b2ef1ca146104f857806323b872dd1461050b5780632b330a641461052b57600080fd5b80621a6307146103625780630131b0681461039857806301ffc9a7146103ad57806306fdde03146103dd578063081812fc146103ff5780630898181a1461043757806308cdc2a81461045b578063095ea7b31461046e575b600080fd5b34801561036e57600080fd5b5061038261037d3660046154ca565b6109dd565b60405161038f9190615a99565b60405180910390f35b6103ab6103a63660046156a4565b610c3d565b005b3480156103b957600080fd5b506103cd6103c836600461566a565b610efa565b604051901515815260200161038f565b3480156103e957600080fd5b506103f2610f4c565b60405161038f9190615bdd565b34801561040b57600080fd5b5061041f61041a3660046156a4565b610fde565b6040516001600160a01b03909116815260200161038f565b34801561044357600080fd5b5061044d60115481565b60405190815260200161038f565b6103ab610469366004615630565b611005565b34801561047a57600080fd5b506103ab610489366004615606565b611020565b34801561049a57600080fd5b5061044d60125481565b3480156104b057600080fd5b5061044d600d5481565b3480156104c657600080fd5b50600f5461044d565b6103ab6104dd366004615741565b611131565b3480156104ee57600080fd5b5061044d60145481565b6103ab610506366004615741565b6111e9565b34801561051757600080fd5b506103ab610526366004615518565b6115e5565b34801561053757600080fd5b5061044d60105481565b6103ab61054f3660046156a4565b611616565b6103ab6105623660046156a4565b611623565b6103ab6105753660046156a4565b611a2a565b34801561058657600080fd5b5061044d600e5481565b6103ab611add565b3480156105a457600080fd5b506103ab6105b3366004615518565b611c4f565b6103ab6105c63660046156a4565b611c6a565b6103ab6105d93660046154ca565b611c77565b3480156105ea57600080fd5b5061044d60165481565b6103ab6106023660046156a4565b611ca1565b6103ab6106153660046156a4565b611cae565b34801561062657600080fd5b5061044d60175481565b6103ab61063e3660046156a4565b611cbb565b34801561064f57600080fd5b5061041f61065e3660046156a4565b611cc8565b34801561066f57600080fd5b5061044d61067e3660046154ca565b611cfd565b34801561068f57600080fd5b506103ab611d83565b3480156106a457600080fd5b50600b5461041f906001600160a01b031681565b3480156106c457600080fd5b506103ab6106d33660046157b7565b611d97565b3480156106e457600080fd5b5061044d6106f3366004615741565b61232e565b34801561070457600080fd5b5061070d612363565b60405161038f9190615b7b565b34801561072657600080fd5b5061044d600c5481565b34801561073c57600080fd5b506007546001600160a01b031661041f565b6103ab61075c3660046156a4565b61260d565b6103ab61076f366004615741565b61261a565b34801561078057600080fd5b506103f261299a565b34801561079557600080fd5b506103ab6107a43660046155cf565b6129a9565b6103ab6107b73660046156a4565b6129b4565b6103ab6107ca3660046156a4565b612b6a565b6103ab6107dd3660046156d6565b612b77565b3480156107ee57600080fd5b506103826107fd366004615630565b612ba2565b6103ab6108103660046156a4565b612e3d565b6103ab6108233660046156a4565b612e4a565b34801561083457600080fd5b506103ab610843366004615554565b612e57565b34801561085457600080fd5b5061070d6108633660046154ca565b612e89565b34801561087457600080fd5b506103ab6108833660046156fb565b6131dc565b6103ab6108963660046156a4565b61328b565b6103ab6108a9366004615763565b613298565b3480156108ba57600080fd5b5061044d600f5481565b3480156108d057600080fd5b506108e46108df3660046156a4565b613767565b60405161038f9190615e19565b6103ab6108ff3660046156a4565b6138ea565b34801561091057600080fd5b506103f261091f3660046156a4565b6138f7565b6103ab6109323660046156a4565b613a08565b6103ab610945366004615741565b613cd1565b34801561095657600080fd5b5061044d614014565b34801561096b57600080fd5b5061044d60155481565b34801561098157600080fd5b506103cd6109903660046154e5565b614025565b3480156109a157600080fd5b506103ab6109b03660046154ca565b614053565b6103ab6109c3366004615741565b6140c9565b3480156109d457600080fd5b5061070d614296565b606060006109ea600a5490565b90506000805b6109fb836001615e2c565b811015610a44576000818152601b60205260409020546001600160a01b0386811691161415610a325781610a2e81615ef5565b9250505b80610a3c81615ef5565b9150506109f0565b50600080826001600160401b03811115610a6057610a60615f7c565b604051908082528060200260200182016040528015610a9957816020015b610a866152c3565b815260200190600190039081610a7e5790505b50905060005b84811015610c33576000818152601b60205260409020546001600160a01b0388811691161415610c21576000818152601b602090815260409182902082516101608101845281546001600160a01b0316815260018201549281019290925260028101549282019290925260038201546060820152600482018054849392918391608084019190610b2e90615eba565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5a90615eba565b8015610ba75780601f10610b7c57610100808354040283529160200191610ba7565b820191906000526020600020905b815481529060010190602001808311610b8a57829003601f168201915b505050918352505060058201546020820152600682015460408201526007820154606082015260088201546080820152600982015460ff16151560a0820152600a9091015460c0909101528451859087908110610c0657610c06615f66565b6020908102919091010152610c1c600186615e2c565b945050505b80610c2b81615ef5565b915050610a9f565b5095945050505050565b60008060005b6000848152601d6020526040902054811015610ee4576000848152601d60205260409020805433919083908110610c7c57610c7c615f66565b60009182526020909120600290910201546001600160a01b03161415610ed257600b546000858152601d6020526040902080546001600160a01b039092169163095ea7b391309185908110610cd357610cd3615f66565b9060005260206000209060020201600101546040518363ffffffff1660e01b8152600401610d02929190615a80565b602060405180830381600087803b158015610d1c57600080fd5b505af1158015610d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d54919061564d565b610d795760405162461bcd60e51b8152600401610d7090615cdc565b60405180910390fd5b600b546000858152601d6020526040902080546001600160a01b039092169163a9059cbb91339185908110610db057610db0615f66565b9060005260206000209060020201600101546040518363ffffffff1660e01b8152600401610ddf929190615a80565b602060405180830381600087803b158015610df957600080fd5b505af1158015610e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e31919061564d565b610e4d5760405162461bcd60e51b8152600401610d7090615cdc565b6000848152601d60205260409020805482908110610e6d57610e6d615f66565b90600052602060002090600202016001015460136000828254610e909190615e77565b90915550506000848152601d60205260408120805483908110610eb557610eb5615f66565b906000526020600020906002020160010181905550600191508092505b80610edc81615ef5565b915050610c43565b508015610ef557610ef58383614565565b505050565b60006001600160e01b031982166380ac58cd60e01b1480610f2b57506001600160e01b03198216635b5e139f60e01b145b80610f4657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610f5b90615eba565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8790615eba565b8015610fd45780601f10610fa957610100808354040283529160200191610fd4565b820191906000526020600020905b815481529060010190602001808311610fb757829003601f168201915b5050505050905090565b6000610fe982614648565b506000908152600460205260409020546001600160a01b031690565b61100d61466d565b601a805460ff1916911515919091179055565b600061102b82611cc8565b9050806001600160a01b0316836001600160a01b031614156110995760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d70565b336001600160a01b03821614806110b557506110b58133614025565b6111275760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610d70565b610ef583836146c7565b6000828152601e60205260409020600301546001600160a01b0316331461116a5760405162461bcd60e51b8152600401610d7090615bf0565b6000811161118a5760405162461bcd60e51b8152600401610d7090615ca0565b6000828152601e6020526040902060068101805460ff19169055600581018290556002810180546001600160a01b0319908116331790915560039091018054909116301790556111da6009614735565b6111e533308461478c565b5050565b601a5460ff161561120c5760405162461bcd60e51b8152600401610d7090615df9565b6000611217600a5490565b905080831061124d5760405162461bcd60e51b81526020600482015260026024820152611a5960f21b6044820152606401610d70565b6000838152601b602052604090206009015460ff1661127e5760405162461bcd60e51b8152600401610d7090615d4b565b6000838152601b6020526040902060038101546005909101546112a2908490615e2c565b11156112c05760405162461bcd60e51b8152600401610d7090615c81565b6000838152601b602052604090206002015442106113095760405162461bcd60e51b815260206004820152600660248201526561637469766560d01b6044820152606401610d70565b6000838152601b6020526040812060010154611326908490615e58565b600b54604051636eb1769f60e11b815291925082916001600160a01b039091169063dd62ed3e9061135d9033903090600401615a05565b60206040518083038186803b15801561137557600080fd5b505afa158015611389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ad91906156bd565b10156113cb5760405162461bcd60e51b8152600401610d7090615d4b565b6000612710601754836113de9190615e58565b6113e89190615e44565b90506000612710601454846113fd9190615e58565b6114079190615e44565b600b546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd9061143c90339030908890600401615a1f565b602060405180830381600087803b15801561145657600080fd5b505af115801561146a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148e919061564d565b6114c35760405162461bcd60e51b8152600401610d70906020808252600490820152631cd95b9960e21b604082015260600190565b600b5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906114f79061dead908690600401615a80565b602060405180830381600087803b15801561151157600080fd5b505af1158015611525573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611549919061564d565b61157e5760405162461bcd60e51b8152600401610d7090602080825260049082015263313ab93760e11b604082015260600190565b806115898385615e77565b6115939190615e77565b6000878152601b6020526040812060060180549091906115b4908490615e2c565b9250508190555080601860008282546115cd9190615e2c565b909155506115dd90508686614933565b505050505050565b6115ef3382614aa2565b61160b5760405162461bcd60e51b8152600401610d7090615dab565b610ef583838361478c565b61161e61466d565b601155565b6000818152601e60205260409020600581015460069091015460ff16156116755760405162461bcd60e51b8152600401610d70906020808252600490820152631cdbdb1960e21b604082015260600190565b3061167f83611cc8565b6001600160a01b031610156116bf5760405162461bcd60e51b8152602060048201526006602482015265657363726f7760d01b6044820152606401610d70565b600b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b15801561170257600080fd5b505afa158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a91906156bd565b10156117585760405162461bcd60e51b8152600401610d7090615d8a565b600b54604051636eb1769f60e11b815282916001600160a01b03169063dd62ed3e9061178a9033903090600401615a05565b60206040518083038186803b1580156117a257600080fd5b505afa1580156117b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117da91906156bd565b10156117f85760405162461bcd60e51b8152600401610d7090615d4b565b60006127106015548361180b9190615e58565b6118159190615e44565b905080601860008282546118299190615e2c565b909155506000905061183b8284615e77565b600b546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd9061187090339030908790600401615a1f565b602060405180830381600087803b15801561188a57600080fd5b505af115801561189e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c2919061564d565b6118f75760405162461bcd60e51b8152600401610d70906020808252600490820152636665657360e01b604082015260600190565b600b546000858152601e6020526040908190206002015490516323b872dd60e01b81526001600160a01b03928316926323b872dd92611940923392909116908690600401615a1f565b602060405180830381600087803b15801561195a57600080fd5b505af115801561196e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611992919061564d565b6119c85760405162461bcd60e51b81526020600482015260076024820152661c185e5b595b9d60ca1b6044820152606401610d70565b6000848152601e602052604081206003810180546001600160a01b0319908116331790915560068201805460ff19166001179055600282018054909116905560050155611a19600980546001019055565b611a2430338661478c565b50505050565b6000818152601e60205260409020600201546001600160a01b03163314611a7b5760405162461bcd60e51b815260206004820152600560248201526437bbb732b960d91b6044820152606401610d70565b6000818152601e602052604081206003810180546001600160a01b0319908116331790915560068201805460ff19166001179055600582019290925560020180549091169055611acf600980546001019055565b611ada30338361478c565b50565b611ae561466d565b600b5460185460405163095ea7b360e01b81526001600160a01b039092169163095ea7b391611b1991309190600401615a80565b602060405180830381600087803b158015611b3357600080fd5b505af1158015611b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6b919061564d565b611b7457600080fd5b600b5460185460405163a9059cbb60e01b81526001600160a01b039092169163a9059cbb91611ba891339190600401615a80565b602060405180830381600087803b158015611bc257600080fd5b505af1158015611bd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfa919061564d565b611c0357600080fd5b60185460196000828254611c179190615e2c565b90915550506000601881905560405133914780156108fc02929091818181858888f19350505050158015611ada573d6000803e3d6000fd5b610ef583838360405180602001604052806000815250612e57565b611c7261466d565b600c55565b611c7f61466d565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b611ca961466d565b601255565b611cb661466d565b601055565b611cc361466d565b601455565b6000818152600260205260408120546001600160a01b031680610f465760405162461bcd60e51b8152600401610d7090615cfb565b60006001600160a01b038216611d675760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610d70565b506001600160a01b031660009081526003602052604090205490565b611d8b61466d565b611d956000614b00565b565b601a5460ff1615611dd45760405162461bcd60e51b81526020600482015260076024820152663830bab9b2b21760c91b6044820152606401610d70565b81600d541015611df65760405162461bcd60e51b8152600401610d7090615d2d565b81600c541115611e2e5760405162461bcd60e51b81526020600482015260036024820152626c6f7760e81b6044820152606401610d70565b611e3b4262015180615e2c565b8311611e715760405162461bcd60e51b81526020600482015260056024820152641cda1bdc9d60da1b6044820152606401610d70565b601054611e819062015180615e58565b611e8b9042615e2c565b831115611ec35760405162461bcd60e51b8152600401610d70906020808252600490820152636c6f6e6760e01b604082015260600190565b600f54600b54604051636eb1769f60e11b81526001600160a01b039091169063dd62ed3e90611ef89033903090600401615a05565b60206040518083038186803b158015611f1057600080fd5b505afa158015611f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4891906156bd565b1015611f665760405162461bcd60e51b8152600401610d7090615d4b565b600f54600b546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611fac57600080fd5b505afa158015611fc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe491906156bd565b10156120025760405162461bcd60e51b8152600401610d7090615d8a565b600084116120225760405162461bcd60e51b8152600401610d7090615ca0565b6000612710601654600f546120379190615e58565b6120419190615e44565b905080600f546120519190615e77565b601860008282546120629190615e2c565b9091555050600b54600f546040516323b872dd60e01b81526001600160a01b03909216916323b872dd9161209c9133913091600401615a1f565b602060405180830381600087803b1580156120b657600080fd5b505af11580156120ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ee919061564d565b6121235760405162461bcd60e51b8152600401610d709060208082526004908201526314d95b9960e21b604082015260600190565b600b5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906121579061dead908590600401615a80565b602060405180830381600087803b15801561217157600080fd5b505af1158015612185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a9919061564d565b6121de5760405162461bcd60e51b8152600401610d7090602080825260049082015263213ab93760e11b604082015260600190565b60006121e9600a5490565b90506000612212612710601154876122019190615e58565b61220b9190615e44565b600161232e565b905060125481111561222357506012545b604080516101608101825233815260208082018a81528284018a8152606084018a8152608085018a8152600060a0870181905260c0870181905260e0870181905261010087018a905261012087018190526101408701899052898152601b865296909620855181546001600160a01b0319166001600160a01b039091161781559251600184015590516002830155516003820155925180519293926122ce9260048501920190615328565b5060a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012082015160098201805460ff191691151591909117905561014090910151600a918201558054600101905550505050505050565b60008180600161233e8287615e2c565b6123489190615e77565b6123529190615e44565b61235c9190615e58565b9392505050565b6060600061237060085490565b9050600061237d60095490565b905060008161238b60085490565b6123959190615e77565b9050600080826001600160401b038111156123b2576123b2615f7c565b6040519080825280602002602001820160405280156123eb57816020015b6123d86153ac565b8152602001906001900390816123d05790505b509050836123f860085490565b6124029190615e77565b61240f5795945050505050565b60005b85811015610c335730601e600061242a846001615e2c565b81526020810191909152604001600020600301546001600160a01b031614156125fb57600061245a826001615e2c565b6000818152601e6020908152604080832081516101408101835281546060820190815260018301546080830181905260028401546001600160a01b0390811660a08501526003850154811660c085015260048501541660e08401526005840154610100840152600684015460ff1615156101208401529082528552601c84528285208054845181870281018701909552808552969750919590948585019484015b82821015612543576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016124fb565b505050508152602001601d6000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156125c7576000848152602090819020604080518082019091526002850290910180546001600160a01b0316825260019081015482840152908352909201910161257f565b505050508152508486815181106125e0576125e0615f66565b60209081029190910101526125f6600186615e2c565b945050505b8061260581615ef5565b915050612412565b61261561466d565b601655565b61262382614b52565b6126575760405162461bcd60e51b8152602060048201526005602482015264195e1a5cdd60da1b6044820152606401610d70565b600081116126775760405162461bcd60e51b8152600401610d7090615cbf565b600b54604051636eb1769f60e11b815282916001600160a01b03169063dd62ed3e906126a99033903090600401615a05565b60206040518083038186803b1580156126c157600080fd5b505afa1580156126d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f991906156bd565b10156127175760405162461bcd60e51b8152600401610d7090615d67565b600b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b15801561275a57600080fd5b505afa15801561276e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279291906156bd565b10156127b05760405162461bcd60e51b8152600401610d7090615d8a565b6000805b6000848152601d602052604090205481101561285c576000848152601d602052604090208054339190839081106127ed576127ed615f66565b60009182526020909120600290910201546001600160a01b0316141561284a576000848152601d6020526040902080548491908390811061283057612830615f66565b906000526020600020906002020160010181905550600191505b8061285481615ef5565b9150506127b4565b50806128c1576000838152601d602090815260408083208151808301909252338252818301868152815460018082018455928652939094209151600290930290910180546001600160a01b0319166001600160a01b0390931692909217825591519101555b600b546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906128f590339030908790600401615a1f565b602060405180830381600087803b15801561290f57600080fd5b505af1158015612923573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612947919061564d565b61297e5760405162461bcd60e51b81526020600482015260086024820152673a3930b739b332b960c11b6044820152606401610d70565b81601360008282546129909190615e2c565b9091555050505050565b606060018054610f5b90615eba565b6111e5338383614b6f565b6000818152601b60205260409020546001600160a01b031633146129ea5760405162461bcd60e51b8152600401610d7090615c0e565b600b546000828152601b60205260409081902060060154905163095ea7b360e01b81526001600160a01b039092169163095ea7b391612a2e91309190600401615a80565b602060405180830381600087803b158015612a4857600080fd5b505af1158015612a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a80919061564d565b612a8957600080fd5b600b546000828152601b60205260409081902060060154905163a9059cbb60e01b81526001600160a01b039092169163a9059cbb91612acd91339190600401615a80565b602060405180830381600087803b158015612ae757600080fd5b505af1158015612afb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1f919061564d565b612b2857600080fd5b6000818152601b6020526040812060068101546007909101805491929091612b51908490615e2c565b90915550506000908152601b6020526040812060060155565b612b7261466d565b600d55565b612b7f61466d565b6000918252601b6020526040909120600901805460ff1916911515919091179055565b60606000612baf600a5490565b90506000805b82811015612c2757600085612bcb576001612be1565b6000828152601b602052604090206009015460ff165b6000838152601b602052604090206002015490915042108015612c015750805b15612c145782612c1081615ef5565b9350505b5080612c1f81615ef5565b915050612bb5565b50600080826001600160401b03811115612c4357612c43615f7c565b604051908082528060200260200182016040528015612c7c57816020015b612c696152c3565b815260200190600190039081612c615790505b50905060005b848111610c3357600087612c97576001612cad565b6000828152601b602052604090206009015460ff165b6000838152601b602052604090206002015490915042108015612ccd5750805b15612e2a576000828152601b602090815260409182902082516101608101845281546001600160a01b0316815260018201549281019290925260028101549282019290925260038201546060820152600482018054859392918391608084019190612d3790615eba565b80601f0160208091040260200160405190810160405280929190818152602001828054612d6390615eba565b8015612db05780601f10612d8557610100808354040283529160200191612db0565b820191906000526020600020905b815481529060010190602001808311612d9357829003601f168201915b505050918352505060058201546020820152600682015460408201526007820154606082015260088201546080820152600982015460ff16151560a0820152600a9091015460c0909101528551869088908110612e0f57612e0f615f66565b6020908102919091010152612e25600187615e2c565b955050505b5080612e3581615ef5565b915050612c82565b612e4561466d565b601755565b612e5261466d565b600f55565b612e613383614aa2565b612e7d5760405162461bcd60e51b8152600401610d7090615dab565b611a2484848484614c3e565b60606000612e9660085490565b905060008060005b83811015612f40576001600160a01b038616601e6000612ebf846001615e2c565b81526020810191909152604001600020600301546001600160a01b03161480612f1b57506001600160a01b038616601e6000612efc846001615e2c565b81526020810191909152604001600020600201546001600160a01b0316145b15612f2e57612f2b600184615e2c565b92505b80612f3881615ef5565b915050612e9e565b506000826001600160401b03811115612f5b57612f5b615f7c565b604051908082528060200260200182016040528015612f9457816020015b612f816153ac565b815260200190600190039081612f795790505b50905060005b84811015610c33576001600160a01b038716601e6000612fbb846001615e2c565b81526020810191909152604001600020600301546001600160a01b0316148061301757506001600160a01b038716601e6000612ff8846001615e2c565b81526020810191909152604001600020600201546001600160a01b0316145b156131ca576000613029826001615e2c565b6000818152601e6020908152604080832081516101408101835281546060820190815260018301546080830181905260028401546001600160a01b0390811660a08501526003850154811660c085015260048501541660e08401526005840154610100840152600684015460ff1615156101208401529082528552601c84528285208054845181870281018701909552808552969750919590948585019484015b82821015613112576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016130ca565b505050508152602001601d6000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015613196576000848152602090819020604080518082019091526002850290910180546001600160a01b0316825260019081015482840152908352909201910161314e565b505050508152508486815181106131af576131af615f66565b60209081029190910101526131c5600186615e2c565b945050505b806131d481615ef5565b915050612f9a565b6131e461466d565b60006131ef60085490565b6000848152601b60209081526040909120845192935061321792600490910191850190615328565b5060015b818111611a24576000818152601e60205260409020600101548414156132795761327981601b60008781526020019081526020016000206004016040516020016132659190615943565b604051602081830303815290604052614c71565b8061328381615ef5565b91505061321b565b61329361466d565b600e55565b6000858152601e60205260409020600301546001600160a01b03163314806132d957506000858152601e60205260409020600201546001600160a01b031633145b6132f55760405162461bcd60e51b8152600401610d7090615bf0565b80613313576000858152601e60205260409020600101548414613316565b60015b61334b5760405162461bcd60e51b81526020600482015260066024820152651b5a5b9d125960d21b6044820152606401610d70565b600081613365576000858152601c60205260409020613374565b6000868152601d602052604090205b805480602002602001604051908101604052809291908181526020016000905b828210156133dc576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101613394565b50505050905060008060005b835181101561346a578684828151811061340457613404615f66565b60200260200101516020015114801561344b5750856001600160a01b031684828151811061343457613434615f66565b6020026020010151600001516001600160a01b0316145b1561345857600192508091505b8061346281615ef5565b9150506133e8565b50816134ac5760405162461bcd60e51b815260206004820152601160248201527037379036b0ba31b434b7339037b33332b960791b6044820152606401610d70565b6000888152601e602052604090206006015460ff166134f0576134d3600980546001019055565b6000888152601e60205260409020600601805460ff191660011790555b6000888152601e60205260409020600301546001600160a01b03163314156135225761351d33868a61478c565b61352d565b61352d30868a61478c565b6000888152601e602052604081206003810180546001600160a01b0389166001600160a01b031991821617909155600282018054909116905560050155825183908290811061357e5761357e615f66565b6020026020010151602001516013600082825461359b9190615e77565b9250508190555060006127106015548584815181106135bc576135bc615f66565b6020026020010151602001516135d29190615e58565b6135dc9190615e44565b905080601860008282546135f09190615e2c565b9250508190555060008185848151811061360c5761360c615f66565b6020026020010151602001516136229190615e77565b600b5460405163095ea7b360e01b81529192506001600160a01b03169063095ea7b3906136559030908590600401615a80565b602060405180830381600087803b15801561366f57600080fd5b505af1158015613683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136a7919061564d565b6136b057600080fd5b600b5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906136e29033908590600401615a80565b602060405180830381600087803b1580156136fc57600080fd5b505af1158015613710573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613734919061564d565b61373d57600080fd5b856137515761374c8984614cfc565b61375b565b61375b8a84614565565b50505050505050505050565b61376f6153ac565b604080516000848152601e60209081528382206101408401855280546060850190815260018201546080860181905260028301546001600160a01b0390811660a08801526003840154811660c088015260048401541660e0870152600583015461010087015260069092015460ff16151561012086015284528252601c815283822080548551818402810184019096528086529394828601949093919290919084015b8282101561385a576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101613812565b505050508152602001601d6000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156138de576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101613896565b50505091525092915050565b6138f261466d565b601555565b606061390282614648565b6000828152600660205260408120805461391b90615eba565b80601f016020809104026020016040519081016040528092919081815260200182805461394790615eba565b80156139945780601f1061396957610100808354040283529160200191613994565b820191906000526020600020905b81548152906001019060200180831161397757829003601f168201915b5050505050905060006139b260408051602081019091526000815290565b90508051600014156139c5575092915050565b8151156139f75780826040516020016139df929190615914565b60405160208183030381529060405292505050919050565b613a0084614db2565b949350505050565b60008060005b6000848152601c6020526040902054811015613cc0576000848152601c60205260409020805433919083908110613a4757613a47615f66565b60009182526020909120600290910201546001600160a01b03161415613cae57600b546000858152601c6020526040902080546001600160a01b039092169163095ea7b391309185908110613a9e57613a9e615f66565b9060005260206000209060020201600101546040518363ffffffff1660e01b8152600401613acd929190615a80565b602060405180830381600087803b158015613ae757600080fd5b505af1158015613afb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b1f919061564d565b613b555760405162461bcd60e51b8152602060048201526007602482015266617070726f766560c81b6044820152606401610d70565b600b546000858152601c6020526040902080546001600160a01b039092169163a9059cbb91339185908110613b8c57613b8c615f66565b9060005260206000209060020201600101546040518363ffffffff1660e01b8152600401613bbb929190615a80565b602060405180830381600087803b158015613bd557600080fd5b505af1158015613be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c0d919061564d565b613c295760405162461bcd60e51b8152600401610d7090615cdc565b6000848152601c60205260409020805482908110613c4957613c49615f66565b90600052602060002090600202016001015460136000828254613c6c9190615e77565b90915550506000848152601c60205260408120805483908110613c9157613c91615f66565b906000526020600020906002020160010181905550600191508092505b80613cb881615ef5565b915050613a0e565b508015610ef557610ef58383614cfc565b6000828152601b60205260409020600801548214613d1c5760405162461bcd60e51b81526020600482015260086024820152670d2c840dac2e8c6d60c31b6044820152606401610d70565b6000828152601b602052604090206009015460ff16613d685760405162461bcd60e51b8152602060048201526008602482015267185c1c1c9bdd995960c21b6044820152606401610d70565b60008111613da05760405162461bcd60e51b81526020600482015260056024820152640c08189a5960da1b6044820152606401610d70565b600b54604051636eb1769f60e11b815282916001600160a01b03169063dd62ed3e90613dd29033903090600401615a05565b60206040518083038186803b158015613dea57600080fd5b505afa158015613dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e2291906156bd565b1015613e405760405162461bcd60e51b8152600401610d7090615d67565b600b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b158015613e8357600080fd5b505afa158015613e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ebb91906156bd565b1015613ed95760405162461bcd60e51b8152600401610d7090615cbf565b6000805b6000848152601c6020526040902054811015613f85576000848152601c60205260409020805433919083908110613f1657613f16615f66565b60009182526020909120600290910201546001600160a01b03161415613f73576000848152601c60205260409020805484919083908110613f5957613f59615f66565b906000526020600020906002020160010181905550600191505b80613f7d81615ef5565b915050613edd565b50806128c1576000838152601c602090815260408083208151808301835233808252818501888152835460018082018655948852959096209151600290950290910180546001600160a01b0319166001600160a01b0395861617815594519490910193909355600b5490516323b872dd60e01b81529116916323b872dd916128f5919030908790600401615a1f565b600061401e61466d565b5060185490565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61405b61466d565b6001600160a01b0381166140c05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d70565b611ada81614b00565b601a5460ff16156140ec5760405162461bcd60e51b8152600401610d7090615df9565b6000828152601b60205260409020546001600160a01b031633146141225760405162461bcd60e51b8152600401610d7090615c0e565b6000828152601b60205260409020600a01548111156141535760405162461bcd60e51b8152600401610d7090615c81565b600061415e600a5490565b90508083106141945760405162461bcd60e51b8152602060048201526002602482015261125160f21b6044820152606401610d70565b6000838152601b602052604090206009015460ff1615156001146141ca5760405162461bcd60e51b8152600401610d7090615d4b565b6000838152601b6020526040902060038101546005909101546141ee908490615e2c565b111561420c5760405162461bcd60e51b8152600401610d7090615d2d565b6000838152601b602052604090206002015442106142555760405162461bcd60e51b815260206004820152600660248201526518db1bdcd95960d21b6044820152606401610d70565b61425f8383614933565b6000838152601b60205260409020600a015461427c908390615e77565b6000938452601b6020526040909320600a01929092555050565b606060006142a360085490565b905060008060005b838110156143065733601e60006142c3846001615e2c565b81526020810191909152604001600020600201546001600160a01b031614156142f457826142f081615ef5565b9350505b806142fe81615ef5565b9150506142ab565b506000826001600160401b0381111561432157614321615f7c565b60405190808252806020026020018201604052801561435a57816020015b6143476153ac565b81526020019060019003908161433f5790505b50905060005b8481101561455c5733601e6000614378846001615e2c565b81526020810191909152604001600020600201546001600160a01b0316141561454a5760006143a8826001615e2c565b6000818152601e6020908152604080832081516101408101835281546060820190815260018301546080830181905260028401546001600160a01b0390811660a08501526003850154811660c085015260048501541660e08401526005840154610100840152600684015460ff1615156101208401529082528552601c84528285208054845181870281018701909552808552969750919590948585019484015b82821015614491576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101614449565b505050508152602001601d6000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015614515576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016144cd565b5050505081525084868151811061452e5761452e615f66565b6020026020010181905250848061454490615ef5565b95505050505b8061455481615ef5565b915050614360565b50949350505050565b6000828152601d60205260409020805461458190600190615e77565b8154811061459157614591615f66565b9060005260206000209060020201601d600084815260200190815260200160002082815481106145c3576145c3615f66565b60009182526020808320845460029093020180546001600160a01b0319166001600160a01b039093169290921782556001938401549390910192909255838152601d9091526040902080548061461b5761461b615f50565b60008281526020812060026000199093019283020180546001600160a01b03191681556001015590555050565b61465181614b52565b611ada5760405162461bcd60e51b8152600401610d7090615cfb565b6007546001600160a01b03163314611d955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d70565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906146fc82611cc8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8054806147845760405162461bcd60e51b815260206004820152601b60248201527f436f756e7465723a2064656372656d656e74206f766572666c6f7700000000006044820152606401610d70565b600019019055565b826001600160a01b031661479f82611cc8565b6001600160a01b0316146148035760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d70565b6001600160a01b0382166148655760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d70565b614870838383614e25565b61487b6000826146c7565b6001600160a01b03831660009081526003602052604081208054600192906148a4908490615e77565b90915550506001600160a01b03821660009081526003602052604081208054600192906148d2908490615e2c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b81811015610ef55761494c600980546001019055565b61495a600880546001019055565b6000838152601b6020526040812060050180549161497783615ef5565b9190505550600061498760085490565b6040805160e0810182528281526000878152601b60209081528382206008810154828501908152848601848152336060870181815293546001600160a01b039081166080890190815260a08901888152600160c08b018181528d8b52601e9099529a9098209851895593519888019890985590516002870180546001600160a01b0319908116928a16929092179055925160038701805485169189169190911790559051600486018054909316961695909517905590516005830155516006909101805460ff1916911515919091179055909150614a659082614f7a565b614a8f81601b60008781526020019081526020016000206004016040516020016132659190615943565b5080614a9a81615ef5565b915050614936565b600080614aae83611cc8565b9050806001600160a01b0316846001600160a01b03161480614ad55750614ad58185614025565b80613a005750836001600160a01b0316614aee84610fde565b6001600160a01b031614949350505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000908152600260205260409020546001600160a01b0316151590565b816001600160a01b0316836001600160a01b03161415614bd15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d70565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b614c4984848461478c565b614c55848484846150b9565b611a245760405162461bcd60e51b8152600401610d7090615c2f565b614c7a82614b52565b614cdd5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610d70565b60008281526006602090815260409091208251610ef592840190615328565b6000828152601c602052604090208054614d1890600190615e77565b81548110614d2857614d28615f66565b9060005260206000209060020201601c60008481526020019081526020016000208281548110614d5a57614d5a615f66565b60009182526020808320845460029093020180546001600160a01b0319166001600160a01b039093169290921782556001938401549390910192909255838152601c9091526040902080548061461b5761461b615f50565b6060614dbd82614648565b6000614dd460408051602081019091526000815290565b90506000815111614df4576040518060200160405280600081525061235c565b80614dfe846151c6565b604051602001614e0f929190615914565b6040516020818303038152906040529392505050565b6001600160a01b0383161580614ef057506001600160a01b03821630148015614e9057506000818152601e60205260409020600201546001600160a01b0384811691161480614e9057506000818152601e60205260409020600301546001600160a01b038481169116145b80614ef057506001600160a01b03831630148015614ef057506000818152601e60205260409020600201546001600160a01b0383811691161480614ef057506000818152601e60205260409020600301546001600160a01b038381169116145b610ef5576000818152601e602052604090206006015460ff16614f3857614f1b600980546001019055565b6000818152601e60205260409020600601805460ff191660011790555b6000818152601e602052604081206003810180546001600160a01b0386166001600160a01b031991821617909155600282018054909116905560050155505050565b6001600160a01b038216614fd05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d70565b614fd981614b52565b156150265760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d70565b61503260008383614e25565b6001600160a01b038216600090815260036020526040812080546001929061505b908490615e2c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156151bb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906150fd903390899088908890600401615a43565b602060405180830381600087803b15801561511757600080fd5b505af1925050508015615147575060408051601f3d908101601f1916820190925261514491810190615687565b60015b6151a1573d808015615175576040519150601f19603f3d011682016040523d82523d6000602084013e61517a565b606091505b5080516151995760405162461bcd60e51b8152600401610d7090615c2f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613a00565b506001949350505050565b6060816151ea5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561521457806151fe81615ef5565b915061520d9050600a83615e44565b91506151ee565b6000816001600160401b0381111561522e5761522e615f7c565b6040519080825280601f01601f191660200182016040528015615258576020820181803683370190505b5090505b8415613a005761526d600183615e77565b915061527a600a86615f10565b615285906030615e2c565b60f81b81838151811061529a5761529a615f66565b60200101906001600160f81b031916908160001a9053506152bc600a86615e44565b945061525c565b60405180610160016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016060815260200160008152602001600081526020016000815260200160008152602001600015158152602001600081525090565b82805461533490615eba565b90600052602060002090601f016020900481019282615356576000855561539c565b82601f1061536f57805160ff191683800117855561539c565b8280016001018555821561539c579182015b8281111561539c578251825591602001919060010190615381565b506153a8929150615404565b5090565b6040805161014081019091526000606082018181526080830182905260a0830182905260c0830182905260e0830182905261010083018290526101208301919091528190815260200160608152602001606081525090565b5b808211156153a85760008155600101615405565b60006001600160401b038084111561543357615433615f7c565b604051601f8501601f19908116603f0116810190828211818310171561545b5761545b615f7c565b8160405280935085815286868601111561547457600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146154a557600080fd5b919050565b600082601f8301126154bb57600080fd5b61235c83833560208501615419565b6000602082840312156154dc57600080fd5b61235c8261548e565b600080604083850312156154f857600080fd5b6155018361548e565b915061550f6020840161548e565b90509250929050565b60008060006060848603121561552d57600080fd5b6155368461548e565b92506155446020850161548e565b9150604084013590509250925092565b6000806000806080858703121561556a57600080fd5b6155738561548e565b93506155816020860161548e565b92506040850135915060608501356001600160401b038111156155a357600080fd5b8501601f810187136155b457600080fd5b6155c387823560208401615419565b91505092959194509250565b600080604083850312156155e257600080fd5b6155eb8361548e565b915060208301356155fb81615f92565b809150509250929050565b6000806040838503121561561957600080fd5b6156228361548e565b946020939093013593505050565b60006020828403121561564257600080fd5b813561235c81615f92565b60006020828403121561565f57600080fd5b815161235c81615f92565b60006020828403121561567c57600080fd5b813561235c81615fa0565b60006020828403121561569957600080fd5b815161235c81615fa0565b6000602082840312156156b657600080fd5b5035919050565b6000602082840312156156cf57600080fd5b5051919050565b600080604083850312156156e957600080fd5b8235915060208301356155fb81615f92565b6000806040838503121561570e57600080fd5b8235915060208301356001600160401b0381111561572b57600080fd5b615737858286016154aa565b9150509250929050565b6000806040838503121561575457600080fd5b50508035926020909101359150565b600080600080600060a0868803121561577b57600080fd5b8535945060208601359350604086013592506157996060870161548e565b915060808601356157a981615f92565b809150509295509295909350565b600080600080608085870312156157cd57600080fd5b84359350602085013592506040850135915060608501356001600160401b038111156157f857600080fd5b6155c3878288016154aa565b600081518084526020808501945080840160005b8381101561584857815180516001600160a01b031688528301518388015260409096019590820190600101615818565b509495945050505050565b6000815180845261586b816020860160208601615e8e565b601f01601f19169290920160200192915050565b600061012082518051855260208101516020860152604081015160018060a01b038082166040880152806060840151166060880152806080840151166080880152505060a081015160a086015260c0810151151560c08601525060208301518160e08601526158f082860182615804565b915050604083015184820361010086015261590b8282615804565b95945050505050565b60008351615926818460208801615e8e565b83519083019061593a818360208801615e8e565b01949350505050565b7368747470733a2f2f617277656176652e6e65742f60601b8152600060146000845481600182811c91508083168061597c57607f831692505b602080841082141561599c57634e487b7160e01b86526022600452602486fd5b8180156159b057600181146159c5576159f6565b60ff1986168a890152848a01880196506159f6565b60008b81526020902060005b868110156159ec5781548c82018b01529085019083016159d1565b505087858b010196505b50949998505050505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615a7690830184615853565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015615b6d57888303603f19018552815180516001600160a01b031684526101608882015189860152878201518886015260608083015181870152506080808301518282880152615b1583880182615853565b60a0858101519089015260c0808601519089015260e080860151908901526101008086015190890152610120808601511515908901526101409485015194909701939093525050509386019390860190600101615ac0565b509098975050505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015615bd057603f19888603018452615bbe85835161587f565b94509285019290850190600101615ba2565b5092979650505050505050565b60208152600061235c6020830184615853565b6020808252600490820152636f776e7360e01b604082015260600190565b60208082526007908201526631b932b0ba37b960c91b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260059082015264185d985a5b60da1b604082015260600190565b602080825260059082015264707269636560d81b604082015260600190565b602080825260039082015262189a5960ea1b604082015260600190565b60208082526005908201526466756e647360d81b604082015260600190565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b6020808252600490820152636d616e7960e01b604082015260600190565b6020808252600290820152614e4160f01b604082015260600190565b602080825260099082015268616c6c6f77616e636560b81b604082015260600190565b60208082526007908201526662616c616e636560c81b604082015260600190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252600690820152651c185d5cd95960d21b604082015260600190565b60208152600061235c602083018461587f565b60008219821115615e3f57615e3f615f24565b500190565b600082615e5357615e53615f3a565b500490565b6000816000190483118215151615615e7257615e72615f24565b500290565b600082821015615e8957615e89615f24565b500390565b60005b83811015615ea9578181015183820152602001615e91565b83811115611a245750506000910152565b600181811c90821680615ece57607f821691505b60208210811415615eef57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615f0957615f09615f24565b5060010190565b600082615f1f57615f1f615f3a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611ada57600080fd5b6001600160e01b031981168114611ada57600080fdfea26469706673582212205fe58f2197cff4d696dc16da25f49c23c1d3180c1ef7c718ce5ae233285debc064736f6c63430008070033

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

000000000000000000000000d44fc10f34b260d4ce7af7359012ea4ae1967ebf

-----Decoded View---------------
Arg [0] : cAddress (address): 0xD44FC10F34B260D4CE7aF7359012Ea4ae1967EBf

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d44fc10f34b260d4ce7af7359012ea4ae1967ebf


Deployed Bytecode Sourcemap

48351:19016:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63375:546;;;;;;;;;;-1:-1:-1;63375:546:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55051:585;;;;;;:::i;:::-;;:::i;:::-;;31021:305;;;;;;;;;;-1:-1:-1;31021:305:0;;;;;:::i;:::-;;:::i;:::-;;;14817:14:1;;14810:22;14792:41;;14780:2;14765:18;31021:305:0;14652:187:1;31948:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33461:171::-;;;;;;;;;;-1:-1:-1;33461:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10408:32:1;;;10390:51;;10378:2;10363:18;33461:171:0;10244:203:1;48971:43:0;;;;;;;;;;;;;;;;;;;33333:25:1;;;33321:2;33306:18;48971:43:0;33187:177:1;51489:86:0;;;;;;:::i;:::-;;:::i;32978:417::-;;;;;;;;;;-1:-1:-1;32978:417:0;;;;;:::i;:::-;;:::i;49028:35::-;;;;;;;;;;;;;;;;48716:46;;;;;;;;;;;;;;;;52103:93;;;;;;;;;;-1:-1:-1;52176:12:0;;52103:93;;60838:392;;;;;;:::i;:::-;;:::i;49097:30::-;;;;;;;;;;;;;;;;59262:954;;;;;;:::i;:::-;;:::i;34161:336::-;;;;;;;;;;-1:-1:-1;34161:336:0;;;;;:::i;:::-;;:::i;48883:32::-;;;;;;;;;;;;;;;;51689:118;;;;;;:::i;:::-;;:::i;61238:1078::-;;;;;;:::i;:::-;;:::i;62326:350::-;;;;;;:::i;:::-;;:::i;48776:35::-;;;;;;;;;;;;;;;;66324:363;;;:::i;34568:185::-;;;;;;;;;;-1:-1:-1;34568:185:0;;;;;:::i;:::-;;:::i;51121:126::-;;;;;;:::i;:::-;;:::i;51583:96::-;;;;;;:::i;:::-;;:::i;49197:39::-;;;;;;;;;;;;;;;;50863:114;;;;;;:::i;:::-;;:::i;50747:108::-;;;;;;:::i;:::-;;:::i;49252:43::-;;;;;;;;;;;;;;;;51257:98;;;;;;:::i;:::-;;:::i;31659:222::-;;;;;;;;;;-1:-1:-1;31659:222:0;;;;;:::i;:::-;;:::i;31390:207::-;;;;;;;;;;-1:-1:-1;31390:207:0;;;;;:::i;:::-;;:::i;11557:103::-;;;;;;;;;;;;;:::i;48604:18::-;;;;;;;;;;-1:-1:-1;48604:18:0;;;;-1:-1:-1;;;;;48604:18:0;;;57346:1357;;;;;;;;;;-1:-1:-1;57346:1357:0;;;;;:::i;:::-;;:::i;50405:107::-;;;;;;;;;;-1:-1:-1;50405:107:0;;;;;:::i;:::-;;:::i;63933:608::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;48659:43::-;;;;;;;;;;;;;;;;10909:87;;;;;;;;;;-1:-1:-1;10982:6:0;;-1:-1:-1;;;;;10982:6:0;10909:87;;51815:131;;;;;;:::i;:::-;;:::i;53504:780::-;;;;;;:::i;:::-;;:::i;32117:104::-;;;;;;;;;;;;;:::i;33704:155::-;;;;;;;;;;-1:-1:-1;33704:155:0;;;;;:::i;:::-;;:::i;65961:355::-;;;;;;:::i;:::-;;:::i;50987:126::-;;;;;;:::i;:::-;;:::i;60711:119::-;;;;;;:::i;:::-;;:::i;62684:681::-;;;;;;;;;;-1:-1:-1;62684:681:0;;;;;:::i;:::-;;:::i;51954:141::-;;;;;;:::i;:::-;;:::i;50520:106::-;;;;;;:::i;:::-;;:::i;34824:323::-;;;;;;;;;;-1:-1:-1;34824:323:0;;;;;:::i;:::-;;:::i;64549:672::-;;;;;;;;;;-1:-1:-1;64549:672:0;;;;;:::i;:::-;;:::i;52207:344::-;;;;;;;;;;-1:-1:-1;52207:344:0;;;;;:::i;:::-;;:::i;50634:107::-;;;;;;:::i;:::-;;:::i;55783:1553::-;;;;;;:::i;:::-;;:::i;48825:44::-;;;;;;;;;;;;;;;;65227:136;;;;;;;;;;-1:-1:-1;65227:136:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51363:118::-;;;;;;:::i;:::-;;:::i;44729:624::-;;;;;;;;;;-1:-1:-1;44729:624:0;;;;;:::i;:::-;;:::i;54293:606::-;;;;;;:::i;:::-;;:::i;52560:839::-;;;;;;:::i;:::-;;:::i;53406:89::-;;;;;;;;;;;;;:::i;49142:41::-;;;;;;;;;;;;;;;;33930:164;;;;;;;;;;-1:-1:-1;33930:164:0;;;;;:::i;:::-;;:::i;11815:201::-;;;;;;;;;;-1:-1:-1;11815:201:0;;;;;:::i;:::-;;:::i;58713:539::-;;;;;;:::i;:::-;;:::i;65369:584::-;;;;;;;;;;;;;:::i;63375:546::-;63438:11;63460:7;63470:15;:5;47128:14;;47036:114;63470:15;63460:25;;63496:8;63520:6;63515:106;63532:6;:2;63537:1;63532:6;:::i;:::-;63528:1;:10;63515:106;;;63559:4;;;;:1;:4;;;;;:12;-1:-1:-1;;;;;63559:22:0;;;:12;;:22;63556:56;;;63595:5;;;;:::i;:::-;;;;63556:56;63540:3;;;;:::i;:::-;;;;63515:106;;;;63631:7;63649:14;63675:3;-1:-1:-1;;;;;63666:13:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;63649:30;;63695:6;63690:204;63707:2;63703:1;:6;63690:204;;;63730:4;;;;:1;:4;;;;;:12;-1:-1:-1;;;;;63730:22:0;;;:12;;:22;63727:158;;;63768:8;63814:6;;;:1;:6;;;;;;;;;63835:14;;;;;;;;;-1:-1:-1;;;;;63835:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63779:1;;63814:6;63835:14;63814:6;;63835:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63835:14:0;;;-1:-1:-1;;63835:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;;:2;;63838;;63835:6;;;;;;:::i;:::-;;;;;;;;;;:14;63864:7;63870:1;63864:7;;:::i;:::-;;;63753:132;;63727:158;63711:3;;;;:::i;:::-;;;;63690:204;;;-1:-1:-1;63911:2:0;63375:546;-1:-1:-1;;;;;63375:546:0:o;55051:585::-;55111:17;55137:8;55159:6;55154:410;55171:8;;;;:4;:8;;;;;:15;55167:19;;55154:410;;;55208:8;;;;:4;:8;;;;;:11;;55228:10;;55208:8;55217:1;;55208:11;;;;;;:::i;:::-;;;;;;;;;;;;;;:16;-1:-1:-1;;;;;55208:16:0;:30;55205:350;;;55265:3;;;55293:8;;;:4;:8;;;;;:11;;-1:-1:-1;;;;;55265:3:0;;;;55262:15;;55286:4;;55302:1;;55293:11;;;;;;:::i;:::-;;;;;;;;;;;:15;;;55262:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55254:65;;;;-1:-1:-1;;;55254:65:0;;;;;;;:::i;:::-;;;;;;;;;55366:3;;;55393:8;;;:4;:8;;;;;:11;;-1:-1:-1;;;;;55366:3:0;;;;55363:16;;55380:10;;55402:1;;55393:11;;;;;;:::i;:::-;;;;;;;;;;;:15;;;55363:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55355:64;;;;-1:-1:-1;;;55355:64:0;;;;;;;:::i;:::-;55444:8;;;;:4;:8;;;;;:11;;55453:1;;55444:11;;;;;;:::i;:::-;;;;;;;;;;;:15;;;55434:6;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;55490:1:0;55472:8;;;:4;:8;;;;;:11;;55481:1;;55472:11;;;;;;:::i;:::-;;;;;;;;;;;:15;;:19;;;;55510:4;55504:10;;55542:1;55527:16;;55205:350;55189:3;;;;:::i;:::-;;;;55154:410;;;;55575:3;55572:57;;;55590:29;55603:2;55606:12;55590;:29::i;:::-;55102:534;;55051:585;:::o;31021:305::-;31123:4;-1:-1:-1;;;;;;31160:40:0;;-1:-1:-1;;;31160:40:0;;:105;;-1:-1:-1;;;;;;;31217:48:0;;-1:-1:-1;;;31217:48:0;31160:105;:158;;;-1:-1:-1;;;;;;;;;;23872:40:0;;;31282:36;31140:178;31021:305;-1:-1:-1;;31021:305:0:o;31948:100::-;32002:13;32035:5;32028:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31948:100;:::o;33461:171::-;33537:7;33557:23;33572:7;33557:14;:23::i;:::-;-1:-1:-1;33600:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33600:24:0;;33461:171::o;51489:86::-;10795:13;:11;:13::i;:::-;51556:6:::1;:11:::0;;-1:-1:-1;;51556:11:0::1;::::0;::::1;;::::0;;;::::1;::::0;;51489:86::o;32978:417::-;33059:13;33075:23;33090:7;33075:14;:23::i;:::-;33059:39;;33123:5;-1:-1:-1;;;;;33117:11:0;:2;-1:-1:-1;;;;;33117:11:0;;;33109:57;;;;-1:-1:-1;;;33109:57:0;;29980:2:1;33109:57:0;;;29962:21:1;30019:2;29999:18;;;29992:30;30058:34;30038:18;;;30031:62;-1:-1:-1;;;30109:18:1;;;30102:31;30150:19;;33109:57:0;29778:397:1;33109:57:0;9540:10;-1:-1:-1;;;;;33201:21:0;;;;:62;;-1:-1:-1;33226:37:0;33243:5;9540:10;33930:164;:::i;33226:37::-;33179:174;;;;-1:-1:-1;;;33179:174:0;;25146:2:1;33179:174:0;;;25128:21:1;25185:2;25165:18;;;25158:30;25224:34;25204:18;;;25197:62;25295:32;25275:18;;;25268:60;25345:19;;33179:174:0;24944:426:1;33179:174:0;33366:21;33375:2;33379:7;33366:8;:21::i;60838:392::-;60917:8;;;;:3;:8;;;;;:14;;;-1:-1:-1;;;;;60917:14:0;60935:10;60917:28;60909:45;;;;-1:-1:-1;;;60909:45:0;;;;;;;:::i;:::-;60979:1;60971:5;:9;60963:27;;;;-1:-1:-1;;;60963:27:0;;;;;;;:::i;:::-;61015:5;60999:8;;;:3;:8;;;;;:13;;;:21;;-1:-1:-1;;60999:21:0;;;61029:14;;;:22;;;61060:15;;;:37;;-1:-1:-1;;;;;;61060:37:0;;;61086:10;61060:37;;;;-1:-1:-1;61106:14:0;;;:39;;;;;61139:4;61106:39;;;61154:18;:6;:16;:18::i;:::-;61181:41;61191:10;61211:4;61218:3;61181:9;:41::i;:::-;60838:392;;:::o;59262:954::-;59331:6;;;;59330:7;59322:26;;;;-1:-1:-1;;;59322:26:0;;;;;;;:::i;:::-;59357:12;59372:15;:5;47128:14;;47036:114;59372:15;59357:30;;59408:4;59404:3;:8;59396:22;;;;-1:-1:-1;;;59396:22:0;;27296:2:1;59396:22:0;;;27278:21:1;27335:1;27315:18;;;27308:29;-1:-1:-1;;;27353:18:1;;;27346:32;27395:18;;59396:22:0;27094:325:1;59396:22:0;59437:6;;;;:1;:6;;;;;:15;;;;;59429:29;;;;-1:-1:-1;;;59429:29:0;;;;;;;:::i;:::-;59496:6;;;;:1;:6;;;;;:10;;;;59475:13;;;;;:19;;59489:5;;59475:19;:::i;:::-;:31;;59467:49;;;;-1:-1:-1;;;59467:49:0;;;;;;;:::i;:::-;59533:6;;;;:1;:6;;;;;:12;;;59546:15;-1:-1:-1;59525:46:0;;;;-1:-1:-1;;;59525:46:0;;25938:2:1;59525:46:0;;;25920:21:1;25977:1;25957:18;;;25950:29;-1:-1:-1;;;25995:18:1;;;25988:36;26041:18;;59525:46:0;25736:329:1;59525:46:0;59652:10;59665:6;;;:1;:6;;;;;:16;;;:22;;59682:5;;59665:22;:::i;:::-;59707:3;;59704:44;;-1:-1:-1;;;59704:44:0;;59652:35;;-1:-1:-1;59652:35:0;;-1:-1:-1;;;;;59707:3:0;;;;59704:17;;:44;;59722:10;;59742:4;;59704:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;59696:67;;;;-1:-1:-1;;;59696:67:0;;;;;;;:::i;:::-;59774:9;59819:5;59793:24;;59787:5;:30;;;;:::i;:::-;59786:38;;;;:::i;:::-;59774:50;;59833:13;59870:5;59856:12;;59850:5;:18;;;;:::i;:::-;59849:26;;;;:::i;:::-;59938:3;;59935:53;;-1:-1:-1;;;59935:53:0;;59833:42;;-1:-1:-1;;;;;;59938:3:0;;59935:20;;:53;;59956:10;;59976:4;;59982:5;;59935:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59927:69;;;;-1:-1:-1;;;59927:69:0;;;;;;30714:2:1;30696:21;;;30753:1;30733:18;;;30726:29;-1:-1:-1;;;30786:2:1;30771:18;;30764:34;30830:2;30815:18;;30512:327;59927:69:0;60016:3;;60013:66;;-1:-1:-1;;;60013:66:0;;-1:-1:-1;;;;;60016:3:0;;;;60013:16;;:66;;60030:42;;60074:4;;60013:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60005:82;;;;-1:-1:-1;;;60005:82:0;;;;;;32797:2:1;32779:21;;;32836:1;32816:18;;;32809:29;-1:-1:-1;;;32869:2:1;32854:18;;32847:34;32913:2;32898:18;;32595:327;60005:82:0;60129:8;60117:10;60123:4;60117:5;:10;:::i;:::-;60116:21;;;;:::i;:::-;60098:6;;;;:1;:6;;;;;:14;;:39;;:14;;:6;:39;;;;;:::i;:::-;;;;;;;;60154:8;60146:4;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;60173:18:0;;-1:-1:-1;60180:3:0;60185:5;60173:6;:18::i;:::-;60202:7;;;;59262:954;;:::o;34161:336::-;34356:41;9540:10;34389:7;34356:18;:41::i;:::-;34348:100;;;;-1:-1:-1;;;34348:100:0;;;;;;;:::i;:::-;34461:28;34471:4;34477:2;34481:7;34461:9;:28::i;51689:118::-;10795:13;:11;:13::i;:::-;51767:25:::1;:32:::0;51689:118::o;61238:1078::-;61293:10;61306:8;;;:3;:8;;;;;:14;;;;61370:13;;;;;;;:21;61362:37;;;;-1:-1:-1;;;61362:37:0;;;;;;26633:2:1;26615:21;;;26672:1;26652:18;;;26645:29;-1:-1:-1;;;26705:2:1;26690:18;;26683:34;26749:2;26734:18;;26431:327;61362:37:0;61476:4;61453:12;61461:3;61453:7;:12::i;:::-;-1:-1:-1;;;;;61453:28:0;;;61445:46;;;;-1:-1:-1;;;61445:46:0;;22988:2:1;61445:46:0;;;22970:21:1;23027:1;23007:18;;;23000:29;-1:-1:-1;;;23045:18:1;;;23038:36;23091:18;;61445:46:0;22786:329:1;61445:46:0;61554:3;;61551:29;;-1:-1:-1;;;61551:29:0;;61569:10;61551:29;;;10390:51:1;61584:5:0;;-1:-1:-1;;;;;61554:3:0;;61551:17;;10363:18:1;;61551:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;61543:58;;;;-1:-1:-1;;;61543:58:0;;;;;;;:::i;:::-;61693:3;;61690:44;;-1:-1:-1;;;61690:44:0;;61739:5;;-1:-1:-1;;;;;61693:3:0;;61690:17;;:44;;61708:10;;61728:4;;61690:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;61682:69;;;;-1:-1:-1;;;61682:69:0;;;;;;;:::i;:::-;61764:13;61812:5;61787:23;;61781:5;:29;;;;:::i;:::-;61780:37;;;;:::i;:::-;61764:53;;61836:8;61828:4;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;61855:16:0;;-1:-1:-1;61875:14:0;61881:8;61875:5;:14;:::i;:::-;61912:3;;61909:56;;-1:-1:-1;;;61909:56:0;;61855:35;;-1:-1:-1;;;;;;61912:3:0;;61909:20;;:56;;61930:10;;61950:4;;61956:8;;61909:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61901:72;;;;-1:-1:-1;;;61901:72:0;;;;;;22656:2:1;22638:21;;;22695:1;22675:18;;;22668:29;-1:-1:-1;;;22728:2:1;22713:18;;22706:34;22772:2;22757:18;;22454:327;61901:72:0;61993:3;;;62031:8;;;:3;:8;;;;;;;:15;;;61990:67;;-1:-1:-1;;;61990:67:0;;-1:-1:-1;;;;;61993:3:0;;;;61990:20;;:67;;62011:10;;62031:15;;;;62048:8;;61990:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61982:86;;;;-1:-1:-1;;;61982:86:0;;17375:2:1;61982:86:0;;;17357:21:1;17414:1;17394:18;;;17387:29;-1:-1:-1;;;17432:18:1;;;17425:37;17479:18;;61982:86:0;17173:330:1;61982:86:0;62084:8;;;;:3;:8;;;;;:14;;;:36;;-1:-1:-1;;;;;;62084:36:0;;;62109:10;62084:36;;;;62130:13;;;:20;;-1:-1:-1;;62130:20:0;62084:36;62130:20;;;62160:15;;;:37;;;;;;;62207:14;;:18;62237;:6;47247:19;;47265:1;47247:19;;;47158:127;62237:18;62265:41;62283:4;62290:10;62302:3;62265:9;:41::i;:::-;61284:1032;;;61238:1078;:::o;62326:350::-;62396:8;;;;:3;:8;;;;;:15;;;-1:-1:-1;;;;;62396:15:0;62415:10;62396:29;62388:47;;;;-1:-1:-1;;;62388:47:0;;15270:2:1;62388:47:0;;;15252:21:1;15309:1;15289:18;;;15282:29;-1:-1:-1;;;15327:18:1;;;15320:35;15372:18;;62388:47:0;15068:328:1;62388:47:0;62447:8;;;;:3;:8;;;;;:14;;;:36;;-1:-1:-1;;;;;;62447:36:0;;;62472:10;62447:36;;;;62493:13;;;:20;;-1:-1:-1;;62493:20:0;62447:36;62493:20;;;62523:14;;;:18;;;;62551:15;;:37;;;;;;;62598:18;:6;47247:19;;47265:1;47247:19;;;47158:127;62598:18;62625:41;62643:4;62650:10;62662:3;62625:9;:41::i;:::-;62326:350;:::o;66324:363::-;10795:13;:11;:13::i;:::-;66413:3:::1;::::0;66441:4:::1;::::0;66410:36:::1;::::0;-1:-1:-1;;;66410:36:0;;-1:-1:-1;;;;;66413:3:0;;::::1;::::0;66410:15:::1;::::0;:36:::1;::::0;66434:4:::1;::::0;66441;66410:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66402:45;;;::::0;::::1;;66486:3;::::0;66513:4:::1;::::0;66483:35:::1;::::0;-1:-1:-1;;;66483:35:0;;-1:-1:-1;;;;;66486:3:0;;::::1;::::0;66483:16:::1;::::0;:35:::1;::::0;66500:10:::1;::::0;66513:4;66483:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66475:44;;;::::0;::::1;;66598:4;;66581:13;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;66618:1:0::1;66611:4;:8:::0;;;66628:51:::1;::::0;66636:10:::1;::::0;66657:21:::1;66628:51:::0;::::1;;;::::0;66657:21;;66628:51;66618:1;66628:51;66657:21;66636:10;66628:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;34568:185:::0;34706:39;34723:4;34729:2;34733:7;34706:39;;;;;;;;;;;;:16;:39::i;51121:126::-;10795:13;:11;:13::i;:::-;51208:24:::1;:31:::0;51121:126::o;51583:96::-;10795:13;:11;:13::i;:::-;51661:3:::1;:10:::0;;-1:-1:-1;;;;;;51661:10:0::1;-1:-1:-1::0;;;;;51661:10:0;;;::::1;::::0;;;::::1;::::0;;51583:96::o;50863:114::-;10795:13;:11;:13::i;:::-;50944:18:::1;:25:::0;50863:114::o;50747:108::-;10795:13;:11;:13::i;:::-;50825:15:::1;:22:::0;50747:108::o;51257:98::-;10795:13;:11;:13::i;:::-;51328:12:::1;:19:::0;51257:98::o;31659:222::-;31731:7;31767:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31767:16:0;31802:19;31794:56;;;;-1:-1:-1;;;31794:56:0;;;;;;;:::i;31390:207::-;31462:7;-1:-1:-1;;;;;31490:19:0;;31482:73;;;;-1:-1:-1;;;31482:73:0;;23990:2:1;31482:73:0;;;23972:21:1;24029:2;24009:18;;;24002:30;24068:34;24048:18;;;24041:62;-1:-1:-1;;;24119:18:1;;;24112:39;24168:19;;31482:73:0;23788:405:1;31482:73:0;-1:-1:-1;;;;;;31573:16:0;;;;;:9;:16;;;;;;;31390:207::o;11557:103::-;10795:13;:11;:13::i;:::-;11622:30:::1;11649:1;11622:18;:30::i;:::-;11557:103::o:0;57346:1357::-;57462:6;;;;57461:7;57453:27;;;;-1:-1:-1;;;57453:27:0;;28623:2:1;57453:27:0;;;28605:21:1;28662:1;28642:18;;;28635:29;-1:-1:-1;;;28680:18:1;;;28673:37;28727:18;;57453:27:0;28421:330:1;57453:27:0;57523:3;57497:24;;:29;;57489:45;;;;-1:-1:-1;;;57489:45:0;;;;;;;:::i;:::-;57577:3;57551:24;;:29;;57543:44;;;;-1:-1:-1;;;57543:44:0;;24400:2:1;57543:44:0;;;24382:21:1;24439:1;24419:18;;;24412:29;-1:-1:-1;;;24457:18:1;;;24450:33;24500:18;;57543:44:0;24198:326:1;57543:44:0;57612:30;:15;57631:10;57612:30;:::i;:::-;57604:5;:39;57596:57;;;;-1:-1:-1;;;57596:57:0;;19882:2:1;57596:57:0;;;19864:21:1;19921:1;19901:18;;;19894:29;-1:-1:-1;;;19939:18:1;;;19932:35;19984:18;;57596:57:0;19680:328:1;57596:57:0;57698:15;;:24;;57716:6;57698:24;:::i;:::-;57679:44;;:15;:44;:::i;:::-;57670:5;:54;;57662:71;;;;-1:-1:-1;;;57662:71:0;;;;;;27958:2:1;27940:21;;;27997:1;27977:18;;;27970:29;-1:-1:-1;;;28030:2:1;28015:18;;28008:34;28074:2;28059:18;;27756:327;57662:71:0;57867:12;;57822:3;;57819:44;;-1:-1:-1;;;57819:44:0;;-1:-1:-1;;;;;57822:3:0;;;;57819:17;;:44;;57837:10;;57857:4;;57819:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;57811:74;;;;-1:-1:-1;;;57811:74:0;;;;;;;:::i;:::-;57975:12;;57946:3;;57943:29;;-1:-1:-1;;;57943:29:0;;57961:10;57943:29;;;10390:51:1;-1:-1:-1;;;;;57946:3:0;;;;57943:17;;10363:18:1;;57943:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;57935:63;;;;-1:-1:-1;;;57935:63:0;;;;;;;:::i;:::-;58027:1;58019:5;:9;58011:27;;;;-1:-1:-1;;;58011:27:0;;;;;;;:::i;:::-;58078:9;58126:5;58104:20;;58091:12;;:33;;;;:::i;:::-;58090:41;;;;:::i;:::-;58078:53;;58162:4;58149:12;;:17;;;;:::i;:::-;58140:4;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;58189:3:0;;58233:12;;58186:60;;-1:-1:-1;;;58186:60:0;;-1:-1:-1;;;;;58189:3:0;;;;58186:20;;:60;;58207:10;;58227:4;;58186:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58178:76;;;;-1:-1:-1;;;58178:76:0;;;;;;27626:2:1;27608:21;;;27665:1;27645:18;;;27638:29;-1:-1:-1;;;27698:2:1;27683:18;;27676:34;27742:2;27727:18;;27424:327;58178:76:0;58274:3;;58271:66;;-1:-1:-1;;;58271:66:0;;-1:-1:-1;;;;;58274:3:0;;;;58271:16;;:66;;58288:42;;58332:4;;58271:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58263:82;;;;-1:-1:-1;;;58263:82:0;;;;;;20561:2:1;20543:21;;;20600:1;20580:18;;;20573:29;-1:-1:-1;;;20633:2:1;20618:18;;20611:34;20677:2;20662:18;;20359:327;58263:82:0;58356:11;58370:15;:5;47128:14;;47036:114;58370:15;58356:29;;58444:7;58454:45;58491:5;58464:25;;58460:3;:29;;;;:::i;:::-;58459:37;;;;:::i;:::-;58497:1;58454:4;:45::i;:::-;58444:55;;58516:18;;58511:2;:23;58508:71;;;-1:-1:-1;58551:18:0;;58508:71;58596:69;;;;;;;;58607:10;58596:69;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58596:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58587:6;;;:1;:6;;;;;;:78;;;;-1:-1:-1;;;;;;58587:78:0;-1:-1:-1;;;;;58587:78:0;;;;;;;;-1:-1:-1;58587:78:0;;;;;;;;;;;;;;;;;;58596:69;;58587:6;:78;;;;;;;;;:::i;:::-;-1:-1:-1;58587:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58587:78:0;;;;;;;;;;;;;;;;;;;;47247:19;;-1:-1:-1;47247:19:0;;;57444:1259;;;57346:1357;;;;:::o;50405:107::-;50457:4;50503:2;;50492:1;50483:6;50503:2;50483:1;:6;:::i;:::-;:10;;;;:::i;:::-;50482:17;;;;:::i;:::-;50481:24;;;;:::i;:::-;50474:31;50405:107;-1:-1:-1;;;50405:107:0:o;63933:608::-;63979:15;64005:7;64015:14;:4;47128:14;;47036:114;64015:14;64005:24;;64038:10;64051:16;:6;47128:14;;47036:114;64051:16;64038:29;;64076:6;64103:5;64086:14;:4;47128:14;;47036:114;64086:14;:22;;;;:::i;:::-;64076:33;;64118:7;64134:18;64168:1;-1:-1:-1;;;;;64155:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;64134:36;;64202:5;64185:14;:4;47128:14;;47036:114;64185:14;:22;;;;:::i;:::-;64181:63;;64232:2;63933:608;-1:-1:-1;;;;;63933:608:0:o;64181:63::-;64257:6;64252:262;64269:2;64265:1;:6;64252:262;;;64321:4;64295:3;:8;64299:3;:1;64301;64299:3;:::i;:::-;64295:8;;;;;;;;;;;-1:-1:-1;64295:8:0;:14;;;-1:-1:-1;;;;;64295:14:0;:31;64291:214;;;64343:8;64354:5;:1;64358;64354:5;:::i;:::-;64374:19;64396:8;;;:3;:8;;;;;;;;64426:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64426:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64439:21;;:4;:21;;;;;64426:45;;;;;;;;;;;;;;;;;64343:16;;-1:-1:-1;64396:8:0;;64426:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64426:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64461:4;:9;64466:3;64461:9;;;;;;;;;;;64426:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64426:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64417:2;64420;64417:6;;;;;;;;:::i;:::-;;;;;;;;;;:54;64486:7;64492:1;64486:7;;:::i;:::-;;;64328:177;;64291:214;64273:3;;;;:::i;:::-;;;;64252:262;;51815:131;10795:13;:11;:13::i;:::-;51904:20:::1;:34:::0;51815:131::o;53504:780::-;53581:11;53589:2;53581:7;:11::i;:::-;53573:28;;;;-1:-1:-1;;;53573:28:0;;29311:2:1;53573:28:0;;;29293:21:1;29350:1;29330:18;;;29323:29;-1:-1:-1;;;29368:18:1;;;29361:35;29413:18;;53573:28:0;29109:328:1;53573:28:0;53625:1;53621:3;:5;53613:20;;;;-1:-1:-1;;;53613:20:0;;;;;;;:::i;:::-;53724:3;;53721:44;;-1:-1:-1;;;53721:44:0;;53769:3;;-1:-1:-1;;;;;53724:3:0;;53721:17;;:44;;53739:10;;53759:4;;53721:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;53713:73;;;;-1:-1:-1;;;53713:73:0;;;;;;;:::i;:::-;53849:3;;53846:29;;-1:-1:-1;;;53846:29:0;;53864:10;53846:29;;;10390:51:1;53878:3:0;;-1:-1:-1;;;;;53849:3:0;;53846:17;;10363:18:1;;53846:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;53838:54;;;;-1:-1:-1;;;53838:54:0;;;;;;;:::i;:::-;53904:8;53927:6;53922:168;53939:8;;;;:4;:8;;;;;:15;53935:19;;53922:168;;;53977:8;;;;:4;:8;;;;;:11;;53997:10;;53977:8;53986:1;;53977:11;;;;;;:::i;:::-;;;;;;;;;;;;;;:16;-1:-1:-1;;;;;53977:16:0;:30;53974:106;;;54022:8;;;;:4;:8;;;;;:11;;54040:3;;54022:8;54031:1;;54022:11;;;;;;:::i;:::-;;;;;;;;;;;:15;;:21;;;;54063:4;54057:10;;53974:106;53957:3;;;;:::i;:::-;;;;53922:168;;;;54103:3;54099:69;;54120:8;;;;:4;:8;;;;;;;;54134:22;;;;;;;;54140:10;54134:22;;;;;;;;54120:37;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54120:37:0;-1:-1:-1;;;;;54120:37:0;;;;;;;;;;;;;;54099:69;54190:3;;54187:51;;-1:-1:-1;;;54187:51:0;;-1:-1:-1;;;;;54190:3:0;;;;54187:20;;:51;;54208:10;;54228:4;;54234:3;;54187:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54179:71;;;;-1:-1:-1;;;54179:71:0;;29644:2:1;54179:71:0;;;29626:21:1;29683:1;29663:18;;;29656:29;-1:-1:-1;;;29701:18:1;;;29694:38;29749:18;;54179:71:0;29442:331:1;54179:71:0;54272:3;54262:6;;:13;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;53504:780:0:o;32117:104::-;32173:13;32206:7;32199:14;;;;;:::i;33704:155::-;33799:52;9540:10;33832:8;33842;33799:18;:52::i;65961:355::-;66034:5;;;;:1;:5;;;;;:13;-1:-1:-1;;;;;66034:13:0;66051:10;66034:27;66026:46;;;;-1:-1:-1;;;66026:46:0;;;;;;;:::i;:::-;66115:3;;;66143:5;;;:1;:5;;;;;;;:13;;;66112:45;;-1:-1:-1;;;66112:45:0;;-1:-1:-1;;;;;66115:3:0;;;;66112:15;;:45;;66136:4;;66143:13;66112:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66104:54;;;;;;66197:3;;;66224:5;;;:1;:5;;;;;;;:13;;;66194:44;;-1:-1:-1;;;66194:44:0;;-1:-1:-1;;;;;66197:3:0;;;;66194:16;;:44;;66211:10;;66224:13;66194:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66186:53;;;;;;66269:5;;;;:1;:5;;;;;:13;;;;66250:15;;;;:32;;66269:13;;66250:15;;:32;;66269:13;;66250:32;:::i;:::-;;;;-1:-1:-1;;66307:1:0;66291:5;;;:1;:5;;;;;:13;;:17;65961:355::o;50987:126::-;10795:13;:11;:13::i;:::-;51074:24:::1;:31:::0;50987:126::o;60711:119::-;10795:13;:11;:13::i;:::-;60796:6:::1;::::0;;;:1:::1;:6;::::0;;;;;:15:::1;;:26:::0;;-1:-1:-1;;60796:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;60711:119::o;62684:681::-;62744:11;62766:14;62783:15;:5;47128:14;;47036:114;62783:15;62766:32;;62809:8;62833:6;62828:169;62845:9;62841:1;:13;62828:169;;;62872:6;62881:8;:29;;62906:4;62881:29;;;62892:4;;;;:1;:4;;;;;:13;;;;;62881:29;62924:4;;;;:1;:4;;;;;:10;;;62872:38;;-1:-1:-1;62937:15:0;-1:-1:-1;62924:33:0;;;;;62956:1;62924:33;62921:67;;;62971:5;;;;:::i;:::-;;;;62921:67;-1:-1:-1;62856:3:0;;;;:::i;:::-;;;;62828:169;;;;63007:7;63025:14;63051:3;-1:-1:-1;;;;;63042:13:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;63025:30;;63071:6;63066:272;63084:9;63079:1;:14;63066:272;;63111:6;63120:8;:29;;63145:4;63120:29;;;63131:4;;;;:1;:4;;;;;:13;;;;;63120:29;63163:4;;;;:1;:4;;;;;:10;;;63111:38;;-1:-1:-1;63176:15:0;-1:-1:-1;63163:33:0;;;;;63195:1;63163:33;63160:169;;;63212:8;63258:6;;;:1;:6;;;;;;;;;63279:14;;;;;;;;;-1:-1:-1;;;;;63279:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63223:1;;63258:6;63279:14;63258:6;;63279:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63279:14:0;;;-1:-1:-1;;63279:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;;:2;;63282;;63279:6;;;;;;:::i;:::-;;;;;;;;;;:14;63308:7;63314:1;63308:7;;:::i;:::-;;;63197:132;;63160:169;-1:-1:-1;63095:3:0;;;;:::i;:::-;;;;63066:272;;51954:141;10795:13;:11;:13::i;:::-;52048:24:::1;:39:::0;51954:141::o;50520:106::-;10795:13;:11;:13::i;:::-;50597:12:::1;:21:::0;50520:106::o;34824:323::-;34998:41;9540:10;35031:7;34998:18;:41::i;:::-;34990:100;;;;-1:-1:-1;;;34990:100:0;;;;;;;:::i;:::-;35101:38;35115:4;35121:2;35125:7;35134:4;35101:13;:38::i;64549:672::-;64606:15;64632:8;64643:14;:4;47128:14;;47036:114;64643:14;64632:25;;64666:7;64682;64705:6;64700:167;64717:3;64713:1;:7;64700:167;;;-1:-1:-1;;;;;64775:22:0;;:3;:8;64779:3;:1;64781;64779:3;:::i;:::-;64775:8;;;;;;;;;;;-1:-1:-1;64775:8:0;:14;;;-1:-1:-1;;;;;64775:14:0;:22;;:49;;-1:-1:-1;;;;;;64801:23:0;;:3;:8;64805:3;:1;64807;64805:3;:::i;:::-;64801:8;;;;;;;;;;;-1:-1:-1;64801:8:0;:15;;;-1:-1:-1;;;;;64801:15:0;:23;64775:49;64771:87;;;64839:7;64845:1;64839:7;;:::i;:::-;;;64771:87;64722:3;;;;:::i;:::-;;;;64700:167;;;;64877:18;64911:2;-1:-1:-1;;;;;64898:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;64877:37;;64928:6;64923:273;64940:3;64936:1;:7;64923:273;;;-1:-1:-1;;;;;64967:22:0;;:3;:8;64971:3;:1;64973;64971:3;:::i;:::-;64967:8;;;;;;;;;;;-1:-1:-1;64967:8:0;:14;;;-1:-1:-1;;;;;64967:14:0;:22;;:49;;-1:-1:-1;;;;;;64993:23:0;;:3;:8;64997:3;:1;64999;64997:3;:::i;:::-;64993:8;;;;;;;;;;;-1:-1:-1;64993:8:0;:15;;;-1:-1:-1;;;;;64993:15:0;:23;64967:49;64963:224;;;65031:8;65042:3;:1;65044;65042:3;:::i;:::-;65058:19;65080:8;;;:3;:8;;;;;;;;65110:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65110:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65123:21;;:4;:21;;;;;65110:45;;;;;;;;;;;;;;;;;65031:14;;-1:-1:-1;65080:8:0;;65110:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65110:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65145:4;:9;65150:3;65145:9;;;;;;;;;;;65110:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65110:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65101:2;65104;65101:6;;;;;;;;:::i;:::-;;;;;;;;;;:54;65168:7;65174:1;65168:7;;:::i;:::-;;;65018:169;;64963:224;64945:3;;;;:::i;:::-;;;;64923:273;;52207:344;10795:13;:11;:13::i;:::-;52292:8:::1;52303:14;:4;47128:14:::0;;47036:114;52303:14:::1;52327:5;::::0;;;:1:::1;:5;::::0;;;;;;;:22;;52292:25;;-1:-1:-1;52327:22:0::1;::::0;:14:::1;::::0;;::::1;::::0;:22;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;52373:1:0::1;52361:182;52381:3;52376:1;:8;52361:182;;52406:6;::::0;;;:3:::1;:6;::::0;;;;:13:::1;;::::0;:19;::::1;52403:130;;;52440:80;52453:1;52503;:5;52505:2;52503:5;;;;;;;;;;;:14;;52463:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;52440:12;:80::i;:::-;52386:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52361:182;;50634:107:::0;10795:13;:11;:13::i;:::-;50710:16:::1;:23:::0;50634:107::o;55783:1553::-;55971:8;;;;:3;:8;;;;;:14;;;-1:-1:-1;;;;;55971:14:0;55989:10;55971:28;;:61;;-1:-1:-1;56003:8:0;;;;:3;:8;;;;;:15;;;-1:-1:-1;;;;;56003:15:0;56022:10;56003:29;55971:61;55963:78;;;;-1:-1:-1;;;55963:78:0;;;;;;;:::i;:::-;56060:10;:40;;56078:8;;;;:3;:8;;;;;:15;;;:22;;56060:40;;;56073:4;56060:40;56052:59;;;;-1:-1:-1;;;56052:59:0;;23656:2:1;56052:59:0;;;23638:21:1;23695:1;23675:18;;;23668:29;-1:-1:-1;;;23713:18:1;;;23706:36;23759:18;;56052:59:0;23454:329:1;56052:59:0;56122:21;56146:10;:32;;56169:9;;;;:4;:9;;;;;56146:32;;;56159:9;;;;:4;:9;;;;;56146:32;56122:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56122:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56189:11;56209:7;56230:6;56225:175;56242:6;:13;56238:1;:17;56225:175;;;56296:3;56279:6;56286:1;56279:9;;;;;;;;:::i;:::-;;;;;;;:13;;;:20;:46;;;;;56321:4;-1:-1:-1;;;;;56303:22:0;:6;56310:1;56303:9;;;;;;;;:::i;:::-;;;;;;;:14;;;-1:-1:-1;;;;;56303:22:0;;56279:46;56276:113;;;56350:4;56341:13;;56374:1;56369:6;;56276:113;56258:3;;;;:::i;:::-;;;;56225:175;;;;56416:6;56408:35;;;;-1:-1:-1;;;56408:35:0;;20215:2:1;56408:35:0;;;20197:21:1;20254:2;20234:18;;;20227:30;-1:-1:-1;;;20273:18:1;;;20266:47;20330:18;;56408:35:0;20013:341:1;56408:35:0;56491:8;;;;:3;:8;;;;;:13;;;;;56487:88;;56516:18;:6;47247:19;;47265:1;47247:19;;;47158:127;56516:18;56545:8;;;;:3;:8;;;;;:13;;:20;;-1:-1:-1;;56545:20:0;56561:4;56545:20;;;56487:88;56587:8;;;;:3;:8;;;;;:14;;;-1:-1:-1;;;;;56587:14:0;56605:10;56587:28;56584:151;;;56628:32;56638:10;56650:4;56656:3;56628:9;:32::i;:::-;56584:151;;;56689:35;56707:4;56714;56720:3;56689:9;:35::i;:::-;56748:8;;;;:3;:8;;;;;:14;;;:30;;-1:-1:-1;;;;;56748:30:0;;-1:-1:-1;;;;;;56748:30:0;;;;;;;56788:15;;;:37;;;;;;;56835:14;;:18;56875:10;;:6;;56882:2;;56875:10;;;;;;:::i;:::-;;;;;;;:14;;;56865:6;;:24;;;;;;;:::i;:::-;;;;;;;;56901:13;56958:5;56933:23;;56918:6;56925:2;56918:10;;;;;;;;:::i;:::-;;;;;;;:14;;;:38;;;;:::i;:::-;56917:46;;;;:::i;:::-;56901:62;;56981:8;56973:4;;:16;;;;;;;:::i;:::-;;;;;;;;56999;57034:8;57019:6;57026:2;57019:10;;;;;;;;:::i;:::-;;;;;;;:14;;;:23;;;;:::i;:::-;57142:3;;57139:40;;-1:-1:-1;;;57139:40:0;;56999:44;;-1:-1:-1;;;;;;57142:3:0;;57139:15;;:40;;57163:4;;56999:44;;57139:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57131:49;;;;;;57223:3;;57220:39;;-1:-1:-1;;;57220:39:0;;-1:-1:-1;;;;;57223:3:0;;;;57220:16;;:39;;57237:10;;57250:8;;57220:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57212:48;;;;;;57273:10;:56;;57309:20;57322:3;57326:2;57309:12;:20::i;:::-;57273:56;;;57286:20;57299:3;57303:2;57286:12;:20::i;:::-;55880:1456;;;;;55783:1553;;;;;:::o;65227:136::-;65280:13;;:::i;:::-;65310:45;;;-1:-1:-1;65317:7:0;;;:3;:7;;;;;;;65310:45;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65310:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65325:20;;:4;:20;;;;;65310:45;;;;;;;;;;;;;;;;;;;;;;;;;65325:20;;65310:45;;-1:-1:-1;65310:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65310:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65346:4;:8;65351:2;65346:8;;;;;;;;;;;65310:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65310:45:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65310:45:0;;-1:-1:-1;65303:52:0;65227:136;-1:-1:-1;;65227:136:0:o;51363:118::-;10795:13;:11;:13::i;:::-;51443:23:::1;:30:::0;51363:118::o;44729:624::-;44802:13;44828:23;44843:7;44828:14;:23::i;:::-;44864;44890:19;;;:10;:19;;;;;44864:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44920:18;44941:10;32899:9;;;;;;;;;-1:-1:-1;32899:9:0;;;32822:94;44941:10;44920:31;;45033:4;45027:18;45049:1;45027:23;45023:72;;;-1:-1:-1;45074:9:0;44729:624;-1:-1:-1;;44729:624:0:o;45023:72::-;45199:23;;:27;45195:108;;45274:4;45280:9;45257:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45243:48;;;;44729:624;;;:::o;45195:108::-;45322:23;45337:7;45322:14;:23::i;:::-;45315:30;44729:624;-1:-1:-1;;;;44729:624:0:o;54293:606::-;54355:17;54382:8;54405:6;54400:423;54418:8;;;;:4;:8;;;;;:15;54414:19;;54400:423;;;54456:8;;;;:4;:8;;;;;:11;;54476:10;;54456:8;54465:1;;54456:11;;;;;;:::i;:::-;;;;;;;;;;;;;;:16;-1:-1:-1;;;;;54456:16:0;:30;54453:360;;;54514:3;;;54542:8;;;:4;:8;;;;;:11;;-1:-1:-1;;;;;54514:3:0;;;;54511:15;;54535:4;;54551:1;;54542:11;;;;;;:::i;:::-;;;;;;;;;;;:15;;;54511:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54503:67;;;;-1:-1:-1;;;54503:67:0;;22321:2:1;54503:67:0;;;22303:21:1;22360:1;22340:18;;;22333:29;-1:-1:-1;;;22378:18:1;;;22371:37;22425:18;;54503:67:0;22119:330:1;54503:67:0;54619:3;;;54646:8;;;:4;:8;;;;;:11;;-1:-1:-1;;;;;54619:3:0;;;;54616:16;;54633:10;;54655:1;;54646:11;;;;;;:::i;:::-;;;;;;;;;;;:15;;;54616:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54608:64;;;;-1:-1:-1;;;54608:64:0;;;;;;;:::i;:::-;54698:8;;;;:4;:8;;;;;:11;;54707:1;;54698:11;;;;;;:::i;:::-;;;;;;;;;;;:15;;;54688:6;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;54745:1:0;54727:8;;;:4;:8;;;;;:11;;54736:1;;54727:11;;;;;;:::i;:::-;;;;;;;;;;;:15;;:19;;;;54766:4;54760:10;;54799:1;54784:16;;54453:360;54436:3;;;;:::i;:::-;;;;54400:423;;;;54835:3;54832:59;;;54851:29;54864:2;54867:12;54851;:29::i;52560:839::-;52636:5;;;;:1;:5;;;;;:8;;;:14;;52628:34;;;;-1:-1:-1;;;52628:34:0;;20893:2:1;52628:34:0;;;20875:21:1;20932:1;20912:18;;;20905:29;-1:-1:-1;;;20950:18:1;;;20943:38;20998:18;;52628:34:0;20691:331:1;52628:34:0;52680:5;;;;:1;:5;;;;;:14;;;;;52672:34;;;;-1:-1:-1;;;52672:34:0;;19546:2:1;52672:34:0;;;19528:21:1;19585:1;19565:18;;;19558:29;-1:-1:-1;;;19603:18:1;;;19596:38;19651:18;;52672:34:0;19344:331:1;52672:34:0;52730:1;52726:3;:5;52718:22;;;;-1:-1:-1;;;52718:22:0;;21988:2:1;52718:22:0;;;21970:21:1;22027:1;22007:18;;;22000:29;-1:-1:-1;;;22045:18:1;;;22038:35;22090:18;;52718:22:0;21786:328:1;52718:22:0;52831:3;;52828:44;;-1:-1:-1;;;52828:44:0;;52876:3;;-1:-1:-1;;;;;52831:3:0;;52828:17;;:44;;52846:10;;52866:4;;52828:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;52820:73;;;;-1:-1:-1;;;52820:73:0;;;;;;;:::i;:::-;52956:3;;52953:29;;-1:-1:-1;;;52953:29:0;;52971:10;52953:29;;;10390:51:1;52985:3:0;;-1:-1:-1;;;;;52956:3:0;;52953:17;;10363:18:1;;52953:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;52945:50;;;;-1:-1:-1;;;52945:50:0;;;;;;;:::i;:::-;53007:8;53038:6;53033:168;53050:8;;;;:4;:8;;;;;:15;53046:19;;53033:168;;;53088:8;;;;:4;:8;;;;;:11;;53108:10;;53088:8;53097:1;;53088:11;;;;;;:::i;:::-;;;;;;;;;;;;;;:16;-1:-1:-1;;;;;53088:16:0;:30;53085:106;;;53133:8;;;;:4;:8;;;;;:11;;53151:3;;53133:8;53142:1;;53133:11;;;;;;:::i;:::-;;;;;;;;;;;:15;;:21;;;;53174:4;53168:10;;53085:106;53068:3;;;;:::i;:::-;;;;53033:168;;;;53214:3;53210:69;;53231:8;;;;:4;:8;;;;;;;;53245:22;;;;;;;53251:10;53245:22;;;;;;;;;53231:37;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53231:37:0;-1:-1:-1;;;;;53231:37:0;;;;;;;;;;;;;;;;53301:3;;53298:51;;-1:-1:-1;;;53298:51:0;;53301:3;;;53298:20;;:51;;53251:10;53339:4;;53245:22;;53298:51;;;:::i;53406:89::-;53456:7;10795:13;:11;:13::i;:::-;-1:-1:-1;53482:4:0::1;::::0;53406:89;:::o;33930:164::-;-1:-1:-1;;;;;34051:25:0;;;34027:4;34051:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33930:164::o;11815:201::-;10795:13;:11;:13::i;:::-;-1:-1:-1;;;;;11904:22:0;::::1;11896:73;;;::::0;-1:-1:-1;;;11896:73:0;;18043:2:1;11896:73:0::1;::::0;::::1;18025:21:1::0;18082:2;18062:18;;;18055:30;18121:34;18101:18;;;18094:62;-1:-1:-1;;;18172:18:1;;;18165:36;18218:19;;11896:73:0::1;17841:402:1::0;11896:73:0::1;11980:28;11999:8;11980:18;:28::i;58713:539::-:0;58788:6;;;;58787:7;58779:26;;;;-1:-1:-1;;;58779:26:0;;;;;;;:::i;:::-;58836:6;;;;:1;:6;;;;;:14;-1:-1:-1;;;;;58836:14:0;58822:10;:28;58814:47;;;;-1:-1:-1;;;58814:47:0;;;;;;;:::i;:::-;58878:6;;;;:1;:6;;;;;:18;;;:27;-1:-1:-1;58878:27:0;58870:44;;;;-1:-1:-1;;;58870:44:0;;;;;;;:::i;:::-;58925:12;58940:15;:5;47128:14;;47036:114;58940:15;58925:30;;58976:4;58972:3;:8;58964:22;;;;-1:-1:-1;;;58964:22:0;;15603:2:1;58964:22:0;;;15585:21:1;15642:1;15622:18;;;15615:29;-1:-1:-1;;;15660:18:1;;;15653:32;15702:18;;58964:22:0;15401:325:1;58964:22:0;59003:6;;;;:1;:6;;;;;:15;;;;;:23;;:15;:23;58995:37;;;;-1:-1:-1;;;58995:37:0;;;;;;;:::i;:::-;59070:6;;;;:1;:6;;;;;:10;;;;59049:13;;;;;:19;;59063:5;;59049:19;:::i;:::-;:31;;59041:48;;;;-1:-1:-1;;;59041:48:0;;;;;;;:::i;:::-;59106:6;;;;:1;:6;;;;;:12;;;59119:15;-1:-1:-1;59098:46:0;;;;-1:-1:-1;;;59098:46:0;;23322:2:1;59098:46:0;;;23304:21:1;23361:1;23341:18;;;23334:29;-1:-1:-1;;;23379:18:1;;;23372:36;23425:18;;59098:46:0;23120:329:1;59098:46:0;59155:18;59162:3;59167:5;59155:6;:18::i;:::-;59203:6;;;;:1;:6;;;;;:18;;;:26;;59224:5;;59203:26;:::i;:::-;59182:6;;;;:1;:6;;;;;;:18;;:47;;;;-1:-1:-1;;58713:539:0:o;65369:584::-;65410:15;65436:8;65447:14;:4;47128:14;;47036:114;65447:14;65436:25;;65470:7;65486;65509:6;65504:113;65521:3;65517:1;:7;65504:113;;;65567:10;65546:3;:10;65550:5;:1;65554;65550:5;:::i;:::-;65546:10;;;;;;;;;;;-1:-1:-1;65546:10:0;:17;;;-1:-1:-1;;;;;65546:17:0;:31;65542:66;;;65592:4;;;;:::i;:::-;;;;65542:66;65526:3;;;;:::i;:::-;;;;65504:113;;;;65627:18;65661:2;-1:-1:-1;;;;;65648:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;65627:37;;65678:6;65673:253;65690:3;65686:1;:7;65673:253;;;65736:10;65715:3;:10;65719:5;:1;65723;65719:5;:::i;:::-;65715:10;;;;;;;;;;;-1:-1:-1;65715:10:0;:17;;;-1:-1:-1;;;;;65715:17:0;:31;65711:206;;;65761:8;65772:5;:1;65776;65772:5;:::i;:::-;65790:19;65812:8;;;:3;:8;;;;;;;;65842:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65842:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65855:21;;:4;:21;;;;;65842:45;;;;;;;;;;;;;;;;;65761:16;;-1:-1:-1;65812:8:0;;65842:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65842:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65877:4;:9;65882:3;65877:9;;;;;;;;;;;65842:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65842:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65833:2;65836;65833:6;;;;;;;;:::i;:::-;;;;;;:54;;;;65900:5;;;;;:::i;:::-;;;;65748:169;;65711:206;65695:3;;;;:::i;:::-;;;;65673:253;;;-1:-1:-1;65943:2:0;65369:584;-1:-1:-1;;;;65369:584:0:o;55644:132::-;55720:8;;;;:4;:8;;;;;55729:15;;:17;;55745:1;;55729:17;:::i;:::-;55720:27;;;;;;;;:::i;:::-;;;;;;;;;;;55702:4;:8;55707:2;55702:8;;;;;;;;;;;55711:5;55702:15;;;;;;;;:::i;:::-;;;;;;;;;:45;;:15;;;;;:45;;-1:-1:-1;;;;;;55702:45:0;-1:-1:-1;;;;;55702:45:0;;;;;;;;;;;;;;;;;;;;;;55755:8;;;:4;:8;;;;;;:14;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;55755:14:0;;;;;;;;;-1:-1:-1;;;;;;55755:14:0;;;;;;;;-1:-1:-1;;55644:132:0:o;41436:135::-;41518:16;41526:7;41518;:16::i;:::-;41510:53;;;;-1:-1:-1;;;41510:53:0;;;;;;;:::i;11074:132::-;10982:6;;-1:-1:-1;;;;;10982:6:0;9540:10;11138:23;11130:68;;;;-1:-1:-1;;;11130:68:0;;26272:2:1;11130:68:0;;;26254:21:1;;;26291:18;;;26284:30;26350:34;26330:18;;;26323:62;26402:18;;11130:68:0;26070:356:1;40715:174:0;40790:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;40790:29:0;-1:-1:-1;;;;;40790:29:0;;;;;;;;:24;;40844:23;40790:24;40844:14;:23::i;:::-;-1:-1:-1;;;;;40835:46:0;;;;;;;;;;;40715:174;;:::o;47293:235::-;47373:14;;47406:9;47398:49;;;;-1:-1:-1;;;47398:49:0;;16600:2:1;47398:49:0;;;16582:21:1;16639:2;16619:18;;;16612:30;16678:29;16658:18;;;16651:57;16725:18;;47398:49:0;16398:351:1;47398:49:0;-1:-1:-1;;47500:9:0;47483:26;;47293:235::o;39971:625::-;40130:4;-1:-1:-1;;;;;40103:31:0;:23;40118:7;40103:14;:23::i;:::-;-1:-1:-1;;;;;40103:31:0;;40095:81;;;;-1:-1:-1;;;40095:81:0;;18450:2:1;40095:81:0;;;18432:21:1;18489:2;18469:18;;;18462:30;18528:34;18508:18;;;18501:62;-1:-1:-1;;;18579:18:1;;;18572:35;18624:19;;40095:81:0;18248:401:1;40095:81:0;-1:-1:-1;;;;;40195:16:0;;40187:65;;;;-1:-1:-1;;;40187:65:0;;21229:2:1;40187:65:0;;;21211:21:1;21268:2;21248:18;;;21241:30;21307:34;21287:18;;;21280:62;-1:-1:-1;;;21358:18:1;;;21351:34;21402:19;;40187:65:0;21027:400:1;40187:65:0;40265:39;40286:4;40292:2;40296:7;40265:20;:39::i;:::-;40369:29;40386:1;40390:7;40369:8;:29::i;:::-;-1:-1:-1;;;;;40411:15:0;;;;;;:9;:15;;;;;:20;;40430:1;;40411:15;:20;;40430:1;;40411:20;:::i;:::-;;;;-1:-1:-1;;;;;;;40442:13:0;;;;;;:9;:13;;;;;:18;;40459:1;;40442:13;:18;;40459:1;;40442:18;:::i;:::-;;;;-1:-1:-1;;40471:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;40471:21:0;-1:-1:-1;;;;;40471:21:0;;;;;;;;;40510:27;;40471:16;;40510:27;;;;;;;55102:534;;55051:585;:::o;60224:479::-;60285:6;60280:401;60297:5;60293:1;:9;60280:401;;;60320:18;:6;47247:19;;47265:1;47247:19;;;47158:127;60320:18;60349:16;:4;47247:19;;47265:1;47247:19;;;47158:127;60349:16;60376:6;;;;:1;:6;;;;;:13;;:16;;;;;;:::i;:::-;;;;;;60405:11;60419:14;:4;47128:14;;47036:114;60419:14;60457:83;;;;;;;;;;;-1:-1:-1;60467:6:0;;;:1;60457:83;60467:6;;;;;;:9;;;;60457:83;;;;;;;;;;;;60506:10;60457:83;;;;;;60518:14;;-1:-1:-1;;;;;60518:14:0;;;60457:83;;;;;;;;;;;;60518:14;60457:83;;;;;;60446:8;;;:3;:8;;;;;;;:94;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;60446:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60446:94:0;;;;;;;;;;60457:83;;-1:-1:-1;60553:22:0;;60457:83;60553:5;:22::i;:::-;60586:83;60599:3;60651:1;:6;60653:3;60651:6;;;;;;;;;;;:15;;60611:56;;;;;;;;:::i;60586:83::-;-1:-1:-1;60304:3:0;;;;:::i;:::-;;;;60280:401;;36948:264;37041:4;37058:13;37074:23;37089:7;37074:14;:23::i;:::-;37058:39;;37127:5;-1:-1:-1;;;;;37116:16:0;:7;-1:-1:-1;;;;;37116:16:0;;:52;;;;37136:32;37153:5;37160:7;37136:16;:32::i;:::-;37116:87;;;;37196:7;-1:-1:-1;;;;;37172:31:0;:20;37184:7;37172:11;:20::i;:::-;-1:-1:-1;;;;;37172:31:0;;37108:96;36948:264;-1:-1:-1;;;;36948:264:0:o;12176:191::-;12269:6;;;-1:-1:-1;;;;;12286:17:0;;;-1:-1:-1;;;;;;12286:17:0;;;;;;;12319:40;;12269:6;;;12286:17;12269:6;;12319:40;;12250:16;;12319:40;12239:128;12176:191;:::o;36654:127::-;36719:4;36743:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36743:16:0;:30;;;36654:127::o;41032:315::-;41187:8;-1:-1:-1;;;;;41178:17:0;:5;-1:-1:-1;;;;;41178:17:0;;;41170:55;;;;-1:-1:-1;;;41170:55:0;;21634:2:1;41170:55:0;;;21616:21:1;21673:2;21653:18;;;21646:30;21712:27;21692:18;;;21685:55;21757:18;;41170:55:0;21432:349:1;41170:55:0;-1:-1:-1;;;;;41236:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;41236:46:0;;;;;;;;;;41298:41;;14792::1;;;41298::0;;14765:18:1;41298:41:0;;;;;;;41032:315;;;:::o;36028:313::-;36184:28;36194:4;36200:2;36204:7;36184:9;:28::i;:::-;36231:47;36254:4;36260:2;36264:7;36273:4;36231:22;:47::i;:::-;36223:110;;;;-1:-1:-1;;;36223:110:0;;;;;;;:::i;45509:217::-;45609:16;45617:7;45609;:16::i;:::-;45601:75;;;;-1:-1:-1;;;45601:75:0;;24731:2:1;45601:75:0;;;24713:21:1;24770:2;24750:18;;;24743:30;24809:34;24789:18;;;24782:62;-1:-1:-1;;;24860:18:1;;;24853:44;24914:19;;45601:75:0;24529:410:1;45601:75:0;45687:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;54908:135::-;54985:8;;;;:4;:8;;;;;54994:15;;:17;;55010:1;;54994:17;:::i;:::-;54985:27;;;;;;;;:::i;:::-;;;;;;;;;;;54967:4;:8;54972:2;54967:8;;;;;;;;;;;54976:5;54967:15;;;;;;;;:::i;:::-;;;;;;;;;:45;;:15;;;;;:45;;-1:-1:-1;;;;;;54967:45:0;-1:-1:-1;;;;;54967:45:0;;;;;;;;;;;;;;;;;;;;;;55021:8;;;:4;:8;;;;;;:14;;;;;;;:::i;32292:281::-;32365:13;32391:23;32406:7;32391:14;:23::i;:::-;32427:21;32451:10;32899:9;;;;;;;;;-1:-1:-1;32899:9:0;;;32822:94;32451:10;32427:34;;32503:1;32485:7;32479:21;:25;:86;;;;;;;;;;;;;;;;;32531:7;32540:18;:7;:16;:18::i;:::-;32514:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32472:93;32292:281;-1:-1:-1;;;32292:281:0:o;66695:667::-;-1:-1:-1;;;;;66862:18:0;;;;:191;;-1:-1:-1;;;;;;66886:19:0;;66900:4;66886:19;:81;;;;-1:-1:-1;66918:12:0;;;;:3;:12;;;;;:19;;;-1:-1:-1;;;;;66910:27:0;;;66918:19;;66910:27;;:55;;-1:-1:-1;66947:12:0;;;;:3;:12;;;;;:18;;;-1:-1:-1;;;;;66939:26:0;;;66947:18;;66939:26;66910:55;66885:166;;;-1:-1:-1;;;;;;66971:21:0;;66987:4;66971:21;:79;;;;-1:-1:-1;67003:12:0;;;;:3;:12;;;;;:19;;;-1:-1:-1;;;;;66997:25:0;;;67003:19;;66997:25;;:51;;-1:-1:-1;67030:12:0;;;;:3;:12;;;;;:18;;;-1:-1:-1;;;;;67024:24:0;;;67030:18;;67024:24;66997:51;66857:498;;67074:12;;;;:3;:12;;;;;:17;;;;;67071:122;;67118:18;:6;47247:19;;47265:1;47247:19;;;47158:127;67118:18;67153:12;;;;:3;:12;;;;;:17;;:24;;-1:-1:-1;;67153:24:0;67173:4;67153:24;;;67071:122;67207:12;;;;:3;:12;;;;;:18;;;:41;;-1:-1:-1;;;;;67207:41:0;;-1:-1:-1;;;;;;67207:41:0;;;;;;;67263:19;;;:41;;;;;;;67319:18;;:22;66695:667;;;:::o;38546:439::-;-1:-1:-1;;;;;38626:16:0;;38618:61;;;;-1:-1:-1;;;38618:61:0;;25577:2:1;38618:61:0;;;25559:21:1;;;25596:18;;;25589:30;25655:34;25635:18;;;25628:62;25707:18;;38618:61:0;25375:356:1;38618:61:0;38699:16;38707:7;38699;:16::i;:::-;38698:17;38690:58;;;;-1:-1:-1;;;38690:58:0;;19189:2:1;38690:58:0;;;19171:21:1;19228:2;19208:18;;;19201:30;19267;19247:18;;;19240:58;19315:18;;38690:58:0;18987:352:1;38690:58:0;38761:45;38790:1;38794:2;38798:7;38761:20;:45::i;:::-;-1:-1:-1;;;;;38819:13:0;;;;;;:9;:13;;;;;:18;;38836:1;;38819:13;:18;;38836:1;;38819:18;:::i;:::-;;;;-1:-1:-1;;38848:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38848:21:0;-1:-1:-1;;;;;38848:21:0;;;;;;;;38887:33;;38848:16;;;38887:33;;38848:16;;38887:33;60838:392;;:::o;42135:853::-;42289:4;-1:-1:-1;;;;;42310:13:0;;13902:19;:23;42306:675;;42346:71;;-1:-1:-1;;;42346:71:0;;-1:-1:-1;;;;;42346:36:0;;;;;:71;;9540:10;;42397:4;;42403:7;;42412:4;;42346:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42346:71:0;;;;;;;;-1:-1:-1;;42346:71:0;;;;;;;;;;;;:::i;:::-;;;42342:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42587:13:0;;42583:328;;42630:60;;-1:-1:-1;;;42630:60:0;;;;;;;:::i;42583:328::-;42861:6;42855:13;42846:6;42842:2;42838:15;42831:38;42342:584;-1:-1:-1;;;;;;42468:51:0;-1:-1:-1;;;42468:51:0;;-1:-1:-1;42461:58:0;;42306:675;-1:-1:-1;42965:4:0;42135:853;;;;;;:::o;6714:723::-;6770:13;6991:10;6987:53;;-1:-1:-1;;7018:10:0;;;;;;;;;;;;-1:-1:-1;;;7018:10:0;;;;;6714:723::o;6987:53::-;7065:5;7050:12;7106:78;7113:9;;7106:78;;7139:8;;;;:::i;:::-;;-1:-1:-1;7162:10:0;;-1:-1:-1;7170:2:0;7162:10;;:::i;:::-;;;7106:78;;;7194:19;7226:6;-1:-1:-1;;;;;7216:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7216:17:0;;7194:39;;7244:154;7251:10;;7244:154;;7278:11;7288:1;7278:11;;:::i;:::-;;-1:-1:-1;7347:10:0;7355:2;7347:5;:10;:::i;:::-;7334:24;;:2;:24;:::i;:::-;7321:39;;7304:6;7311;7304:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7304:56:0;;;;;;;;-1:-1:-1;7375:11:0;7384:2;7375:11;;:::i;:::-;;;7244:154;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:221::-;871:5;924:3;917:4;909:6;905:17;901:27;891:55;;942:1;939;932:12;891:55;964:79;1039:3;1030:6;1017:20;1010:4;1002:6;998:17;964:79;:::i;1054:186::-;1113:6;1166:2;1154:9;1145:7;1141:23;1137:32;1134:52;;;1182:1;1179;1172:12;1134:52;1205:29;1224:9;1205:29;:::i;1245:260::-;1313:6;1321;1374:2;1362:9;1353:7;1349:23;1345:32;1342:52;;;1390:1;1387;1380:12;1342:52;1413:29;1432:9;1413:29;:::i;:::-;1403:39;;1461:38;1495:2;1484:9;1480:18;1461:38;:::i;:::-;1451:48;;1245:260;;;;;:::o;1510:328::-;1587:6;1595;1603;1656:2;1644:9;1635:7;1631:23;1627:32;1624:52;;;1672:1;1669;1662:12;1624:52;1695:29;1714:9;1695:29;:::i;:::-;1685:39;;1743:38;1777:2;1766:9;1762:18;1743:38;:::i;:::-;1733:48;;1828:2;1817:9;1813:18;1800:32;1790:42;;1510:328;;;;;:::o;1843:666::-;1938:6;1946;1954;1962;2015:3;2003:9;1994:7;1990:23;1986:33;1983:53;;;2032:1;2029;2022:12;1983:53;2055:29;2074:9;2055:29;:::i;:::-;2045:39;;2103:38;2137:2;2126:9;2122:18;2103:38;:::i;:::-;2093:48;;2188:2;2177:9;2173:18;2160:32;2150:42;;2243:2;2232:9;2228:18;2215:32;-1:-1:-1;;;;;2262:6:1;2259:30;2256:50;;;2302:1;2299;2292:12;2256:50;2325:22;;2378:4;2370:13;;2366:27;-1:-1:-1;2356:55:1;;2407:1;2404;2397:12;2356:55;2430:73;2495:7;2490:2;2477:16;2472:2;2468;2464:11;2430:73;:::i;:::-;2420:83;;;1843:666;;;;;;;:::o;2514:315::-;2579:6;2587;2640:2;2628:9;2619:7;2615:23;2611:32;2608:52;;;2656:1;2653;2646:12;2608:52;2679:29;2698:9;2679:29;:::i;:::-;2669:39;;2758:2;2747:9;2743:18;2730:32;2771:28;2793:5;2771:28;:::i;:::-;2818:5;2808:15;;;2514:315;;;;;:::o;2834:254::-;2902:6;2910;2963:2;2951:9;2942:7;2938:23;2934:32;2931:52;;;2979:1;2976;2969:12;2931:52;3002:29;3021:9;3002:29;:::i;:::-;2992:39;3078:2;3063:18;;;;3050:32;;-1:-1:-1;;;2834:254:1:o;3093:241::-;3149:6;3202:2;3190:9;3181:7;3177:23;3173:32;3170:52;;;3218:1;3215;3208:12;3170:52;3257:9;3244:23;3276:28;3298:5;3276:28;:::i;3339:245::-;3406:6;3459:2;3447:9;3438:7;3434:23;3430:32;3427:52;;;3475:1;3472;3465:12;3427:52;3507:9;3501:16;3526:28;3548:5;3526:28;:::i;3589:245::-;3647:6;3700:2;3688:9;3679:7;3675:23;3671:32;3668:52;;;3716:1;3713;3706:12;3668:52;3755:9;3742:23;3774:30;3798:5;3774:30;:::i;3839:249::-;3908:6;3961:2;3949:9;3940:7;3936:23;3932:32;3929:52;;;3977:1;3974;3967:12;3929:52;4009:9;4003:16;4028:30;4052:5;4028:30;:::i;4093:180::-;4152:6;4205:2;4193:9;4184:7;4180:23;4176:32;4173:52;;;4221:1;4218;4211:12;4173:52;-1:-1:-1;4244:23:1;;4093:180;-1:-1:-1;4093:180:1:o;4278:184::-;4348:6;4401:2;4389:9;4380:7;4376:23;4372:32;4369:52;;;4417:1;4414;4407:12;4369:52;-1:-1:-1;4440:16:1;;4278:184;-1:-1:-1;4278:184:1:o;4467:309::-;4532:6;4540;4593:2;4581:9;4572:7;4568:23;4564:32;4561:52;;;4609:1;4606;4599:12;4561:52;4645:9;4632:23;4622:33;;4705:2;4694:9;4690:18;4677:32;4718:28;4740:5;4718:28;:::i;4781:390::-;4859:6;4867;4920:2;4908:9;4899:7;4895:23;4891:32;4888:52;;;4936:1;4933;4926:12;4888:52;4972:9;4959:23;4949:33;;5033:2;5022:9;5018:18;5005:32;-1:-1:-1;;;;;5052:6:1;5049:30;5046:50;;;5092:1;5089;5082:12;5046:50;5115;5157:7;5148:6;5137:9;5133:22;5115:50;:::i;:::-;5105:60;;;4781:390;;;;;:::o;5176:248::-;5244:6;5252;5305:2;5293:9;5284:7;5280:23;5276:32;5273:52;;;5321:1;5318;5311:12;5273:52;-1:-1:-1;;5344:23:1;;;5414:2;5399:18;;;5386:32;;-1:-1:-1;5176:248:1:o;5429:521::-;5521:6;5529;5537;5545;5553;5606:3;5594:9;5585:7;5581:23;5577:33;5574:53;;;5623:1;5620;5613:12;5574:53;5659:9;5646:23;5636:33;;5716:2;5705:9;5701:18;5688:32;5678:42;;5767:2;5756:9;5752:18;5739:32;5729:42;;5790:38;5824:2;5813:9;5809:18;5790:38;:::i;:::-;5780:48;;5878:3;5867:9;5863:19;5850:33;5892:28;5914:5;5892:28;:::i;:::-;5939:5;5929:15;;;5429:521;;;;;;;;:::o;5955:527::-;6051:6;6059;6067;6075;6128:3;6116:9;6107:7;6103:23;6099:33;6096:53;;;6145:1;6142;6135:12;6096:53;6181:9;6168:23;6158:33;;6238:2;6227:9;6223:18;6210:32;6200:42;;6289:2;6278:9;6274:18;6261:32;6251:42;;6344:2;6333:9;6329:18;6316:32;-1:-1:-1;;;;;6363:6:1;6360:30;6357:50;;;6403:1;6400;6393:12;6357:50;6426;6468:7;6459:6;6448:9;6444:22;6426:50;:::i;6604:553::-;6662:3;6700:5;6694:12;6727:6;6722:3;6715:19;6753:4;6782:2;6777:3;6773:12;6766:19;;6819:2;6812:5;6808:14;6840:1;6850:282;6864:6;6861:1;6858:13;6850:282;;;6923:13;;6965:9;;-1:-1:-1;;;;;6961:35:1;6949:48;;7037:11;;7031:18;7017:12;;;7010:40;7079:4;7070:14;;;;7107:15;;;;6993:1;6879:9;6850:282;;;-1:-1:-1;7148:3:1;;6604:553;-1:-1:-1;;;;;6604:553:1:o;7258:257::-;7299:3;7337:5;7331:12;7364:6;7359:3;7352:19;7380:63;7436:6;7429:4;7424:3;7420:14;7413:4;7406:5;7402:16;7380:63;:::i;:::-;7497:2;7476:15;-1:-1:-1;;7472:29:1;7463:39;;;;7504:4;7459:50;;7258:257;-1:-1:-1;;7258:257:1:o;7520:938::-;7569:3;7597:6;7628:5;7622:12;7661:2;7655:9;7650:3;7643:22;7711:4;7707:2;7703:13;7697:20;7690:4;7685:3;7681:14;7674:44;7761:4;7757:2;7753:13;7747:20;7803:1;7799;7794:3;7790:11;7786:19;7855:2;7841:12;7837:21;7830:4;7825:3;7821:14;7814:45;7917:2;7909:4;7905:2;7901:13;7895:20;7891:29;7884:4;7879:3;7875:14;7868:53;7979:2;7971:4;7967:2;7963:13;7957:20;7953:29;7946:4;7941:3;7937:14;7930:53;;;8029:4;8025:2;8021:13;8015:20;8008:4;8003:3;7999:14;7992:44;8096:4;8092:2;8088:13;8082:20;8075:28;8068:36;8061:4;8056:3;8052:14;8045:60;;8153:4;8146:5;8142:16;8136:23;8191:2;8184:4;8179:3;8175:14;8168:26;8215:63;8274:2;8269:3;8265:12;8249:14;8215:63;:::i;:::-;8203:75;;;8326:4;8319:5;8315:16;8309:23;8376:3;8370:4;8366:14;8357:6;8352:3;8348:16;8341:40;8397:55;8447:4;8431:14;8397:55;:::i;:::-;8390:62;7520:938;-1:-1:-1;;;;;7520:938:1:o;8463:470::-;8642:3;8680:6;8674:13;8696:53;8742:6;8737:3;8730:4;8722:6;8718:17;8696:53;:::i;:::-;8812:13;;8771:16;;;;8834:57;8812:13;8771:16;8868:4;8856:17;;8834:57;:::i;:::-;8907:20;;8463:470;-1:-1:-1;;;;8463:470:1:o;8938:1301::-;-1:-1:-1;;;9192:3:1;9185:35;9167:3;9239:2;9261:1;9294:6;9288:13;9324:3;9346:1;9374:9;9370:2;9366:18;9356:28;;9434:2;9423:9;9419:18;9456;9446:61;;9500:4;9492:6;9488:17;9478:27;;9446:61;9526:2;9574;9566:6;9563:14;9543:18;9540:38;9537:165;;;-1:-1:-1;;;9601:33:1;;9657:4;9654:1;9647:15;9687:4;9608:3;9675:17;9537:165;9718:18;9745:122;;;;9881:1;9876:338;;;;9711:503;;9745:122;-1:-1:-1;;9787:24:1;;9773:12;;;9766:46;9836:16;;;9832:25;;;-1:-1:-1;9745:122:1;;9876:338;33442:1;33435:14;;;33479:4;33466:18;;9971:1;9985:174;9999:6;9996:1;9993:13;9985:174;;;10086:14;;10068:11;;;10064:20;;10057:44;10129:16;;;;10014:10;;9985:174;;;9989:3;;10201:2;10192:6;10187:3;10183:16;10179:25;10172:32;;9711:503;-1:-1:-1;10230:3:1;;8938:1301;-1:-1:-1;;;;;;;;;8938:1301:1:o;10452:304::-;-1:-1:-1;;;;;10682:15:1;;;10664:34;;10734:15;;10729:2;10714:18;;10707:43;10614:2;10599:18;;10452:304::o;10761:375::-;-1:-1:-1;;;;;11019:15:1;;;11001:34;;11071:15;;;;11066:2;11051:18;;11044:43;11118:2;11103:18;;11096:34;;;;10951:2;10936:18;;10761:375::o;11141:488::-;-1:-1:-1;;;;;11410:15:1;;;11392:34;;11462:15;;11457:2;11442:18;;11435:43;11509:2;11494:18;;11487:34;;;11557:3;11552:2;11537:18;;11530:31;;;11335:4;;11578:45;;11603:19;;11595:6;11578:45;:::i;:::-;11570:53;11141:488;-1:-1:-1;;;;;;11141:488:1:o;11634:274::-;-1:-1:-1;;;;;11826:32:1;;;;11808:51;;11890:2;11875:18;;11868:34;11796:2;11781:18;;11634:274::o;11913:1891::-;12095:4;12124:2;12164;12153:9;12149:18;12194:2;12183:9;12176:21;12217:6;12252;12246:13;12283:6;12275;12268:22;12309:2;12299:12;;12342:2;12331:9;12327:18;12320:25;;12404:2;12394:6;12391:1;12387:14;12376:9;12372:30;12368:39;12442:2;12434:6;12430:15;12463:1;12473:1302;12487:6;12484:1;12481:13;12473:1302;;;12552:22;;;-1:-1:-1;;12548:36:1;12536:49;;12608:13;;12690:9;;-1:-1:-1;;;;;6561:31:1;6549:44;;12644:6;12759:2;12755;12751:11;12745:18;12740:2;12732:6;12728:15;12721:43;12815:2;12811;12807:11;12801:18;12796:2;12788:6;12784:15;12777:43;12843:4;12898:2;12894;12890:11;12884:18;12879:2;12871:6;12867:15;12860:43;;12926:4;12977:2;12973;12969:11;12963:18;13018:2;13013;13005:6;13001:15;12994:27;13048:47;13091:2;13083:6;13079:15;13065:12;13048:47;:::i;:::-;13118:4;13165:11;;;13159:18;13142:15;;;13135:43;13201:4;13248:11;;;13242:18;13225:15;;;13218:43;13284:4;13331:11;;;13325:18;13308:15;;;13301:43;13368:6;13418:12;;;13412:19;13394:16;;;13387:45;13456:6;13503:12;;;13497:19;7232:13;7225:21;13561:16;;;7213:34;13602:6;13652:12;;;13646:19;13628:16;;;;13621:45;;;;-1:-1:-1;;;13753:12:1;;;;13718:15;;;;12509:1;12502:9;12473:1302;;;-1:-1:-1;13792:6:1;;11913:1891;-1:-1:-1;;;;;;;;11913:1891:1:o;13809:838::-;13999:4;14028:2;14068;14057:9;14053:18;14098:2;14087:9;14080:21;14121:6;14156;14150:13;14187:6;14179;14172:22;14225:2;14214:9;14210:18;14203:25;;14287:2;14277:6;14274:1;14270:14;14259:9;14255:30;14251:39;14237:53;;14325:2;14317:6;14313:15;14346:1;14356:262;14370:6;14367:1;14364:13;14356:262;;;14463:2;14459:7;14447:9;14439:6;14435:22;14431:36;14426:3;14419:49;14491:47;14531:6;14522;14516:13;14491:47;:::i;:::-;14481:57;-1:-1:-1;14596:12:1;;;;14561:15;;;;14392:1;14385:9;14356:262;;;-1:-1:-1;14635:6:1;;13809:838;-1:-1:-1;;;;;;;13809:838:1:o;14844:219::-;14993:2;14982:9;14975:21;14956:4;15013:44;15053:2;15042:9;15038:18;15030:6;15013:44;:::i;15731:327::-;15933:2;15915:21;;;15972:1;15952:18;;;15945:29;-1:-1:-1;;;16005:2:1;15990:18;;15983:34;16049:2;16034:18;;15731:327::o;16063:330::-;16265:2;16247:21;;;16304:1;16284:18;;;16277:29;-1:-1:-1;;;16337:2:1;16322:18;;16315:37;16384:2;16369:18;;16063:330::o;16754:414::-;16956:2;16938:21;;;16995:2;16975:18;;;16968:30;17034:34;17029:2;17014:18;;17007:62;-1:-1:-1;;;17100:2:1;17085:18;;17078:48;17158:3;17143:19;;16754:414::o;17508:328::-;17710:2;17692:21;;;17749:1;17729:18;;;17722:29;-1:-1:-1;;;17782:2:1;17767:18;;17760:35;17827:2;17812:18;;17508:328::o;18654:::-;18856:2;18838:21;;;18895:1;18875:18;;;18868:29;-1:-1:-1;;;18928:2:1;18913:18;;18906:35;18973:2;18958:18;;18654:328::o;26763:326::-;26965:2;26947:21;;;27004:1;26984:18;;;26977:29;-1:-1:-1;;;27037:2:1;27022:18;;27015:33;27080:2;27065:18;;26763:326::o;28088:328::-;28290:2;28272:21;;;28329:1;28309:18;;;28302:29;-1:-1:-1;;;28362:2:1;28347:18;;28340:35;28407:2;28392:18;;28088:328::o;28756:348::-;28958:2;28940:21;;;28997:2;28977:18;;;28970:30;-1:-1:-1;;;29031:2:1;29016:18;;29009:54;29095:2;29080:18;;28756:348::o;30180:327::-;30382:2;30364:21;;;30421:1;30401:18;;;30394:29;-1:-1:-1;;;30454:2:1;30439:18;;30432:34;30498:2;30483:18;;30180:327::o;30844:325::-;31046:2;31028:21;;;31085:1;31065:18;;;31058:29;-1:-1:-1;;;31118:2:1;31103:18;;31096:32;31160:2;31145:18;;30844:325::o;31174:332::-;31376:2;31358:21;;;31415:1;31395:18;;;31388:29;-1:-1:-1;;;31448:2:1;31433:18;;31426:39;31497:2;31482:18;;31174:332::o;31511:330::-;31713:2;31695:21;;;31752:1;31732:18;;;31725:29;-1:-1:-1;;;31785:2:1;31770:18;;31763:37;31832:2;31817:18;;31511:330::o;31846:410::-;32048:2;32030:21;;;32087:2;32067:18;;;32060:30;32126:34;32121:2;32106:18;;32099:62;-1:-1:-1;;;32192:2:1;32177:18;;32170:44;32246:3;32231:19;;31846:410::o;32261:329::-;32463:2;32445:21;;;32502:1;32482:18;;;32475:29;-1:-1:-1;;;32535:2:1;32520:18;;32513:36;32581:2;32566:18;;32261:329::o;32927:255::-;33104:2;33093:9;33086:21;33067:4;33124:52;33172:2;33161:9;33157:18;33149:6;33124:52;:::i;33495:128::-;33535:3;33566:1;33562:6;33559:1;33556:13;33553:39;;;33572:18;;:::i;:::-;-1:-1:-1;33608:9:1;;33495:128::o;33628:120::-;33668:1;33694;33684:35;;33699:18;;:::i;:::-;-1:-1:-1;33733:9:1;;33628:120::o;33753:168::-;33793:7;33859:1;33855;33851:6;33847:14;33844:1;33841:21;33836:1;33829:9;33822:17;33818:45;33815:71;;;33866:18;;:::i;:::-;-1:-1:-1;33906:9:1;;33753:168::o;33926:125::-;33966:4;33994:1;33991;33988:8;33985:34;;;33999:18;;:::i;:::-;-1:-1:-1;34036:9:1;;33926:125::o;34056:258::-;34128:1;34138:113;34152:6;34149:1;34146:13;34138:113;;;34228:11;;;34222:18;34209:11;;;34202:39;34174:2;34167:10;34138:113;;;34269:6;34266:1;34263:13;34260:48;;;-1:-1:-1;;34304:1:1;34286:16;;34279:27;34056:258::o;34319:380::-;34398:1;34394:12;;;;34441;;;34462:61;;34516:4;34508:6;34504:17;34494:27;;34462:61;34569:2;34561:6;34558:14;34538:18;34535:38;34532:161;;;34615:10;34610:3;34606:20;34603:1;34596:31;34650:4;34647:1;34640:15;34678:4;34675:1;34668:15;34532:161;;34319:380;;;:::o;34704:135::-;34743:3;-1:-1:-1;;34764:17:1;;34761:43;;;34784:18;;:::i;:::-;-1:-1:-1;34831:1:1;34820:13;;34704:135::o;34844:112::-;34876:1;34902;34892:35;;34907:18;;:::i;:::-;-1:-1:-1;34941:9:1;;34844:112::o;34961:127::-;35022:10;35017:3;35013:20;35010:1;35003:31;35053:4;35050:1;35043:15;35077:4;35074:1;35067:15;35093:127;35154:10;35149:3;35145:20;35142:1;35135:31;35185:4;35182:1;35175:15;35209:4;35206:1;35199:15;35225:127;35286:10;35281:3;35277:20;35274:1;35267:31;35317:4;35314:1;35307:15;35341:4;35338:1;35331:15;35357:127;35418:10;35413:3;35409:20;35406:1;35399:31;35449:4;35446:1;35439:15;35473:4;35470:1;35463:15;35489:127;35550:10;35545:3;35541:20;35538:1;35531:31;35581:4;35578:1;35571:15;35605:4;35602:1;35595:15;35621:118;35707:5;35700:13;35693:21;35686:5;35683:32;35673:60;;35729:1;35726;35719:12;35744:131;-1:-1:-1;;;;;;35818:32:1;;35808:43;;35798:71;;35865:1;35862;35855:12

Swarm Source

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