ETH Price: $2,687.69 (-1.82%)

Token

The Outsider Collective (TOSC)
 

Overview

Max Total Supply

334 TOSC

Holders

225

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
andrefullstack.eth
0x84061843Db2D0787A8AA7f5D623FfD709E4c4D74
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TheOutsiderCollective

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-06
*/

// SPDX-License-Identifier: MIT
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155Receiver.sol


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

pragma solidity ^0.8.0;


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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol


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

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

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

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

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

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

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

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

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

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

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

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

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

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

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

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

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

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

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

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

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

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

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

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

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

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

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

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

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

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @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, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

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

        return array;
    }
}

// File: contracts/TheOutsiderCollective.sol



pragma solidity ^ 0.8.7;




//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&***********************#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@**********************************@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#/@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&*************...*************************@@@@@@@@@@@(***********************(@@@@@@@&#&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(************....***********@@@@@@***********@@@@@@**********************************/&@@@@@##@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&***********,,**********/@@@@@&@@/*************/@@/*****************************************&@@@@&#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/***********..*******@@@@@@@@@**********************************....................,************@@@@@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#****************/@@&@@@@@%@//*************************************************,...........**********@@@@%#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*************(@@@@@@@@@/***@@@(*******************************************************.........*********@@@@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*********%@@@@@@@/*&@%&@***@@*@***********************************************************,......*********@@@@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*********(@@@&*****(@@@@***&@&@#*****************************..,**...*************************..,***********@@@&#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@***************@@***@@@@(***@@@@************@@@@%**********......*...*****************************...********@@@@#(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@(*************%@%&@&@@***@@@@@***@@@****%@@@/#@*********......**********************************....*******/@@@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@***************@@@*@%***@@@@**@@@@%@**%@@@*@@*@/******......************************************...*******(@@@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&***************************@@@@@***@@%*@@*&%@@@@**@@@%@/*@@@(*****....************************************************@@@@#(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@********************************@@@@@***@&#@@@@**@@@%*@@@@%*(@@@&*****************/@@@@************************************@@@%#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@************************************@@@@%**%@%(@@@***@@@**@@@**@@@@******************%@@@@************************************@@@&#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#*********,.....***********************@@%@***@@(@@&****@@@**@@(#@@@*******************/@@&@(**********************************#@@@&##@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/*********........***********************@@@@***@@@@@,*****(@@@/**(**********************@@@@@*******************&@/*************@@@@@@@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#********.......*********************,*****@@@@***@@%@@*****#@@@@**#&@@@@@@***************@@@@@*************#@@**%@@@@*****************&@@@@@&#@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@********,.....*******************...*..*****@@@@************@@#@@@@@@@&/*****@*************@@@#@****@@@@@****@@@/@@@@@@*********************&@@@@##@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@#@@@@********.....********************....*******************&@@@@@@@@**************************@@@@@***%@@@/(@***/@@*@@@**(@@***********************@@@@&#@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@(@@@@********....**********************....***************%@@@@@**@@@@&******/@%****@&*****@@@@@@@@@@@**#@@@*@@*@%*@@@/@@*********************.,********@@@@%#@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@#@@@@********...*************************,****************@@&*****@@@@@*****%@@@@@/**@@@***@&@@@*/@@(@/**@@@%@/*@@@#@@@*@************************..********@@@@##@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@%@@@********,..**************#@@&@@@@@(*********************@/****@@(@#****@@@@&@@********&@*@#**@@@/@**@@@@%*(@@@&*@@@@#*************************,..,******#@@@%#(@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@(@@@@********..,***********/@@@@@******@@@&***************#@@@@@**@@@@@***/@@@@*******@#&*(@@@&**@@@@@@**@@@**@@@@***@@@@****************************...******/@@@%#@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@##@@@/********..***********@@@@/*@@@*****@@@@*************@@@@/*@@*@@@@(***@@@&*******@@@/*@@@@*(@@@@(&/**@@%%@@@@************************************,...*******@@@%#@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@#@@@**********.**********@@@%**@@@@******@@@**/@@@/*****@@@*@**/@@@@@@********(@@@/*/@@@**%@@@@@@*@@&@******@@@@%**/%&@@@@#***************************....******#@@@##@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@#@@@********************@&@***@@@@*******@@&**@@&@*****@@@@@****@@@/@%*********@@@@((@@@****&@@@**@@@@*****@@*@@@@@@@@(****((*************************,....******@@@@##@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@##@@@%******************@@@***@@@@*******@@@&*@@@@****&@@@@@@****&@@@@********#@@@@@**&@%**********@@@@&@@@@@@@@****************/@@@****&@@%***********.....******%@@@##&@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@#@@@@**********,..*****@@#**@@@@%*******@@@**@@@@***@@&/@@@*****@@#@&**#***@@@&*@/****************&@@@@@/*@@@@(****************@@*#***@@@@%@**********....,******/@@@##(@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@#@@@%***********.*******%**@@@@*******@@@@*/@@@@*@@@(**@@@******@@@@***@@@@@&******************%@@&*/***@@@@@****************#@@@***@@@#*@@*********,....*******/@@@###@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@##@@@(********************@@@@@******@@@/***@@@@@@@****@@*******@@@@**@@@@***********************%@****(@@&@**@@@&**@@@******@@@%**@@@*@@*&@@%******....********@@@@###@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@##@@@(*******************@@@@/****#@@@&***********************@@@@(*/@@*@*******************(*****@%**@@@@@********@@@*****@@@@**@@@@@/*@@@@*******..,*********@@@&##(@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@##@@@@******************@@@@****@@@@*************************@@*@**@@@@@****************@@#@@@@@*/@#/@@@@****@#**/@&@****&@*@***@@@(**@@&@*******,***********@@@@###@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@##@@@@#****************/@@@&%@@@@@@*&@@@@&*****************@@@@@**@@@@(*****(********/@@@@*******@@@@@@@***@*@**#@@@***@@@@****@@/*@@@@*******,..**********&@@@####@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@##@@@@#******************#@@@@@@@#***@@&*****************@@@@%*@@&(@****@@@@@&****(@@@**********@@&%@/**&@*@***@@@*/@@@@******@@@@**********************@@@@#####@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@&##@@@@@******************@@@@&****%@@*****************&@@&@**@@#@@***@#@@*@@****@@@***********@@&@@***@@@/***(@@@@@@********************************#@@@@####%@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@###@@@@@&*************@@(@*******#**********@@@@****@@&@@**@@%@%**@@@%*@%@@@*@@@(******#@&**@@/@@***@@@*****************************************(@@@@####(@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%##@@@@@@@@********@@*#*****************@@@&*@@@**@@@@@*(@#*@**@@@@@@*@@@@/@&@******@@****(@@@/*********************************************@@@@@#####%@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##@@@@***(********@@(***************/@@@@@#**@@@**@*/@/*&@@@@**@@@&**@@/@*(@@%****@@@******@@@/************************@@@@*************@@@@@@%######@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#%@@@************%@@***************(@@@@@@**/@@(*(@@@@**@@@@@**@@/*/@@@%***%@@*%@@@***********************************/@@@******(&@@@@@@@@@######&@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##@@@(************@@&@********(@@@**@@@@@@&**@*@**#@@@@**&@@@&**@@/@@%#*******************************......,*********@@@@@@@@@@@@@@@@&########(@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#&@@@*************@@&/********@@@@**@@@@**#@@@@***(@@@@**(@@@(******************************,....***.....,*********@@@@@%#################&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@************#@@@********&@@@***@@@@**@@@%*****@@@&*****************************............,**************@@@@@@@####@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@************%@@@*******%@@@/****@@@@@@&******************.........,*********..........,**************%@@@@@@@######%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@@************/@@@******@@@@********************...*********.,**********************************#@@@@@@@@@########@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#@@@(************@@@%****@@@&*********,,,*******....************************************/%@@@@@@@@@@@@%##########%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@*************@@@/*@@@%******...........************@@@@@@@@@@@&@@@@@@@@@@@@@@@@@@@@@@@@@@##############(/@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@*************************.............**************(@@@@@@@@@@@@@@@@@@@@&%%######################@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#&@@@#**********************.............*************%@@@@####################################@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@**********************.......,**************/@@@@@####&@@@@&&&&###########&&&@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(#@@@@#**************************************(@@@@@#####@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##@@@@@@*******************************#@@@@@@######@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(##@@@@@@@@********************(@@@@@@@@######(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&##%@@@@@@@@@@@@@@@@@@@@@@@@@@@########&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@######%@@@@@@@&%############(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&########&&@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

contract TheOutsiderCollective is ERC1155, Ownable {
    // editing section starts below here
    string public name = "The Outsider Collective"; //name your NFT collection
    string public symbol = "TOSC"; //few letters to represent the symbol of your collection
    string private ipfsCID = "QmeYpe7bKThjV4LAyvJ6D2iFVNW3iUnFDJ6UDWSfMwA55p"; // ipfs metadata folder CID as the starting or hidden NFT
    uint256 public collectionTotal = 1; // total number of NFTs to start your collection
    uint256 public cost = 0.055 ether;  // price per mint
    uint256 public maxMintAmount = 2; // max amount a user other than owner can mint at in one session
    uint256 public maxBatchMintAmount = 2;  // max batch amount a user other than owner can mint at in one session
    uint256 public whitelisterLimit = 2; // max amount a whitelisted user can mint during presale 
    // editing section end

    bool public paused = false;
    bool public revealed = true;

    uint256 public ogCollectionTotal; // the original collection total
    mapping(uint => string) private tokenURI;
    mapping(uint256 => uint256) private currentSupply;
    mapping(uint256 => bool) private hasMaxSupply;
    mapping(uint256 => uint256) public maxSupply;
    mapping(uint256 => bool) private createdToken; // if true token has been minted at least one time or was updated into the collection total

    bool public onlyWhitelisted = true;
    address[] public whitelistedAddresses;
    mapping(address => uint256) public whitelisterMintedBalance;

    address payable public payments; // the payout address for the withdraw function
    address public ocTreasury = 0xCfe2f134C4d6914D1EfdA3ABa47564E35e6b7fe6;

    constructor() ERC1155(""){
        ogCollectionTotal = collectionTotal;
        maxSupply[1] = 333;
        hasMaxSupply[1] = true;
        createdToken[1] = true;
        currentSupply[1] = 1; //sets current supply to the amount minted on deploy
        _mint(ocTreasury, 1, 46, ""); //sends Owner, NFT id 1, amount 1
    }

    /**
     * @dev The contract developer's website.
     */
    function contractDev() public pure returns(string memory){
        string memory dev = unicode"🐸 HalfSuperShop.com 🐸";
        return dev;
    }

    /**
     * @dev Admin can set the PAUSE state.
     * true = closed to Admin Only
     * false = open for Presale or Public
     */
    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    /**
     * @dev Allows Owner, Whitelisters, and Public to Mint a single NFT.
     * Can only be called by the Public when onlyWhitelisted is false.
     */
    function mint(address _to, uint _id, uint _amount) public payable {
        require(!paused, "Contract Paused");
        require(canMintChecker(_id, _amount), "CANNOT MINT");

        if (msg.sender != owner()) {
            if (onlyWhitelisted == true) {
                require(isWhitelisted(msg.sender), "Not Whitelisted");
                uint256 whitelisterMintedCount = whitelisterMintedBalance[msg.sender];
                require(whitelisterMintedCount + _amount <= whitelisterLimit, "Exceeded Max Whitelist Mint Limit");
            }
            require(msg.value >= (_amount * cost), "Insufficient Funds");
        }

        whitelisterMintedBalance[msg.sender] += _amount;
        currentSupply[_id] += _amount;
        if (!exists(_id)) {
            createdToken[_id] = true;
            collectionTotal++;
        }
        _mint(_to, _id, _amount, "");
    }

    function canMintChecker(uint _id, uint _amount) private view returns(bool){
        if (hasMaxSupply[_id]) {
            if (_amount > 0 && _amount <= maxMintAmount && _id > 0 && _id <= collectionTotal && currentSupply[_id] + _amount <= maxSupply[_id]) {
                // CAN MINT
            }
            else {
                // CANNOT MINT 
                return false;
            }
        }
        else {
            if (_amount > 0 && _amount <= maxMintAmount && _id > 0 && _id <= collectionTotal) {
                // CAN MINT
            }
            else {
                // CANNOT MINT 
                return false;
            }
        }

        return true;
    }

    /**
     * @dev Allows Owner, Whitelisters, and Public to Mint multiple NFTs.
     * Can only be called by the Public when onlyWhitelisted is false.
     * Note: Only mint a max of {mintMaxAmount} or less NFT IDs with a totaling amount of {maxBatchMintAmount} at a time.
     * Example to Mint 3 of each Token IDs 1, 2, 3, 4:
     * _ids = [1,2,3,4]
     * _amounts = [3,3,3,3]
     * 4 seperate NFTs with a quantity of 3 each has a totaling amount of 12.
     */
    function mintBatch(address _to, uint[] memory _ids, uint[] memory _amounts) public payable {
        require(!paused, "Contract Paused");
        require(_ids.length <= maxMintAmount, "Batch Token IDs Limit Exceeded");
        require(_ids.length == _amounts.length, "IDs Array Not Equal To Amounts Array");
        require(canMintBatchChecker(_ids, _amounts), "CANNOT MINT BATCH");

        uint256 _totalBatchAmount;
        for (uint256 i = 0; i < _amounts.length; i++) {
            _totalBatchAmount += _amounts[i];
        }
        require(_totalBatchAmount <= maxBatchMintAmount, "Batch Amount Limit Exceeded");

        if (msg.sender != owner()) {
            if (onlyWhitelisted) {
                require(isWhitelisted(msg.sender), "Not Whitelisted");
                uint256 whitelisterMintedCount = whitelisterMintedBalance[msg.sender];
                require(whitelisterMintedCount + _totalBatchAmount <= whitelisterLimit, "Exceeded Max Whitelist Mint Limit");
            }
            require(msg.value >= (_totalBatchAmount * cost), "Insufficient Funds");
        }

        whitelisterMintedBalance[msg.sender] += _totalBatchAmount;

        for (uint256 k = 0; k < _ids.length; k++) {
            currentSupply[_ids[k]] += _amounts[k];
            uint256 _id = _ids[k];
            if (!exists(_id)) {
                createdToken[_id] = true;
                collectionTotal++;
            }
        }

        _mintBatch(_to, _ids, _amounts, "");
    }

    function canMintBatchChecker(uint[] memory _ids, uint[] memory _amounts)private view returns(bool){
        for (uint256 i = 0; i < _ids.length; i++) {
            uint256 _id = _ids[i];
            uint256 _amount = _amounts[i];
            if (hasMaxSupply[_id]) {
                if (_amount > 0 && _amount <= maxMintAmount && _id > 0 && _id <= collectionTotal && currentSupply[_id] + _amount <= maxSupply[_id]) {
                    // CAN MINT
                }
                else {
                    // CANNOT MINT
                    return false;
                }
            }
            else {
                if (_amount > 0 && _amount <= maxMintAmount && _id > 0 && _id <= collectionTotal) {
                    // CAN MINT
                }
                else {
                    // CANNOT MINT
                    return false;
                }
            }
        }

        return true;
    }

    /**
     * @dev Allows Admin to Mint a single NEW NFT.
     * Can only be called by the current owner.
     * Note: NEW NFT means above and beyond the original collection total.
     */
    function adminMint(address _to, uint _id, uint _amount) external onlyOwner {
        require(_id > ogCollectionTotal, "ID Must Not Be From Original Collection");
        if (!exists(_id)) {
            createdToken[_id] = true;
            collectionTotal++;
        }
        currentSupply[_id] += _amount;
        _mint(_to, _id, _amount, "");
    }

    /**
     * @dev Allows Admin to Mint multiple NEW NFTs.
     * Can only be called by the current owner.
     * Note: NEW NFT means above and beyond the original collection total.
     * Ideally it's best to only mint a max of 70 or less NFT IDs at a time.
     * Example to Mint 3 of each Token IDs 1, 2, 3, 4:
     * _ids = [1,2,3,4]
     * _amounts = [3,3,3,3]
     */
    function adminMintBatch(address _to, uint[] memory _ids, uint[] memory _amounts) external onlyOwner {
        require(!checkIfOriginal(_ids), "ID Must Not Be From Original Collection");
        for (uint256 i = 0; i < _ids.length; ++i) {
            uint256 _id = _ids[i];
            if (!exists(_id)) {
                createdToken[_id] = true;
                collectionTotal++;
            }
            currentSupply[_id] += _amounts[i];
        }
        _mintBatch(_to, _ids, _amounts, "");
    }

    /**
    * @dev Allows User to DESTROY a single token they own.
    */
    function burn(uint _id, uint _amount) external {
        currentSupply[_id] -= _amount;
        _burn(msg.sender, _id, _amount);
    }

    /**
    * @dev Allows User to DESTROY multiple tokens they own.
    */
    function burnBatch(uint[] memory _ids, uint[] memory _amounts) external {
        for (uint256 i = 0; i < _ids.length; ++i) {
            uint256 _id = _ids[i];
            currentSupply[_id] -= _amounts[i];
        }
        _burnBatch(msg.sender, _ids, _amounts);
    }

    /**
    * @dev Allows Admin to REVEAL the original collection.
    * Can only be called by the current owner once.
    * WARNING: Please ensure the CID is 100% correct before execution.
    */
    function reveal(string memory _uri) external onlyOwner {
        require(!revealed, "Already set to Revealed");
        ipfsCID = _uri;
        revealed = true;
    }

    /**
    * @dev Allows Admin to set the URI of a single token.
    * Note: Original Token URIs cannot be changed.
    *       Set _isIpfsCID to true if using only IPFS CID for the _uri.
    */
    function setURI(uint _id, string memory _uri, bool _isIpfsCID) external onlyOwner {
        require(_id > ogCollectionTotal, "ID Must Not Be From Original Collection");
        if (_isIpfsCID) {
            string memory _uriIPFS = string(abi.encodePacked(
                "ipfs://",
                _uri,
                "/",
                Strings.toString(_id),
                ".json"
            ));

            tokenURI[_id] = _uriIPFS;
            emit URI(_uriIPFS, _id);
        }
        else {
            tokenURI[_id] = _uri;
            emit URI(_uri, _id);
        }
    }

    /**
    * @dev Allows Admin to set the URI of multiple tokens.
    * Note: Original Token URIs cannot be changed.
    *       Set _isIpfsCID to true if using only IPFS CID for the _uri.
    */
    function setBatchURI(uint[] memory _ids, string memory _uri, bool _isIpfsCID) external onlyOwner {
        require(_ids.length > 1, "Must have at least 2 ids");
        require(!checkIfOriginal(_ids), "ID Must Not Be From Original Collection");

        for (uint256 i = 0; i < _ids.length; ++i) {
            uint256 _id = _ids[i];
            if (_isIpfsCID) {
                string memory _uriIPFS = string(abi.encodePacked(
                    "ipfs://",
                    _uri,
                    "/",
                    Strings.toString(_id),
                    ".json"
                ));

                tokenURI[_id] = _uriIPFS;
                emit URI(_uriIPFS, _id);
            }
            else {
                tokenURI[_id] = _uri;
                emit URI(_uri, _id);
            }
        }
    }

    function uri(uint256 _id) override public view returns(string memory){
        if (_id > 0 && _id <= ogCollectionTotal) {
            return (
                string(abi.encodePacked(
                    "ipfs://",
                    ipfsCID,
                    "/",
                    Strings.toString(_id),
                    ".json"
                )));
        }
        else {
            return tokenURI[_id];
        }
    }

    function checkIfOriginal(uint[] memory _ids) private view returns(bool){
        for (uint256 i = 0; i < _ids.length; ++i) {
            uint256 _id = _ids[i];
            if (_id <= ogCollectionTotal) {
                // original
            }
            else {
                // new
                return false;
            }
        }
        return true;
    }

    /**
    * @dev Total amount of tokens in with a given id.
    */
    function totalSupply(uint256 _id) public view returns(uint256) {
        return currentSupply[_id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 _id) public view returns(bool) {
        return createdToken[_id];
    }

    /**
     * @dev Admin can set a supply limit.
     * Note: If supply amount is set to 0 that will make the supply limitless.
     */
    function setMaxSupplies(uint[] memory _ids, uint[] memory _supplies) external onlyOwner {
        for (uint256 i = 0; i < _ids.length; i++) {
            uint256 _id = _ids[i];
            maxSupply[_id] += _supplies[i];
            if (_supplies[i] > 0) {
                // has a max limit
                hasMaxSupply[i] = true;
            }
            else {
                // infinite supply, because you wouldn't create a token max supply with an amount of zero 
                hasMaxSupply[i] = false;
            }
        }
    }

    /**
     * @dev Admin can update the collection total to allow minting the newly added NFTs.
     */
    function updateCollectionTotal(uint _amountToAdd) external onlyOwner {
        collectionTotal += _amountToAdd;
    }

    /**
     * @dev Check if address is whitelisted.
     */
    function isWhitelisted(address _user) public view returns(bool) {
        for (uint256 i = 0; i < whitelistedAddresses.length; i++) {
            if (whitelistedAddresses[i] == _user) {
                return true;
            }
        }
        return false;
    }

    /**
     * @dev Admin can set the amount of NFTs a user can mint in one session.
     */
    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

    /**
     * @dev Admin can set the max amount of NFTs a whitelister can mint during presale.
     */
    function setNftPerWhitelisterLimit(uint256 _limit) public onlyOwner {
        whitelisterLimit = _limit;
    }

    /**
     * @dev Admin can set the PRESALE state.
     * true = presale ongoing for whitelisters only
     * false = sale open to public
     */
    function setOnlyWhitelisted(bool _state) public onlyOwner {
        onlyWhitelisted = _state;
    }

    /**
     * @dev Admin can set the addresses as whitelisters.
     * Example: ["0xADDRESS1", "0xADDRESS2", "0xADDRESS3"]
     */
    function whitelistUsers(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses;
        whitelistedAddresses = _users;
    }

    /**
     * @dev Admin can set the new cost in WEI.
     * 1 ETH = 10^18 WEI
     * Use https://coinguides.org/ethereum-unit-converter-gwei-ether/ for conversions.
     */
    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    /**
     * @dev Admin can set the payout address.
     */
    function setPayoutAddress(address _address) external onlyOwner{
        payments = payable(_address);
    }

    /**
     * @dev Admin can pull funds to the payout address.
     */
    function withdraw() public payable onlyOwner {
        require(payments != 0x0000000000000000000000000000000000000000, "Payout Address Must Be Set First");
        (bool success, ) = payable(payments).call{ value: address(this).balance } ("");
        require(success);
    }

    /**
     * @dev Auto send funds to the payout address.
        Triggers only if funds were sent directly to this address.
     */
    receive() payable external {
        require(payments != 0x0000000000000000000000000000000000000000, "Payout Address Must Be Set First");
        uint256 payout = msg.value;
        payments.transfer(payout);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"adminMintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractDev","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ocTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogCollectionTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payments","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"bool","name":"_isIpfsCID","type":"bool"}],"name":"setBatchURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_supplies","type":"uint256[]"}],"name":"setMaxSupplies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerWhitelisterLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setPayoutAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"bool","name":"_isIpfsCID","type":"bool"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","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":"_id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountToAdd","type":"uint256"}],"name":"updateCollectionTotal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelisterLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisterMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052601760808190527f546865204f7574736964657220436f6c6c65637469766500000000000000000060a0908152620000409160049190620005eb565b5060408051808201909152600480825263544f534360e01b60209092019182526200006e91600591620005eb565b506040518060600160405280602e81526020016200449d602e913980516200009f91600691602090910190620005eb565b506001600781905566c3663566a5800060085560026009819055600a819055600b55600c805461ffff19166101001790556013805460ff19169091179055601780546001600160a01b03191673cfe2f134c4d6914d1efda3aba47564e35e6b7fe61790553480156200011057600080fd5b506040805160208101909152600081526200012b816200021c565b50620001373362000235565b600754600d556001600081815261014d7f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b552557f8c6065603763fec3f5742441d3833f3f43b982453612d76adb39a885e3006b5f805460ff1990811684179091557f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a3805490911683179055600f60209081527f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f83905560175460408051928301905291815262000216926001600160a01b039092169190602e9062000287565b620008d1565b805162000231906002906020840190620005eb565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416620002ed5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084015b60405180910390fd5b336000620002fb85620003a9565b905060006200030a85620003a9565b90506000868152602081815260408083206001600160a01b038b168452909152812080548792906200033e90849062000770565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4620003a083600089898989620003ff565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110620003e657620003e66200080f565b602090810291909101015292915050565b505050505050565b6200041e846001600160a01b0316620005dc60201b62001d421760201c565b15620003f75760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906200045a908990899088908890889060040162000714565b602060405180830381600087803b1580156200047557600080fd5b505af1925050508015620004a8575060408051601f3d908101601f19168201909252620004a59181019062000691565b60015b6200056957620004b762000825565b806308c379a01415620004f85750620004cf62000842565b80620004dc5750620004fa565b8060405162461bcd60e51b8152600401620002e491906200075b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401620002e4565b6001600160e01b0319811663f23a6e6160e01b14620003a05760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401620002e4565b6001600160a01b03163b151590565b828054620005f99062000797565b90600052602060002090601f0160209004810192826200061d576000855562000668565b82601f106200063857805160ff191683800117855562000668565b8280016001018555821562000668579182015b82811115620006685782518255916020019190600101906200064b565b50620006769291506200067a565b5090565b5b808211156200067657600081556001016200067b565b600060208284031215620006a457600080fd5b81516001600160e01b031981168114620006bd57600080fd5b9392505050565b6000815180845260005b81811015620006ec57602081850181015186830182015201620006ce565b81811115620006ff576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906200075090830184620006c4565b979650505050505050565b602081526000620006bd6020830184620006c4565b600082198211156200079257634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620007ac57607f821691505b60208210811415620007ce57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b03811182821017156200080857634e487b7160e01b600052604160045260246000fd5b6040525050565b634e487b7160e01b600052603260045260246000fd5b600060033d11156200083f5760046000803e5060005160e01c5b90565b600060443d1015620008515790565b6040516003193d81016004833e81513d6001600160401b0380831160248401831017156200088157505050505090565b82850191508151818111156200089a5750505050505090565b843d8701016020828501011115620008b55750505050505090565b620008c660208286010187620007d4565b509095945050505050565b613bbc80620008e16000396000f3fe6080604052600436106102cb5760003560e01c80635c975abb11610175578063a6d23e10116100dc578063d261b6e411610095578063ea7aef5c1161006f578063ea7aef5c14610979578063edec5f271461098f578063f242432a146109af578063f2fde38b146109cf57600080fd5b8063d261b6e4146108fd578063d81d0a151461091d578063e985e9c51461093057600080fd5b8063a6d23e1014610830578063b390c0ab14610850578063ba4e5c4914610870578063bb36ced014610890578063bd85b039146108b0578063cc979f27146108dd57600080fd5b80638674c6941161012e5780638674c69414610776578063869f7594146107965780638da5cb5b146107c357806395d89b41146107e15780639c70b512146107f6578063a22cb4651461081057600080fd5b80635c975abb146106ab578063644e54ab146106c5578063715018a6146106db5780637724bad8146106f05780637f00c7a61461073657806383ca4b6f1461075657600080fd5b806333ea51a81161023457806345697134116101ed5780634e1273f4116101c75780634e1273f41461060f5780634f558e791461063c578063518302271461066c57806351ede7911461068b57600080fd5b806345697134146105ac5780634c261247146105d95780634cafdb6d146105f957600080fd5b806333ea51a81461050e578063359cf6871461052e5780633af32abf146105445780633c952764146105645780633ccfd60b1461058457806344a0d68a1461058c57600080fd5b806313faede61161028657806313faede614610457578063156e29f61461046d5780631b1f47eb14610480578063239c70ae146104b85780632a9abcb9146104ce5780632eb2c2d6146104ee57600080fd5b80624a84cb14610370578062fdd58e1461039257806301ffc9a7146103c557806302329a29146103f557806306fdde03146104155780630e89341c1461043757600080fd5b3661036b576016546001600160a01b031661032d5760405162461bcd60e51b815260206004820181905260248201527f5061796f75742041646472657373204d7573742042652053657420466972737460448201526064015b60405180910390fd5b60165460405134916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610367573d6000803e3d6000fd5b5050005b600080fd5b34801561037c57600080fd5b5061039061038b366004613057565b6109ef565b005b34801561039e57600080fd5b506103b26103ad36600461302d565b610aa0565b6040519081526020015b60405180910390f35b3480156103d157600080fd5b506103e56103e03660046132a8565b610b34565b60405190151581526020016103bc565b34801561040157600080fd5b5061039061041036600461328d565b610b84565b34801561042157600080fd5b5061042a610b9f565b6040516103bc919061363b565b34801561044357600080fd5b5061042a610452366004613316565b610c2d565b34801561046357600080fd5b506103b260085481565b61039061047b366004613057565b610d1b565b34801561048c57600080fd5b506017546104a0906001600160a01b031681565b6040516001600160a01b0390911681526020016103bc565b3480156104c457600080fd5b506103b260095481565b3480156104da57600080fd5b506103906104e936600461332f565b610f40565b3480156104fa57600080fd5b50610390610509366004612e83565b611036565b34801561051a57600080fd5b50610390610529366004612e2e565b611082565b34801561053a57600080fd5b506103b2600d5481565b34801561055057600080fd5b506103e561055f366004612e2e565b6110ac565b34801561057057600080fd5b5061039061057f36600461328d565b611116565b610390611131565b34801561059857600080fd5b506103906105a7366004613316565b6111f4565b3480156105b857600080fd5b506103b26105c7366004612e2e565b60156020526000908152604090205481565b3480156105e557600080fd5b506103906105f43660046132e2565b611201565b34801561060557600080fd5b506103b260075481565b34801561061b57600080fd5b5061062f61062a3660046130fe565b611287565b6040516103bc91906135fa565b34801561064857600080fd5b506103e5610657366004613316565b60009081526012602052604090205460ff1690565b34801561067857600080fd5b50600c546103e590610100900460ff1681565b34801561069757600080fd5b506103906106a6366004613316565b6113b0565b3480156106b757600080fd5b50600c546103e59060ff1681565b3480156106d157600080fd5b506103b2600a5481565b3480156106e757600080fd5b506103906113bd565b3480156106fc57600080fd5b5060408051808201909152601b81527ff09f90b82048616c66537570657253686f702e636f6d20f09f90b80000000000602082015261042a565b34801561074257600080fd5b50610390610751366004613316565b6113d1565b34801561076257600080fd5b506103906107713660046131ce565b6113de565b34801561078257600080fd5b506103906107913660046131ce565b61146c565b3480156107a257600080fd5b506103b26107b1366004613316565b60116020526000908152604090205481565b3480156107cf57600080fd5b506003546001600160a01b03166104a0565b3480156107ed57600080fd5b5061042a61154b565b34801561080257600080fd5b506013546103e59060ff1681565b34801561081c57600080fd5b5061039061082b366004613003565b611558565b34801561083c57600080fd5b506016546104a0906001600160a01b031681565b34801561085c57600080fd5b5061039061086b36600461336d565b611563565b34801561087c57600080fd5b506104a061088b366004613316565b611592565b34801561089c57600080fd5b506103906108ab36600461321a565b6115bc565b3480156108bc57600080fd5b506103b26108cb366004613316565b6000908152600f602052604090205490565b3480156108e957600080fd5b506103906108f8366004612f90565b611745565b34801561090957600080fd5b50610390610918366004613316565b611857565b61039061092b366004612f90565b611879565b34801561093c57600080fd5b506103e561094b366004612e50565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561098557600080fd5b506103b2600b5481565b34801561099b57600080fd5b506103906109aa36600461308a565b611c67565b3480156109bb57600080fd5b506103906109ca366004612f2c565b611c87565b3480156109db57600080fd5b506103906109ea366004612e2e565b611ccc565b6109f7611d51565b600d548211610a185760405162461bcd60e51b8152600401610324906137fb565b60008281526012602052604090205460ff16610a5b576000828152601260205260408120805460ff191660011790556007805491610a5583613a24565b91905055505b6000828152600f602052604081208054839290610a7990849061392f565b92505081905550610a9b83838360405180602001604052806000815250611dab565b505050565b60006001600160a01b038316610b0b5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b6064820152608401610324565b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b1480610b6557506001600160e01b031982166303a24d0760e21b145b80610b2e57506301ffc9a760e01b6001600160e01b0319831614610b2e565b610b8c611d51565b600c805460ff1916911515919091179055565b60048054610bac906139bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd8906139bd565b8015610c255780601f10610bfa57610100808354040283529160200191610c25565b820191906000526020600020905b815481529060010190602001808311610c0857829003601f168201915b505050505081565b6060600082118015610c415750600d548211155b15610c78576006610c5183611e85565b604051602001610c62929190613473565b6040516020818303038152906040529050919050565b6000828152600e602052604090208054610c91906139bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbd906139bd565b8015610d0a5780601f10610cdf57610100808354040283529160200191610d0a565b820191906000526020600020905b815481529060010190602001808311610ced57829003601f168201915b50505050509050919050565b919050565b600c5460ff1615610d605760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd0814185d5cd959608a1b6044820152606401610324565b610d6a8282611f8a565b610da45760405162461bcd60e51b815260206004820152600b60248201526a10d0539393d5081352539560aa1b6044820152606401610324565b6003546001600160a01b03163314610e9b5760135460ff16151560011415610e4a57610dcf336110ac565b610e0d5760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606401610324565b33600090815260156020526040902054600b54610e2a838361392f565b1115610e485760405162461bcd60e51b8152600401610324906138cb565b505b600854610e57908261395b565b341015610e9b5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b6044820152606401610324565b3360009081526015602052604081208054839290610eba90849061392f565b90915550506000828152600f602052604081208054839290610edd90849061392f565b909155505060008281526012602052604090205460ff16610f25576000828152601260205260408120805460ff191660011790556007805491610f1f83613a24565b91905055505b610a9b83838360405180602001604052806000815250611dab565b610f48611d51565b600d548311610f695760405162461bcd60e51b8152600401610324906137fb565b8015610feb57600082610f7b85611e85565b604051602001610f8c929190613412565b60408051601f198184030181529181526000868152600e60209081529190208251929350610fbe929091840190612c13565b5083600080516020613b6783398151915282604051610fdd919061363b565b60405180910390a250505050565b6000838152600e60209081526040909120835161100a92850190612c13565b5082600080516020613b6783398151915283604051611029919061363b565b60405180910390a2505050565b6001600160a01b0385163314806110525750611052853361094b565b61106e5760405162461bcd60e51b81526004016103249061364e565b61107b8585858585612047565b5050505050565b61108a611d51565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6000805b60145481101561110d57826001600160a01b0316601482815481106110d7576110d7613a7f565b6000918252602090912001546001600160a01b031614156110fb5750600192915050565b8061110581613a24565b9150506110b0565b50600092915050565b61111e611d51565b6013805460ff1916911515919091179055565b611139611d51565b6016546001600160a01b03166111915760405162461bcd60e51b815260206004820181905260248201527f5061796f75742041646472657373204d757374204265205365742046697273746044820152606401610324565b6016546040516000916001600160a01b03169047908381818185875af1925050503d80600081146111de576040519150601f19603f3d011682016040523d82523d6000602084013e6111e3565b606091505b50509050806111f157600080fd5b50565b6111fc611d51565b600855565b611209611d51565b600c54610100900460ff16156112615760405162461bcd60e51b815260206004820152601760248201527f416c72656164792073657420746f2052657665616c65640000000000000000006044820152606401610324565b8051611274906006906020840190612c13565b5050600c805461ff001916610100179055565b606081518351146112ec5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610324565b600083516001600160401b0381111561130757611307613a95565b604051908082528060200260200182016040528015611330578160200160208202803683370190505b50905060005b84518110156113a85761137b85828151811061135457611354613a7f565b602002602001015185838151811061136e5761136e613a7f565b6020026020010151610aa0565b82828151811061138d5761138d613a7f565b60209081029190910101526113a181613a24565b9050611336565b509392505050565b6113b8611d51565b600b55565b6113c5611d51565b6113cf60006121e3565b565b6113d9611d51565b600955565b60005b825181101561145c5760008382815181106113fe576113fe613a7f565b6020026020010151905082828151811061141a5761141a613a7f565b6020026020010151600f60008381526020019081526020016000206000828254611444919061397a565b909155506114559150829050613a24565b90506113e1565b50611468338383612235565b5050565b611474611d51565b60005b8251811015610a9b57600083828151811061149457611494613a7f565b602002602001015190508282815181106114b0576114b0613a7f565b60200260200101516011600083815260200190815260200160002060008282546114da919061392f565b9250508190555060008383815181106114f5576114f5613a7f565b60200260200101511115611521576000828152601060205260409020805460ff19166001179055611538565b6000828152601060205260409020805460ff191690555b508061154381613a24565b915050611477565b60058054610bac906139bd565b6114683383836123bf565b6000828152600f60205260408120805483929061158190849061397a565b9091555061146890503383836124a0565b601481815481106115a257600080fd5b6000918252602090912001546001600160a01b0316905081565b6115c4611d51565b60018351116116155760405162461bcd60e51b815260206004820152601860248201527f4d7573742068617665206174206c6561737420322069647300000000000000006044820152606401610324565b61161e836125a4565b1561163b5760405162461bcd60e51b8152600401610324906137fb565b60005b835181101561173f57600084828151811061165b5761165b613a7f565b6020026020010151905082156116e75760008461167783611e85565b604051602001611688929190613412565b60408051601f198184030181529181526000848152600e602090815291902082519293506116ba929091840190612c13565b5081600080516020613b67833981519152826040516116d9919061363b565b60405180910390a25061172e565b6000818152600e60209081526040909120855161170692870190612c13565b5080600080516020613b6783398151915285604051611725919061363b565b60405180910390a25b5061173881613a24565b905061163e565b50505050565b61174d611d51565b611756826125a4565b156117735760405162461bcd60e51b8152600401610324906137fb565b60005b825181101561183b57600083828151811061179357611793613a7f565b602002602001015190506117b68160009081526012602052604090205460ff1690565b6117e7576000818152601260205260408120805460ff1916600117905560078054916117e183613a24565b91905055505b8282815181106117f9576117f9613a7f565b6020026020010151600f60008381526020019081526020016000206000828254611823919061392f565b909155506118349150829050613a24565b9050611776565b50610a9b838383604051806020016040528060008152506125f8565b61185f611d51565b8060076000828254611871919061392f565b909155505050565b600c5460ff16156118be5760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd0814185d5cd959608a1b6044820152606401610324565b600954825111156119115760405162461bcd60e51b815260206004820152601e60248201527f426174636820546f6b656e20494473204c696d697420457863656564656400006044820152606401610324565b805182511461196e5760405162461bcd60e51b8152602060048201526024808201527f494473204172726179204e6f7420457175616c20546f20416d6f756e747320416044820152637272617960e01b6064820152608401610324565b6119788282612743565b6119b85760405162461bcd60e51b8152602060048201526011602482015270086829c9c9ea8409a929ca8408482a8869607b1b6044820152606401610324565b6000805b82518110156119fe578281815181106119d7576119d7613a7f565b6020026020010151826119ea919061392f565b9150806119f681613a24565b9150506119bc565b50600a54811115611a515760405162461bcd60e51b815260206004820152601b60248201527f426174636820416d6f756e74204c696d697420457863656564656400000000006044820152606401610324565b6003546001600160a01b03163314611b435760135460ff1615611af257611a77336110ac565b611ab55760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606401610324565b33600090815260156020526040902054600b54611ad2838361392f565b1115611af05760405162461bcd60e51b8152600401610324906138cb565b505b600854611aff908261395b565b341015611b435760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b6044820152606401610324565b3360009081526015602052604081208054839290611b6290849061392f565b90915550600090505b8351811015611c4b57828181518110611b8657611b86613a7f565b6020026020010151600f6000868481518110611ba457611ba4613a7f565b602002602001015181526020019081526020016000206000828254611bc9919061392f565b925050819055506000848281518110611be457611be4613a7f565b60200260200101519050611c078160009081526012602052604090205460ff1690565b611c38576000818152601260205260408120805460ff191660011790556007805491611c3283613a24565b91905055505b5080611c4381613a24565b915050611b6b565b5061173f848484604051806020016040528060008152506125f8565b611c6f611d51565b611c7b60146000612c97565b610a9b60148383612cb5565b6001600160a01b038516331480611ca35750611ca3853361094b565b611cbf5760405162461bcd60e51b81526004016103249061364e565b61107b8585858585612869565b611cd4611d51565b6001600160a01b038116611d395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610324565b6111f1816121e3565b6001600160a01b03163b151590565b6003546001600160a01b031633146113cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610324565b6001600160a01b038416611dd15760405162461bcd60e51b81526004016103249061388a565b336000611ddd85612993565b90506000611dea85612993565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290611e1c90849061392f565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e7c836000898989896129de565b50505050505050565b606081611ea95750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ed35780611ebd81613a24565b9150611ecc9050600a83613947565b9150611ead565b6000816001600160401b03811115611eed57611eed613a95565b6040519080825280601f01601f191660200182016040528015611f17576020820181803683370190505b5090505b8415611f8257611f2c60018361397a565b9150611f39600a86613a3f565b611f4490603061392f565b60f81b818381518110611f5957611f59613a7f565b60200101906001600160f81b031916908160001a905350611f7b600a86613947565b9450611f1b565b949350505050565b60008281526010602052604081205460ff161561200f57600082118015611fb357506009548211155b8015611fbf5750600083115b8015611fcd57506007548311155b8015611ffd5750600083815260116020908152604080832054600f90925290912054611ffa90849061392f565b11155b156120075761203e565b506000610b2e565b60008211801561202157506009548211155b801561202d5750600083115b8015611ffd57506007548311612007575b50600192915050565b81518351146120685760405162461bcd60e51b815260040161032490613842565b6001600160a01b03841661208e5760405162461bcd60e51b815260040161032490613729565b3360005b84518110156121755760008582815181106120af576120af613a7f565b6020026020010151905060008583815181106120cd576120cd613a7f565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561211d5760405162461bcd60e51b8152600401610324906137b1565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061215a90849061392f565b925050819055505050508061216e90613a24565b9050612092565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516121c592919061360d565b60405180910390a46121db818787878787612b49565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03831661225b5760405162461bcd60e51b81526004016103249061376e565b805182511461227c5760405162461bcd60e51b815260040161032490613842565b604080516020810190915260009081905233905b83518110156123525760008482815181106122ad576122ad613a7f565b6020026020010151905060008483815181106122cb576122cb613a7f565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561231b5760405162461bcd60e51b8152600401610324906136e5565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061234a81613a24565b915050612290565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516123a392919061360d565b60405180910390a460408051602081019091526000905261173f565b816001600160a01b0316836001600160a01b031614156124335760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610324565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383166124c65760405162461bcd60e51b81526004016103249061376e565b3360006124d284612993565b905060006124df84612993565b60408051602080820183526000918290528882528181528282206001600160a01b038b168352905220549091508481101561252c5760405162461bcd60e51b8152600401610324906136e5565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052611e7c565b6000805b825181101561203e5760008382815181106125c5576125c5613a7f565b60200260200101519050600d5481116125dd576125e7565b5060009392505050565b506125f181613a24565b90506125a8565b6001600160a01b03841661261e5760405162461bcd60e51b81526004016103249061388a565b815183511461263f5760405162461bcd60e51b815260040161032490613842565b3360005b84518110156126db5783818151811061265e5761265e613a7f565b602002602001015160008087848151811061267b5761267b613a7f565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546126c3919061392f565b909155508190506126d381613a24565b915050612643565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161272c92919061360d565b60405180910390a461107b81600087878787612b49565b6000805b835181101561285f57600084828151811061276457612764613a7f565b60200260200101519050600084838151811061278257612782613a7f565b6020908102919091018101516000848152601090925260409091205490915060ff161561281b576000811180156127bb57506009548111155b80156127c75750600082115b80156127d557506007548211155b80156128055750600082815260116020908152604080832054600f9092529091205461280290839061392f565b11155b1561280f5761284a565b60009350505050610b2e565b60008111801561282d57506009548111155b80156128395750600082115b80156128055750600754821161280f575b5050808061285790613a24565b915050612747565b5060019392505050565b6001600160a01b03841661288f5760405162461bcd60e51b815260040161032490613729565b33600061289b85612993565b905060006128a885612993565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156128eb5760405162461bcd60e51b8152600401610324906137b1565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061292890849061392f565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612988848a8a8a8a8a6129de565b505050505050505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106129cd576129cd613a7f565b602090810291909101015292915050565b6001600160a01b0384163b156121db5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612a2290899089908890889088906004016135b5565b602060405180830381600087803b158015612a3c57600080fd5b505af1925050508015612a6c575060408051601f3d908101601f19168201909252612a69918101906132c5565b60015b612b1957612a78613aab565b806308c379a01415612ab25750612a8d613ac7565b80612a985750612ab4565b8060405162461bcd60e51b8152600401610324919061363b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610324565b6001600160e01b0319811663f23a6e6160e01b14611e7c5760405162461bcd60e51b81526004016103249061369d565b6001600160a01b0384163b156121db5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612b8d9089908990889088908890600401613557565b602060405180830381600087803b158015612ba757600080fd5b505af1925050508015612bd7575060408051601f3d908101601f19168201909252612bd4918101906132c5565b60015b612be357612a78613aab565b6001600160e01b0319811663bc197c8160e01b14611e7c5760405162461bcd60e51b81526004016103249061369d565b828054612c1f906139bd565b90600052602060002090601f016020900481019282612c415760008555612c87565b82601f10612c5a57805160ff1916838001178555612c87565b82800160010185558215612c87579182015b82811115612c87578251825591602001919060010190612c6c565b50612c93929150612d08565b5090565b50805460008255906000526020600020908101906111f19190612d08565b828054828255906000526020600020908101928215612c87579160200282015b82811115612c875781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612cd5565b5b80821115612c935760008155600101612d09565b80356001600160a01b0381168114610d1657600080fd5b600082601f830112612d4557600080fd5b81356020612d528261390c565b604051612d5f82826139f8565b8381528281019150858301600585901b87018401881015612d7f57600080fd5b60005b85811015612d9e57813584529284019290840190600101612d82565b5090979650505050505050565b80358015158114610d1657600080fd5b600082601f830112612dcc57600080fd5b81356001600160401b03811115612de557612de5613a95565b604051612dfc601f8301601f1916602001826139f8565b818152846020838601011115612e1157600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215612e4057600080fd5b612e4982612d1d565b9392505050565b60008060408385031215612e6357600080fd5b612e6c83612d1d565b9150612e7a60208401612d1d565b90509250929050565b600080600080600060a08688031215612e9b57600080fd5b612ea486612d1d565b9450612eb260208701612d1d565b935060408601356001600160401b0380821115612ece57600080fd5b612eda89838a01612d34565b94506060880135915080821115612ef057600080fd5b612efc89838a01612d34565b93506080880135915080821115612f1257600080fd5b50612f1f88828901612dbb565b9150509295509295909350565b600080600080600060a08688031215612f4457600080fd5b612f4d86612d1d565b9450612f5b60208701612d1d565b9350604086013592506060860135915060808601356001600160401b03811115612f8457600080fd5b612f1f88828901612dbb565b600080600060608486031215612fa557600080fd5b612fae84612d1d565b925060208401356001600160401b0380821115612fca57600080fd5b612fd687838801612d34565b93506040860135915080821115612fec57600080fd5b50612ff986828701612d34565b9150509250925092565b6000806040838503121561301657600080fd5b61301f83612d1d565b9150612e7a60208401612dab565b6000806040838503121561304057600080fd5b61304983612d1d565b946020939093013593505050565b60008060006060848603121561306c57600080fd5b61307584612d1d565b95602085013595506040909401359392505050565b6000806020838503121561309d57600080fd5b82356001600160401b03808211156130b457600080fd5b818501915085601f8301126130c857600080fd5b8135818111156130d757600080fd5b8660208260051b85010111156130ec57600080fd5b60209290920196919550909350505050565b6000806040838503121561311157600080fd5b82356001600160401b038082111561312857600080fd5b818501915085601f83011261313c57600080fd5b813560206131498261390c565b60405161315682826139f8565b8381528281019150858301600585901b870184018b101561317657600080fd5b600096505b848710156131a05761318c81612d1d565b83526001969096019591830191830161317b565b50965050860135925050808211156131b757600080fd5b506131c485828601612d34565b9150509250929050565b600080604083850312156131e157600080fd5b82356001600160401b03808211156131f857600080fd5b61320486838701612d34565b935060208501359150808211156131b757600080fd5b60008060006060848603121561322f57600080fd5b83356001600160401b038082111561324657600080fd5b61325287838801612d34565b9450602086013591508082111561326857600080fd5b5061327586828701612dbb565b92505061328460408501612dab565b90509250925092565b60006020828403121561329f57600080fd5b612e4982612dab565b6000602082840312156132ba57600080fd5b8135612e4981613b50565b6000602082840312156132d757600080fd5b8151612e4981613b50565b6000602082840312156132f457600080fd5b81356001600160401b0381111561330a57600080fd5b611f8284828501612dbb565b60006020828403121561332857600080fd5b5035919050565b60008060006060848603121561334457600080fd5b8335925060208401356001600160401b0381111561336157600080fd5b61327586828701612dbb565b6000806040838503121561338057600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156133bf578151875295820195908201906001016133a3565b509495945050505050565b600081518084526133e2816020860160208601613991565b601f01601f19169290920160200192915050565b60008151613408818560208601613991565b9290920192915050565b66697066733a2f2f60c81b815260008351613434816007850160208801613991565b602f60f81b6007918401918201528351613455816008840160208801613991565b64173539b7b760d91b60089290910191820152600d01949350505050565b66697066733a2f2f60c81b8152600060076000855481600182811c91508083168061349f57607f831692505b60208084108214156134bf57634e487b7160e01b86526022600452602486fd5b8180156134d357600181146134e857613519565b60ff1986168a890152848a0188019650613519565b60008c81526020902060005b8681101561350f5781548c82018b01529085019083016134f4565b505087858b010196505b50505050505061354d61353c61353683602f60f81b815260010190565b876133f6565b64173539b7b760d91b815260050190565b9695505050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906135839083018661338f565b8281036060840152613595818661338f565b905082810360808401526135a981856133ca565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906135ef908301846133ca565b979650505050505050565b602081526000612e49602083018461338f565b604081526000613620604083018561338f565b8281036020840152613632818561338f565b95945050505050565b602081526000612e4960208301846133ca565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526027908201527f4944204d757374204e6f742042652046726f6d204f726967696e616c20436f6c6040820152663632b1ba34b7b760c91b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526021908201527f4578636565646564204d61782057686974656c697374204d696e74204c696d696040820152601d60fa1b606082015260800190565b60006001600160401b0382111561392557613925613a95565b5060051b60200190565b6000821982111561394257613942613a53565b500190565b60008261395657613956613a69565b500490565b600081600019048311821515161561397557613975613a53565b500290565b60008282101561398c5761398c613a53565b500390565b60005b838110156139ac578181015183820152602001613994565b8381111561173f5750506000910152565b600181811c908216806139d157607f821691505b602082108114156139f257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715613a1d57613a1d613a95565b6040525050565b6000600019821415613a3857613a38613a53565b5060010190565b600082613a4e57613a4e613a69565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115613ac45760046000803e5060005160e01c5b90565b600060443d1015613ad55790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613b0457505050505090565b8285019150815181811115613b1c5750505050505090565b843d8701016020828501011115613b365750505050505090565b613b45602082860101876139f8565b509095945050505050565b6001600160e01b0319811681146111f157600080fdfe6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529ba2646970667358221220897ef528f26c76923c9439cc939bce8c4211498ef891f3e137d1d91ecc60d69264736f6c63430008070033516d6559706537624b54686a56344c4179764a3644326946564e573369556e46444a3655445753664d7741353570

Deployed Bytecode

0x6080604052600436106102cb5760003560e01c80635c975abb11610175578063a6d23e10116100dc578063d261b6e411610095578063ea7aef5c1161006f578063ea7aef5c14610979578063edec5f271461098f578063f242432a146109af578063f2fde38b146109cf57600080fd5b8063d261b6e4146108fd578063d81d0a151461091d578063e985e9c51461093057600080fd5b8063a6d23e1014610830578063b390c0ab14610850578063ba4e5c4914610870578063bb36ced014610890578063bd85b039146108b0578063cc979f27146108dd57600080fd5b80638674c6941161012e5780638674c69414610776578063869f7594146107965780638da5cb5b146107c357806395d89b41146107e15780639c70b512146107f6578063a22cb4651461081057600080fd5b80635c975abb146106ab578063644e54ab146106c5578063715018a6146106db5780637724bad8146106f05780637f00c7a61461073657806383ca4b6f1461075657600080fd5b806333ea51a81161023457806345697134116101ed5780634e1273f4116101c75780634e1273f41461060f5780634f558e791461063c578063518302271461066c57806351ede7911461068b57600080fd5b806345697134146105ac5780634c261247146105d95780634cafdb6d146105f957600080fd5b806333ea51a81461050e578063359cf6871461052e5780633af32abf146105445780633c952764146105645780633ccfd60b1461058457806344a0d68a1461058c57600080fd5b806313faede61161028657806313faede614610457578063156e29f61461046d5780631b1f47eb14610480578063239c70ae146104b85780632a9abcb9146104ce5780632eb2c2d6146104ee57600080fd5b80624a84cb14610370578062fdd58e1461039257806301ffc9a7146103c557806302329a29146103f557806306fdde03146104155780630e89341c1461043757600080fd5b3661036b576016546001600160a01b031661032d5760405162461bcd60e51b815260206004820181905260248201527f5061796f75742041646472657373204d7573742042652053657420466972737460448201526064015b60405180910390fd5b60165460405134916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610367573d6000803e3d6000fd5b5050005b600080fd5b34801561037c57600080fd5b5061039061038b366004613057565b6109ef565b005b34801561039e57600080fd5b506103b26103ad36600461302d565b610aa0565b6040519081526020015b60405180910390f35b3480156103d157600080fd5b506103e56103e03660046132a8565b610b34565b60405190151581526020016103bc565b34801561040157600080fd5b5061039061041036600461328d565b610b84565b34801561042157600080fd5b5061042a610b9f565b6040516103bc919061363b565b34801561044357600080fd5b5061042a610452366004613316565b610c2d565b34801561046357600080fd5b506103b260085481565b61039061047b366004613057565b610d1b565b34801561048c57600080fd5b506017546104a0906001600160a01b031681565b6040516001600160a01b0390911681526020016103bc565b3480156104c457600080fd5b506103b260095481565b3480156104da57600080fd5b506103906104e936600461332f565b610f40565b3480156104fa57600080fd5b50610390610509366004612e83565b611036565b34801561051a57600080fd5b50610390610529366004612e2e565b611082565b34801561053a57600080fd5b506103b2600d5481565b34801561055057600080fd5b506103e561055f366004612e2e565b6110ac565b34801561057057600080fd5b5061039061057f36600461328d565b611116565b610390611131565b34801561059857600080fd5b506103906105a7366004613316565b6111f4565b3480156105b857600080fd5b506103b26105c7366004612e2e565b60156020526000908152604090205481565b3480156105e557600080fd5b506103906105f43660046132e2565b611201565b34801561060557600080fd5b506103b260075481565b34801561061b57600080fd5b5061062f61062a3660046130fe565b611287565b6040516103bc91906135fa565b34801561064857600080fd5b506103e5610657366004613316565b60009081526012602052604090205460ff1690565b34801561067857600080fd5b50600c546103e590610100900460ff1681565b34801561069757600080fd5b506103906106a6366004613316565b6113b0565b3480156106b757600080fd5b50600c546103e59060ff1681565b3480156106d157600080fd5b506103b2600a5481565b3480156106e757600080fd5b506103906113bd565b3480156106fc57600080fd5b5060408051808201909152601b81527ff09f90b82048616c66537570657253686f702e636f6d20f09f90b80000000000602082015261042a565b34801561074257600080fd5b50610390610751366004613316565b6113d1565b34801561076257600080fd5b506103906107713660046131ce565b6113de565b34801561078257600080fd5b506103906107913660046131ce565b61146c565b3480156107a257600080fd5b506103b26107b1366004613316565b60116020526000908152604090205481565b3480156107cf57600080fd5b506003546001600160a01b03166104a0565b3480156107ed57600080fd5b5061042a61154b565b34801561080257600080fd5b506013546103e59060ff1681565b34801561081c57600080fd5b5061039061082b366004613003565b611558565b34801561083c57600080fd5b506016546104a0906001600160a01b031681565b34801561085c57600080fd5b5061039061086b36600461336d565b611563565b34801561087c57600080fd5b506104a061088b366004613316565b611592565b34801561089c57600080fd5b506103906108ab36600461321a565b6115bc565b3480156108bc57600080fd5b506103b26108cb366004613316565b6000908152600f602052604090205490565b3480156108e957600080fd5b506103906108f8366004612f90565b611745565b34801561090957600080fd5b50610390610918366004613316565b611857565b61039061092b366004612f90565b611879565b34801561093c57600080fd5b506103e561094b366004612e50565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561098557600080fd5b506103b2600b5481565b34801561099b57600080fd5b506103906109aa36600461308a565b611c67565b3480156109bb57600080fd5b506103906109ca366004612f2c565b611c87565b3480156109db57600080fd5b506103906109ea366004612e2e565b611ccc565b6109f7611d51565b600d548211610a185760405162461bcd60e51b8152600401610324906137fb565b60008281526012602052604090205460ff16610a5b576000828152601260205260408120805460ff191660011790556007805491610a5583613a24565b91905055505b6000828152600f602052604081208054839290610a7990849061392f565b92505081905550610a9b83838360405180602001604052806000815250611dab565b505050565b60006001600160a01b038316610b0b5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b6064820152608401610324565b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b1480610b6557506001600160e01b031982166303a24d0760e21b145b80610b2e57506301ffc9a760e01b6001600160e01b0319831614610b2e565b610b8c611d51565b600c805460ff1916911515919091179055565b60048054610bac906139bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd8906139bd565b8015610c255780601f10610bfa57610100808354040283529160200191610c25565b820191906000526020600020905b815481529060010190602001808311610c0857829003601f168201915b505050505081565b6060600082118015610c415750600d548211155b15610c78576006610c5183611e85565b604051602001610c62929190613473565b6040516020818303038152906040529050919050565b6000828152600e602052604090208054610c91906139bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbd906139bd565b8015610d0a5780601f10610cdf57610100808354040283529160200191610d0a565b820191906000526020600020905b815481529060010190602001808311610ced57829003601f168201915b50505050509050919050565b919050565b600c5460ff1615610d605760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd0814185d5cd959608a1b6044820152606401610324565b610d6a8282611f8a565b610da45760405162461bcd60e51b815260206004820152600b60248201526a10d0539393d5081352539560aa1b6044820152606401610324565b6003546001600160a01b03163314610e9b5760135460ff16151560011415610e4a57610dcf336110ac565b610e0d5760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606401610324565b33600090815260156020526040902054600b54610e2a838361392f565b1115610e485760405162461bcd60e51b8152600401610324906138cb565b505b600854610e57908261395b565b341015610e9b5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b6044820152606401610324565b3360009081526015602052604081208054839290610eba90849061392f565b90915550506000828152600f602052604081208054839290610edd90849061392f565b909155505060008281526012602052604090205460ff16610f25576000828152601260205260408120805460ff191660011790556007805491610f1f83613a24565b91905055505b610a9b83838360405180602001604052806000815250611dab565b610f48611d51565b600d548311610f695760405162461bcd60e51b8152600401610324906137fb565b8015610feb57600082610f7b85611e85565b604051602001610f8c929190613412565b60408051601f198184030181529181526000868152600e60209081529190208251929350610fbe929091840190612c13565b5083600080516020613b6783398151915282604051610fdd919061363b565b60405180910390a250505050565b6000838152600e60209081526040909120835161100a92850190612c13565b5082600080516020613b6783398151915283604051611029919061363b565b60405180910390a2505050565b6001600160a01b0385163314806110525750611052853361094b565b61106e5760405162461bcd60e51b81526004016103249061364e565b61107b8585858585612047565b5050505050565b61108a611d51565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6000805b60145481101561110d57826001600160a01b0316601482815481106110d7576110d7613a7f565b6000918252602090912001546001600160a01b031614156110fb5750600192915050565b8061110581613a24565b9150506110b0565b50600092915050565b61111e611d51565b6013805460ff1916911515919091179055565b611139611d51565b6016546001600160a01b03166111915760405162461bcd60e51b815260206004820181905260248201527f5061796f75742041646472657373204d757374204265205365742046697273746044820152606401610324565b6016546040516000916001600160a01b03169047908381818185875af1925050503d80600081146111de576040519150601f19603f3d011682016040523d82523d6000602084013e6111e3565b606091505b50509050806111f157600080fd5b50565b6111fc611d51565b600855565b611209611d51565b600c54610100900460ff16156112615760405162461bcd60e51b815260206004820152601760248201527f416c72656164792073657420746f2052657665616c65640000000000000000006044820152606401610324565b8051611274906006906020840190612c13565b5050600c805461ff001916610100179055565b606081518351146112ec5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610324565b600083516001600160401b0381111561130757611307613a95565b604051908082528060200260200182016040528015611330578160200160208202803683370190505b50905060005b84518110156113a85761137b85828151811061135457611354613a7f565b602002602001015185838151811061136e5761136e613a7f565b6020026020010151610aa0565b82828151811061138d5761138d613a7f565b60209081029190910101526113a181613a24565b9050611336565b509392505050565b6113b8611d51565b600b55565b6113c5611d51565b6113cf60006121e3565b565b6113d9611d51565b600955565b60005b825181101561145c5760008382815181106113fe576113fe613a7f565b6020026020010151905082828151811061141a5761141a613a7f565b6020026020010151600f60008381526020019081526020016000206000828254611444919061397a565b909155506114559150829050613a24565b90506113e1565b50611468338383612235565b5050565b611474611d51565b60005b8251811015610a9b57600083828151811061149457611494613a7f565b602002602001015190508282815181106114b0576114b0613a7f565b60200260200101516011600083815260200190815260200160002060008282546114da919061392f565b9250508190555060008383815181106114f5576114f5613a7f565b60200260200101511115611521576000828152601060205260409020805460ff19166001179055611538565b6000828152601060205260409020805460ff191690555b508061154381613a24565b915050611477565b60058054610bac906139bd565b6114683383836123bf565b6000828152600f60205260408120805483929061158190849061397a565b9091555061146890503383836124a0565b601481815481106115a257600080fd5b6000918252602090912001546001600160a01b0316905081565b6115c4611d51565b60018351116116155760405162461bcd60e51b815260206004820152601860248201527f4d7573742068617665206174206c6561737420322069647300000000000000006044820152606401610324565b61161e836125a4565b1561163b5760405162461bcd60e51b8152600401610324906137fb565b60005b835181101561173f57600084828151811061165b5761165b613a7f565b6020026020010151905082156116e75760008461167783611e85565b604051602001611688929190613412565b60408051601f198184030181529181526000848152600e602090815291902082519293506116ba929091840190612c13565b5081600080516020613b67833981519152826040516116d9919061363b565b60405180910390a25061172e565b6000818152600e60209081526040909120855161170692870190612c13565b5080600080516020613b6783398151915285604051611725919061363b565b60405180910390a25b5061173881613a24565b905061163e565b50505050565b61174d611d51565b611756826125a4565b156117735760405162461bcd60e51b8152600401610324906137fb565b60005b825181101561183b57600083828151811061179357611793613a7f565b602002602001015190506117b68160009081526012602052604090205460ff1690565b6117e7576000818152601260205260408120805460ff1916600117905560078054916117e183613a24565b91905055505b8282815181106117f9576117f9613a7f565b6020026020010151600f60008381526020019081526020016000206000828254611823919061392f565b909155506118349150829050613a24565b9050611776565b50610a9b838383604051806020016040528060008152506125f8565b61185f611d51565b8060076000828254611871919061392f565b909155505050565b600c5460ff16156118be5760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd0814185d5cd959608a1b6044820152606401610324565b600954825111156119115760405162461bcd60e51b815260206004820152601e60248201527f426174636820546f6b656e20494473204c696d697420457863656564656400006044820152606401610324565b805182511461196e5760405162461bcd60e51b8152602060048201526024808201527f494473204172726179204e6f7420457175616c20546f20416d6f756e747320416044820152637272617960e01b6064820152608401610324565b6119788282612743565b6119b85760405162461bcd60e51b8152602060048201526011602482015270086829c9c9ea8409a929ca8408482a8869607b1b6044820152606401610324565b6000805b82518110156119fe578281815181106119d7576119d7613a7f565b6020026020010151826119ea919061392f565b9150806119f681613a24565b9150506119bc565b50600a54811115611a515760405162461bcd60e51b815260206004820152601b60248201527f426174636820416d6f756e74204c696d697420457863656564656400000000006044820152606401610324565b6003546001600160a01b03163314611b435760135460ff1615611af257611a77336110ac565b611ab55760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606401610324565b33600090815260156020526040902054600b54611ad2838361392f565b1115611af05760405162461bcd60e51b8152600401610324906138cb565b505b600854611aff908261395b565b341015611b435760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b6044820152606401610324565b3360009081526015602052604081208054839290611b6290849061392f565b90915550600090505b8351811015611c4b57828181518110611b8657611b86613a7f565b6020026020010151600f6000868481518110611ba457611ba4613a7f565b602002602001015181526020019081526020016000206000828254611bc9919061392f565b925050819055506000848281518110611be457611be4613a7f565b60200260200101519050611c078160009081526012602052604090205460ff1690565b611c38576000818152601260205260408120805460ff191660011790556007805491611c3283613a24565b91905055505b5080611c4381613a24565b915050611b6b565b5061173f848484604051806020016040528060008152506125f8565b611c6f611d51565b611c7b60146000612c97565b610a9b60148383612cb5565b6001600160a01b038516331480611ca35750611ca3853361094b565b611cbf5760405162461bcd60e51b81526004016103249061364e565b61107b8585858585612869565b611cd4611d51565b6001600160a01b038116611d395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610324565b6111f1816121e3565b6001600160a01b03163b151590565b6003546001600160a01b031633146113cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610324565b6001600160a01b038416611dd15760405162461bcd60e51b81526004016103249061388a565b336000611ddd85612993565b90506000611dea85612993565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290611e1c90849061392f565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e7c836000898989896129de565b50505050505050565b606081611ea95750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ed35780611ebd81613a24565b9150611ecc9050600a83613947565b9150611ead565b6000816001600160401b03811115611eed57611eed613a95565b6040519080825280601f01601f191660200182016040528015611f17576020820181803683370190505b5090505b8415611f8257611f2c60018361397a565b9150611f39600a86613a3f565b611f4490603061392f565b60f81b818381518110611f5957611f59613a7f565b60200101906001600160f81b031916908160001a905350611f7b600a86613947565b9450611f1b565b949350505050565b60008281526010602052604081205460ff161561200f57600082118015611fb357506009548211155b8015611fbf5750600083115b8015611fcd57506007548311155b8015611ffd5750600083815260116020908152604080832054600f90925290912054611ffa90849061392f565b11155b156120075761203e565b506000610b2e565b60008211801561202157506009548211155b801561202d5750600083115b8015611ffd57506007548311612007575b50600192915050565b81518351146120685760405162461bcd60e51b815260040161032490613842565b6001600160a01b03841661208e5760405162461bcd60e51b815260040161032490613729565b3360005b84518110156121755760008582815181106120af576120af613a7f565b6020026020010151905060008583815181106120cd576120cd613a7f565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561211d5760405162461bcd60e51b8152600401610324906137b1565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061215a90849061392f565b925050819055505050508061216e90613a24565b9050612092565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516121c592919061360d565b60405180910390a46121db818787878787612b49565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03831661225b5760405162461bcd60e51b81526004016103249061376e565b805182511461227c5760405162461bcd60e51b815260040161032490613842565b604080516020810190915260009081905233905b83518110156123525760008482815181106122ad576122ad613a7f565b6020026020010151905060008483815181106122cb576122cb613a7f565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561231b5760405162461bcd60e51b8152600401610324906136e5565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061234a81613a24565b915050612290565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516123a392919061360d565b60405180910390a460408051602081019091526000905261173f565b816001600160a01b0316836001600160a01b031614156124335760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610324565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383166124c65760405162461bcd60e51b81526004016103249061376e565b3360006124d284612993565b905060006124df84612993565b60408051602080820183526000918290528882528181528282206001600160a01b038b168352905220549091508481101561252c5760405162461bcd60e51b8152600401610324906136e5565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052611e7c565b6000805b825181101561203e5760008382815181106125c5576125c5613a7f565b60200260200101519050600d5481116125dd576125e7565b5060009392505050565b506125f181613a24565b90506125a8565b6001600160a01b03841661261e5760405162461bcd60e51b81526004016103249061388a565b815183511461263f5760405162461bcd60e51b815260040161032490613842565b3360005b84518110156126db5783818151811061265e5761265e613a7f565b602002602001015160008087848151811061267b5761267b613a7f565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546126c3919061392f565b909155508190506126d381613a24565b915050612643565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161272c92919061360d565b60405180910390a461107b81600087878787612b49565b6000805b835181101561285f57600084828151811061276457612764613a7f565b60200260200101519050600084838151811061278257612782613a7f565b6020908102919091018101516000848152601090925260409091205490915060ff161561281b576000811180156127bb57506009548111155b80156127c75750600082115b80156127d557506007548211155b80156128055750600082815260116020908152604080832054600f9092529091205461280290839061392f565b11155b1561280f5761284a565b60009350505050610b2e565b60008111801561282d57506009548111155b80156128395750600082115b80156128055750600754821161280f575b5050808061285790613a24565b915050612747565b5060019392505050565b6001600160a01b03841661288f5760405162461bcd60e51b815260040161032490613729565b33600061289b85612993565b905060006128a885612993565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156128eb5760405162461bcd60e51b8152600401610324906137b1565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061292890849061392f565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612988848a8a8a8a8a6129de565b505050505050505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106129cd576129cd613a7f565b602090810291909101015292915050565b6001600160a01b0384163b156121db5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612a2290899089908890889088906004016135b5565b602060405180830381600087803b158015612a3c57600080fd5b505af1925050508015612a6c575060408051601f3d908101601f19168201909252612a69918101906132c5565b60015b612b1957612a78613aab565b806308c379a01415612ab25750612a8d613ac7565b80612a985750612ab4565b8060405162461bcd60e51b8152600401610324919061363b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610324565b6001600160e01b0319811663f23a6e6160e01b14611e7c5760405162461bcd60e51b81526004016103249061369d565b6001600160a01b0384163b156121db5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612b8d9089908990889088908890600401613557565b602060405180830381600087803b158015612ba757600080fd5b505af1925050508015612bd7575060408051601f3d908101601f19168201909252612bd4918101906132c5565b60015b612be357612a78613aab565b6001600160e01b0319811663bc197c8160e01b14611e7c5760405162461bcd60e51b81526004016103249061369d565b828054612c1f906139bd565b90600052602060002090601f016020900481019282612c415760008555612c87565b82601f10612c5a57805160ff1916838001178555612c87565b82800160010185558215612c87579182015b82811115612c87578251825591602001919060010190612c6c565b50612c93929150612d08565b5090565b50805460008255906000526020600020908101906111f19190612d08565b828054828255906000526020600020908101928215612c87579160200282015b82811115612c875781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612cd5565b5b80821115612c935760008155600101612d09565b80356001600160a01b0381168114610d1657600080fd5b600082601f830112612d4557600080fd5b81356020612d528261390c565b604051612d5f82826139f8565b8381528281019150858301600585901b87018401881015612d7f57600080fd5b60005b85811015612d9e57813584529284019290840190600101612d82565b5090979650505050505050565b80358015158114610d1657600080fd5b600082601f830112612dcc57600080fd5b81356001600160401b03811115612de557612de5613a95565b604051612dfc601f8301601f1916602001826139f8565b818152846020838601011115612e1157600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215612e4057600080fd5b612e4982612d1d565b9392505050565b60008060408385031215612e6357600080fd5b612e6c83612d1d565b9150612e7a60208401612d1d565b90509250929050565b600080600080600060a08688031215612e9b57600080fd5b612ea486612d1d565b9450612eb260208701612d1d565b935060408601356001600160401b0380821115612ece57600080fd5b612eda89838a01612d34565b94506060880135915080821115612ef057600080fd5b612efc89838a01612d34565b93506080880135915080821115612f1257600080fd5b50612f1f88828901612dbb565b9150509295509295909350565b600080600080600060a08688031215612f4457600080fd5b612f4d86612d1d565b9450612f5b60208701612d1d565b9350604086013592506060860135915060808601356001600160401b03811115612f8457600080fd5b612f1f88828901612dbb565b600080600060608486031215612fa557600080fd5b612fae84612d1d565b925060208401356001600160401b0380821115612fca57600080fd5b612fd687838801612d34565b93506040860135915080821115612fec57600080fd5b50612ff986828701612d34565b9150509250925092565b6000806040838503121561301657600080fd5b61301f83612d1d565b9150612e7a60208401612dab565b6000806040838503121561304057600080fd5b61304983612d1d565b946020939093013593505050565b60008060006060848603121561306c57600080fd5b61307584612d1d565b95602085013595506040909401359392505050565b6000806020838503121561309d57600080fd5b82356001600160401b03808211156130b457600080fd5b818501915085601f8301126130c857600080fd5b8135818111156130d757600080fd5b8660208260051b85010111156130ec57600080fd5b60209290920196919550909350505050565b6000806040838503121561311157600080fd5b82356001600160401b038082111561312857600080fd5b818501915085601f83011261313c57600080fd5b813560206131498261390c565b60405161315682826139f8565b8381528281019150858301600585901b870184018b101561317657600080fd5b600096505b848710156131a05761318c81612d1d565b83526001969096019591830191830161317b565b50965050860135925050808211156131b757600080fd5b506131c485828601612d34565b9150509250929050565b600080604083850312156131e157600080fd5b82356001600160401b03808211156131f857600080fd5b61320486838701612d34565b935060208501359150808211156131b757600080fd5b60008060006060848603121561322f57600080fd5b83356001600160401b038082111561324657600080fd5b61325287838801612d34565b9450602086013591508082111561326857600080fd5b5061327586828701612dbb565b92505061328460408501612dab565b90509250925092565b60006020828403121561329f57600080fd5b612e4982612dab565b6000602082840312156132ba57600080fd5b8135612e4981613b50565b6000602082840312156132d757600080fd5b8151612e4981613b50565b6000602082840312156132f457600080fd5b81356001600160401b0381111561330a57600080fd5b611f8284828501612dbb565b60006020828403121561332857600080fd5b5035919050565b60008060006060848603121561334457600080fd5b8335925060208401356001600160401b0381111561336157600080fd5b61327586828701612dbb565b6000806040838503121561338057600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156133bf578151875295820195908201906001016133a3565b509495945050505050565b600081518084526133e2816020860160208601613991565b601f01601f19169290920160200192915050565b60008151613408818560208601613991565b9290920192915050565b66697066733a2f2f60c81b815260008351613434816007850160208801613991565b602f60f81b6007918401918201528351613455816008840160208801613991565b64173539b7b760d91b60089290910191820152600d01949350505050565b66697066733a2f2f60c81b8152600060076000855481600182811c91508083168061349f57607f831692505b60208084108214156134bf57634e487b7160e01b86526022600452602486fd5b8180156134d357600181146134e857613519565b60ff1986168a890152848a0188019650613519565b60008c81526020902060005b8681101561350f5781548c82018b01529085019083016134f4565b505087858b010196505b50505050505061354d61353c61353683602f60f81b815260010190565b876133f6565b64173539b7b760d91b815260050190565b9695505050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906135839083018661338f565b8281036060840152613595818661338f565b905082810360808401526135a981856133ca565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906135ef908301846133ca565b979650505050505050565b602081526000612e49602083018461338f565b604081526000613620604083018561338f565b8281036020840152613632818561338f565b95945050505050565b602081526000612e4960208301846133ca565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526027908201527f4944204d757374204e6f742042652046726f6d204f726967696e616c20436f6c6040820152663632b1ba34b7b760c91b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526021908201527f4578636565646564204d61782057686974656c697374204d696e74204c696d696040820152601d60fa1b606082015260800190565b60006001600160401b0382111561392557613925613a95565b5060051b60200190565b6000821982111561394257613942613a53565b500190565b60008261395657613956613a69565b500490565b600081600019048311821515161561397557613975613a53565b500290565b60008282101561398c5761398c613a53565b500390565b60005b838110156139ac578181015183820152602001613994565b8381111561173f5750506000910152565b600181811c908216806139d157607f821691505b602082108114156139f257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715613a1d57613a1d613a95565b6040525050565b6000600019821415613a3857613a38613a53565b5060010190565b600082613a4e57613a4e613a69565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115613ac45760046000803e5060005160e01c5b90565b600060443d1015613ad55790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613b0457505050505090565b8285019150815181811115613b1c5750505050505090565b843d8701016020828501011115613b365750505050505090565b613b45602082860101876139f8565b509095945050505050565b6001600160e01b0319811681146111f157600080fdfe6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529ba2646970667358221220897ef528f26c76923c9439cc939bce8c4211498ef891f3e137d1d91ecc60d69264736f6c63430008070033

Deployed Bytecode Sourcemap

59494:16254:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75571:8;;-1:-1:-1;;;;;75571:8:0;75563:99;;;;-1:-1:-1;;;75563:99:0;;21169:2:1;75563:99:0;;;21151:21:1;;;21188:18;;;21181:30;21247:34;21227:18;;;21220:62;21299:18;;75563:99:0;;;;;;;;;75710:8;;:25;;75690:9;;-1:-1:-1;;;;;75710:8:0;;:25;;;;;75690:9;;75673:14;75710:25;75673:14;75710:25;75690:9;75710:8;:25;;;;;;;;;;;;;;;;;;;;;75552:191;59494:16254;;;;;66934:359;;;;;;;;;;-1:-1:-1;66934:359:0;;;;;:::i;:::-;;:::i;:::-;;27559:230;;;;;;;;;;-1:-1:-1;27559:230:0;;;;;:::i;:::-;;:::i;:::-;;;27595:25:1;;;27583:2;27568:18;27559:230:0;;;;;;;;26582:310;;;;;;;;;;-1:-1:-1;26582:310:0;;;;;:::i;:::-;;:::i;:::-;;;16799:14:1;;16792:22;16774:41;;16762:2;16747:18;26582:310:0;16634:187:1;61921:79:0;;;;;;;;;;-1:-1:-1;61921:79:0;;;;;:::i;:::-;;:::i;59594:46::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;71044:449::-;;;;;;;;;;-1:-1:-1;71044:449:0;;;;;:::i;:::-;;:::i;59995:33::-;;;;;;;;;;;;;;;;62172:895;;;;;;:::i;:::-;;:::i;61136:70::-;;;;;;;;;;-1:-1:-1;61136:70:0;;;;-1:-1:-1;;;;;61136:70:0;;;;;;-1:-1:-1;;;;;14234:32:1;;;14216:51;;14204:2;14189:18;61136:70:0;14070:203:1;60054:32:0;;;;;;;;;;;;;;;;69373:607;;;;;;;;;;-1:-1:-1;69373:607:0;;;;;:::i;:::-;;:::i;29503:439::-;;;;;;;;;;-1:-1:-1;29503:439:0;;;;;:::i;:::-;;:::i;74908:109::-;;;;;;;;;;-1:-1:-1;74908:109:0;;;;;:::i;:::-;;:::i;60473:32::-;;;;;;;;;;;;;;;;73275:273;;;;;;;;;;-1:-1:-1;73275:273:0;;;;;:::i;:::-;;:::i;74162:101::-;;;;;;;;;;-1:-1:-1;74162:101:0;;;;;:::i;:::-;;:::i;75100:279::-;;;:::i;74749:86::-;;;;;;;;;;-1:-1:-1;74749:86:0;;;;;:::i;:::-;;:::i;60982:59::-;;;;;;;;;;-1:-1:-1;60982:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;68994:170;;;;;;;;;;-1:-1:-1;68994:170:0;;;;;:::i;:::-;;:::i;59905:34::-;;;;;;;;;;;;;;;;27955:524;;;;;;;;;;-1:-1:-1;27955:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;72166:98::-;;;;;;;;;;-1:-1:-1;72166:98:0;;;;;:::i;:::-;72215:4;72239:17;;;:12;:17;;;;;;;;;72166:98;60437:27;;;;;;;;;;-1:-1:-1;60437:27:0;;;;;;;;;;;73889:112;;;;;;;;;;-1:-1:-1;73889:112:0;;;;;:::i;:::-;;:::i;60404:26::-;;;;;;;;;;-1:-1:-1;60404:26:0;;;;;;;;60158:37;;;;;;;;;;;;;;;;5465:103;;;;;;;;;;;;;:::i;61619:153::-;;;;;;;;;;-1:-1:-1;61687:56:0;;;;;;;;;;;;;;;;;61619:153;;73652:122;;;;;;;;;;-1:-1:-1;73652:122:0;;;;;:::i;:::-;;:::i;68507:277::-;;;;;;;;;;-1:-1:-1;68507:277:0;;;;;:::i;:::-;;:::i;72413:555::-;;;;;;;;;;-1:-1:-1;72413:555:0;;;;;:::i;:::-;;:::i;60700:44::-;;;;;;;;;;-1:-1:-1;60700:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;4817:87;;;;;;;;;;-1:-1:-1;4890:6:0;;-1:-1:-1;;;;;4890:6:0;4817:87;;59674:29;;;;;;;;;;;;;:::i;60897:34::-;;;;;;;;;;-1:-1:-1;60897:34:0;;;;;;;;28552:155;;;;;;;;;;-1:-1:-1;28552:155:0;;;;;:::i;:::-;;:::i;61050:31::-;;;;;;;;;;-1:-1:-1;61050:31:0;;;;-1:-1:-1;;;;;61050:31:0;;;68284:137;;;;;;;;;;-1:-1:-1;68284:137:0;;;;;:::i;:::-;;:::i;60938:37::-;;;;;;;;;;-1:-1:-1;60938:37:0;;;;;:::i;:::-;;:::i;70190:846::-;;;;;;;;;;-1:-1:-1;70190:846:0;;;;;:::i;:::-;;:::i;71961:107::-;;;;;;;;;;-1:-1:-1;71961:107:0;;;;;:::i;:::-;72015:7;72042:18;;;:13;:18;;;;;;;71961:107;67685:514;;;;;;;;;;-1:-1:-1;67685:514:0;;;;;:::i;:::-;;:::i;73084:119::-;;;;;;;;;;-1:-1:-1;73084:119:0;;;;;:::i;:::-;;:::i;64268:1509::-;;;;;;:::i;:::-;;:::i;28779:168::-;;;;;;;;;;-1:-1:-1;28779:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;28902:27:0;;;28878:4;28902:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;28779:168;60274:35;;;;;;;;;;;;;;;;74407:154;;;;;;;;;;-1:-1:-1;74407:154:0;;;;;:::i;:::-;;:::i;29019:407::-;;;;;;;;;;-1:-1:-1;29019:407:0;;;;;:::i;:::-;;:::i;5723:201::-;;;;;;;;;;-1:-1:-1;5723:201:0;;;;;:::i;:::-;;:::i;66934:359::-;4703:13;:11;:13::i;:::-;67034:17:::1;;67028:3;:23;67020:75;;;;-1:-1:-1::0;;;67020:75:0::1;;;;;;;:::i;:::-;72215:4:::0;72239:17;;;:12;:17;;;;;;;;67106:101:::1;;67139:17;::::0;;;:12:::1;:17;::::0;;;;:24;;-1:-1:-1;;67139:24:0::1;67159:4;67139:24;::::0;;67178:15:::1;:17:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;67106:101;67217:18;::::0;;;:13:::1;:18;::::0;;;;:29;;67239:7;;67217:18;:29:::1;::::0;67239:7;;67217:29:::1;:::i;:::-;;;;;;;;67257:28;67263:3;67268;67273:7;67257:28;;;;;;;;;;;::::0;:5:::1;:28::i;:::-;66934:359:::0;;;:::o;27559:230::-;27645:7;-1:-1:-1;;;;;27673:21:0;;27665:76;;;;-1:-1:-1;;;27665:76:0;;20353:2:1;27665:76:0;;;20335:21:1;20392:2;20372:18;;;20365:30;20431:34;20411:18;;;20404:62;-1:-1:-1;;;20482:18:1;;;20475:40;20532:19;;27665:76:0;20151:406:1;27665:76:0;-1:-1:-1;27759:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;27759:22:0;;;;;;;;;;27559:230;;;;;:::o;26582:310::-;26684:4;-1:-1:-1;;;;;;26721:41:0;;-1:-1:-1;;;26721:41:0;;:110;;-1:-1:-1;;;;;;;26779:52:0;;-1:-1:-1;;;26779:52:0;26721:110;:163;;;-1:-1:-1;;;;;;;;;;17760:40:0;;;26848:36;17651:157;61921:79;4703:13;:11;:13::i;:::-;61977:6:::1;:15:::0;;-1:-1:-1;;61977:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61921:79::o;59594:46::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71044:449::-;71099:13;71134:1;71128:3;:7;:35;;;;;71146:17;;71139:3;:24;;71128:35;71124:362;;;71284:7;71340:21;71357:3;71340:16;:21::i;:::-;71213:197;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71180:232;;71044:449;;;:::o;71124:362::-;71461:13;;;;:8;:13;;;;;71454:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71044:449;;;:::o;71124:362::-;71044:449;;;:::o;62172:895::-;62258:6;;;;62257:7;62249:35;;;;-1:-1:-1;;;62249:35:0;;26905:2:1;62249:35:0;;;26887:21:1;26944:2;26924:18;;;26917:30;-1:-1:-1;;;26963:18:1;;;26956:45;27018:18;;62249:35:0;26703:339:1;62249:35:0;62303:28;62318:3;62323:7;62303:14;:28::i;:::-;62295:52;;;;-1:-1:-1;;;62295:52:0;;18498:2:1;62295:52:0;;;18480:21:1;18537:2;18517:18;;;18510:30;-1:-1:-1;;;18556:18:1;;;18549:41;18607:18;;62295:52:0;18296:335:1;62295:52:0;4890:6;;-1:-1:-1;;;;;4890:6:0;62364:10;:21;62360:450;;62406:15;;;;:23;;:15;:23;62402:322;;;62458:25;62472:10;62458:13;:25::i;:::-;62450:53;;;;-1:-1:-1;;;62450:53:0;;26159:2:1;62450:53:0;;;26141:21:1;26198:2;26178:18;;;26171:30;-1:-1:-1;;;26217:18:1;;;26210:45;26272:18;;62450:53:0;25957:339:1;62450:53:0;62580:10;62522:30;62555:36;;;:24;:36;;;;;;62654:16;;62618:32;62643:7;62555:36;62618:32;:::i;:::-;:52;;62610:98;;;;-1:-1:-1;;;62610:98:0;;;;;;;:::i;:::-;62431:293;62402:322;62770:4;;62760:14;;:7;:14;:::i;:::-;62746:9;:29;;62738:60;;;;-1:-1:-1;;;62738:60:0;;20006:2:1;62738:60:0;;;19988:21:1;20045:2;20025:18;;;20018:30;-1:-1:-1;;;20064:18:1;;;20057:48;20122:18;;62738:60:0;19804:342:1;62738:60:0;62847:10;62822:36;;;;:24;:36;;;;;:47;;62862:7;;62822:36;:47;;62862:7;;62822:47;:::i;:::-;;;;-1:-1:-1;;62880:18:0;;;;:13;:18;;;;;:29;;62902:7;;62880:18;:29;;62902:7;;62880:29;:::i;:::-;;;;-1:-1:-1;;72215:4:0;72239:17;;;:12;:17;;;;;;;;62920:101;;62953:17;;;;:12;:17;;;;;:24;;-1:-1:-1;;62953:24:0;62973:4;62953:24;;;62992:15;:17;;;;;;:::i;:::-;;;;;;62920:101;63031:28;63037:3;63042;63047:7;63031:28;;;;;;;;;;;;:5;:28::i;69373:607::-;4703:13;:11;:13::i;:::-;69480:17:::1;;69474:3;:23;69466:75;;;;-1:-1:-1::0;;;69466:75:0::1;;;;;;;:::i;:::-;69556:10;69552:421;;;69583:22;69678:4;69723:21;69740:3;69723:16;:21::i;:::-;69615:170;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;69615:170:0;;::::1;::::0;;;;;;69803:13:::1;::::0;;;:8:::1;69615:170;69803:13:::0;;;;;;:24;;69615:170;;-1:-1:-1;69803:24:0::1;::::0;:13;;:24;::::1;::::0;::::1;:::i;:::-;;69861:3;-1:-1:-1::0;;;;;;;;;;;69851:8:0::1;69847:18;;;;;;:::i;:::-;;;;;;;;69568:309;66934:359:::0;;;:::o;69552:421::-:1;69907:13;::::0;;;:8:::1;:13;::::0;;;;;;;:20;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;69957:3;-1:-1:-1::0;;;;;;;;;;;69951:4:0::1;69947:14;;;;;;:::i;:::-;;;;;;;;69373:607:::0;;;:::o;29503:439::-;-1:-1:-1;;;;;29736:20:0;;3395:10;29736:20;;:60;;-1:-1:-1;29760:36:0;29777:4;3395:10;28779:168;:::i;29760:36::-;29714:157;;;;-1:-1:-1;;;29714:157:0;;;;;;;:::i;:::-;29882:52;29905:4;29911:2;29915:3;29920:7;29929:4;29882:22;:52::i;:::-;29503:439;;;;;:::o;74908:109::-;4703:13;:11;:13::i;:::-;74981:8:::1;:28:::0;;-1:-1:-1;;;;;;74981:28:0::1;-1:-1:-1::0;;;;;74981:28:0;;;::::1;::::0;;;::::1;::::0;;74908:109::o;73275:273::-;73333:4;;73350:168;73374:20;:27;73370:31;;73350:168;;;73454:5;-1:-1:-1;;;;;73427:32:0;:20;73448:1;73427:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;73427:23:0;:32;73423:84;;;-1:-1:-1;73487:4:0;;73275:273;-1:-1:-1;;73275:273:0:o;73423:84::-;73403:3;;;;:::i;:::-;;;;73350:168;;;-1:-1:-1;73535:5:0;;73275:273;-1:-1:-1;;73275:273:0:o;74162:101::-;4703:13;:11;:13::i;:::-;74231:15:::1;:24:::0;;-1:-1:-1;;74231:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;74162:101::o;75100:279::-;4703:13;:11;:13::i;:::-;75164:8:::1;::::0;-1:-1:-1;;;;;75164:8:0::1;75156:99;;;::::0;-1:-1:-1;;;75156:99:0;;21169:2:1;75156:99:0::1;::::0;::::1;21151:21:1::0;;;21188:18;;;21181:30;21247:34;21227:18;;;21220:62;21299:18;;75156:99:0::1;20967:356:1::0;75156:99:0::1;75293:8;::::0;75285:59:::1;::::0;75267:12:::1;::::0;-1:-1:-1;;;;;75293:8:0::1;::::0;75316:21:::1;::::0;75267:12;75285:59;75267:12;75285:59;75316:21;75293:8;75285:59:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75266:78;;;75363:7;75355:16;;;::::0;::::1;;75145:234;75100:279::o:0;74749:86::-;4703:13;:11;:13::i;:::-;74812:4:::1;:15:::0;74749:86::o;68994:170::-;4703:13;:11;:13::i;:::-;69069:8:::1;::::0;::::1;::::0;::::1;;;69068:9;69060:45;;;::::0;-1:-1:-1;;;69060:45:0;;24578:2:1;69060:45:0::1;::::0;::::1;24560:21:1::0;24617:2;24597:18;;;24590:30;24656:25;24636:18;;;24629:53;24699:18;;69060:45:0::1;24376:347:1::0;69060:45:0::1;69116:14:::0;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;69141:8:0::1;:15:::0;;-1:-1:-1;;69141:15:0::1;;;::::0;;68994:170::o;27955:524::-;28111:16;28172:3;:10;28153:8;:15;:29;28145:83;;;;-1:-1:-1;;;28145:83:0;;25340:2:1;28145:83:0;;;25322:21:1;25379:2;25359:18;;;25352:30;25418:34;25398:18;;;25391:62;-1:-1:-1;;;25469:18:1;;;25462:39;25518:19;;28145:83:0;25138:405:1;28145:83:0;28241:30;28288:8;:15;-1:-1:-1;;;;;28274:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28274:30:0;;28241:63;;28322:9;28317:122;28341:8;:15;28337:1;:19;28317:122;;;28397:30;28407:8;28416:1;28407:11;;;;;;;;:::i;:::-;;;;;;;28420:3;28424:1;28420:6;;;;;;;;:::i;:::-;;;;;;;28397:9;:30::i;:::-;28378:13;28392:1;28378:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;28358:3;;;:::i;:::-;;;28317:122;;;-1:-1:-1;28458:13:0;27955:524;-1:-1:-1;;;27955:524:0:o;73889:112::-;4703:13;:11;:13::i;:::-;73968:16:::1;:25:::0;73889:112::o;5465:103::-;4703:13;:11;:13::i;:::-;5530:30:::1;5557:1;5530:18;:30::i;:::-;5465:103::o:0;73652:122::-;4703:13;:11;:13::i;:::-;73733::::1;:33:::0;73652:122::o;68507:277::-;68595:9;68590:138;68614:4;:11;68610:1;:15;68590:138;;;68647:11;68661:4;68666:1;68661:7;;;;;;;;:::i;:::-;;;;;;;68647:21;;68705:8;68714:1;68705:11;;;;;;;;:::i;:::-;;;;;;;68683:13;:18;68697:3;68683:18;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;68627:3:0;;-1:-1:-1;68627:3:0;;-1:-1:-1;68627:3:0;:::i;:::-;;;68590:138;;;;68738:38;68749:10;68761:4;68767:8;68738:10;:38::i;:::-;68507:277;;:::o;72413:555::-;4703:13;:11;:13::i;:::-;72517:9:::1;72512:449;72536:4;:11;72532:1;:15;72512:449;;;72569:11;72583:4;72588:1;72583:7;;;;;;;;:::i;:::-;;;;;;;72569:21;;72623:9;72633:1;72623:12;;;;;;;;:::i;:::-;;;;;;;72605:9;:14;72615:3;72605:14;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;72669:1;72654:9;72664:1;72654:12;;;;;;;;:::i;:::-;;;;;;;:16;72650:300;;;72727:15;::::0;;;:12:::1;:15;::::0;;;;:22;;-1:-1:-1;;72727:22:0::1;72745:4;72727:22;::::0;;72650:300:::1;;;72929:5;72911:15:::0;;;:12:::1;:15;::::0;;;;:23;;-1:-1:-1;;72911:23:0::1;::::0;;72650:300:::1;-1:-1:-1::0;72549:3:0;::::1;::::0;::::1;:::i;:::-;;;;72512:449;;59674:29:::0;;;;;;;:::i;28552:155::-;28647:52;3395:10;28680:8;28690;28647:18;:52::i;68284:137::-;68342:18;;;;:13;:18;;;;;:29;;68364:7;;68342:18;:29;;68364:7;;68342:29;:::i;:::-;;;;-1:-1:-1;68382:31:0;;-1:-1:-1;68388:10:0;68400:3;68405:7;68382:5;:31::i;60938:37::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60938:37:0;;-1:-1:-1;60938:37:0;:::o;70190:846::-;4703:13;:11;:13::i;:::-;70320:1:::1;70306:4;:11;:15;70298:52;;;::::0;-1:-1:-1;;;70298:52:0;;21936:2:1;70298:52:0::1;::::0;::::1;21918:21:1::0;21975:2;21955:18;;;21948:30;22014:26;21994:18;;;21987:54;22058:18;;70298:52:0::1;21734:348:1::0;70298:52:0::1;70370:21;70386:4;70370:15;:21::i;:::-;70369:22;70361:74;;;;-1:-1:-1::0;;;70361:74:0::1;;;;;;;:::i;:::-;70453:9;70448:581;70472:4;:11;70468:1;:15;70448:581;;;70505:11;70519:4;70524:1;70519:7;;;;;;;;:::i;:::-;;;;;;;70505:21;;70545:10;70541:477;;;70576:22;70679:4;70732:21;70749:3;70732:16;:21::i;:::-;70608:194;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;70608:194:0;;::::1;::::0;;;;;;70824:13:::1;::::0;;;:8:::1;70608:194;70824:13:::0;;;;;;:24;;70608:194;;-1:-1:-1;70824:24:0::1;::::0;:13;;:24;::::1;::::0;::::1;:::i;:::-;;70886:3;-1:-1:-1::0;;;;;;;;;;;70876:8:0::1;70872:18;;;;;;:::i;:::-;;;;;;;;70557:349;70541:477;;;70944:13;::::0;;;:8:::1;:13;::::0;;;;;;;:20;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;70998:3;-1:-1:-1::0;;;;;;;;;;;70992:4:0::1;70988:14;;;;;;:::i;:::-;;;;;;;;70541:477;-1:-1:-1::0;70485:3:0::1;::::0;::::1;:::i;:::-;;;70448:581;;;;70190:846:::0;;;:::o;67685:514::-;4703:13;:11;:13::i;:::-;67805:21:::1;67821:4;67805:15;:21::i;:::-;67804:22;67796:74;;;;-1:-1:-1::0;;;67796:74:0::1;;;;;;;:::i;:::-;67886:9;67881:265;67905:4;:11;67901:1;:15;67881:265;;;67938:11;67952:4;67957:1;67952:7;;;;;;;;:::i;:::-;;;;;;;67938:21;;67979:11;67986:3;72215:4:::0;72239:17;;;:12;:17;;;;;;;;;72166:98;67979:11:::1;67974:113;;68011:17;::::0;;;:12:::1;:17;::::0;;;;:24;;-1:-1:-1;;68011:24:0::1;68031:4;68011:24;::::0;;68054:15:::1;:17:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;67974:113;68123:8;68132:1;68123:11;;;;;;;;:::i;:::-;;;;;;;68101:13;:18;68115:3;68101:18;;;;;;;;;;;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;67918:3:0::1;::::0;-1:-1:-1;67918:3:0;;-1:-1:-1;67918:3:0::1;:::i;:::-;;;67881:265;;;;68156:35;68167:3;68172:4;68178:8;68156:35;;;;;;;;;;;::::0;:10:::1;:35::i;73084:119::-:0;4703:13;:11;:13::i;:::-;73183:12:::1;73164:15;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;73084:119:0:o;64268:1509::-;64379:6;;;;64378:7;64370:35;;;;-1:-1:-1;;;64370:35:0;;26905:2:1;64370:35:0;;;26887:21:1;26944:2;26924:18;;;26917:30;-1:-1:-1;;;26963:18:1;;;26956:45;27018:18;;64370:35:0;26703:339:1;64370:35:0;64439:13;;64424:4;:11;:28;;64416:71;;;;-1:-1:-1;;;64416:71:0;;23450:2:1;64416:71:0;;;23432:21:1;23489:2;23469:18;;;23462:30;23528:32;23508:18;;;23501:60;23578:18;;64416:71:0;23248:354:1;64416:71:0;64521:8;:15;64506:4;:11;:30;64498:79;;;;-1:-1:-1;;;64498:79:0;;20764:2:1;64498:79:0;;;20746:21:1;20803:2;20783:18;;;20776:30;20842:34;20822:18;;;20815:62;-1:-1:-1;;;20893:18:1;;;20886:34;20937:19;;64498:79:0;20562:400:1;64498:79:0;64596:35;64616:4;64622:8;64596:19;:35::i;:::-;64588:65;;;;-1:-1:-1;;;64588:65:0;;22289:2:1;64588:65:0;;;22271:21:1;22328:2;22308:18;;;22301:30;-1:-1:-1;;;22347:18:1;;;22340:47;22404:18;;64588:65:0;22087:341:1;64588:65:0;64666:25;;64702:105;64726:8;:15;64722:1;:19;64702:105;;;64784:8;64793:1;64784:11;;;;;;;;:::i;:::-;;;;;;;64763:32;;;;;:::i;:::-;;-1:-1:-1;64743:3:0;;;;:::i;:::-;;;;64702:105;;;;64846:18;;64825:17;:39;;64817:79;;;;-1:-1:-1;;;64817:79:0;;18838:2:1;64817:79:0;;;18820:21:1;18877:2;18857:18;;;18850:30;18916:29;18896:18;;;18889:57;18963:18;;64817:79:0;18636:351:1;64817:79:0;4890:6;;-1:-1:-1;;;;;4890:6:0;64913:10;:21;64909:462;;64955:15;;;;64951:324;;;64999:25;65013:10;64999:13;:25::i;:::-;64991:53;;;;-1:-1:-1;;;64991:53:0;;26159:2:1;64991:53:0;;;26141:21:1;26198:2;26178:18;;;26171:30;-1:-1:-1;;;26217:18:1;;;26210:45;26272:18;;64991:53:0;25957:339:1;64991:53:0;65121:10;65063:30;65096:36;;;:24;:36;;;;;;65205:16;;65159:42;65184:17;65096:36;65159:42;:::i;:::-;:62;;65151:108;;;;-1:-1:-1;;;65151:108:0;;;;;;;:::i;:::-;64972:303;64951:324;65331:4;;65311:24;;:17;:24;:::i;:::-;65297:9;:39;;65289:70;;;;-1:-1:-1;;;65289:70:0;;20006:2:1;65289:70:0;;;19988:21:1;20045:2;20025:18;;;20018:30;-1:-1:-1;;;20064:18:1;;;20057:48;20122:18;;65289:70:0;19804:342:1;65289:70:0;65408:10;65383:36;;;;:24;:36;;;;;:57;;65423:17;;65383:36;:57;;65423:17;;65383:57;:::i;:::-;;;;-1:-1:-1;65458:9:0;;-1:-1:-1;65453:269:0;65477:4;:11;65473:1;:15;65453:269;;;65536:8;65545:1;65536:11;;;;;;;;:::i;:::-;;;;;;;65510:13;:22;65524:4;65529:1;65524:7;;;;;;;;:::i;:::-;;;;;;;65510:22;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;65562:11;65576:4;65581:1;65576:7;;;;;;;;:::i;:::-;;;;;;;65562:21;;65603:11;65610:3;72215:4;72239:17;;;:12;:17;;;;;;;;;72166:98;65603:11;65598:113;;65635:17;;;;:12;:17;;;;;:24;;-1:-1:-1;;65635:24:0;65655:4;65635:24;;;65678:15;:17;;;;;;:::i;:::-;;;;;;65598:113;-1:-1:-1;65490:3:0;;;;:::i;:::-;;;;65453:269;;;;65734:35;65745:3;65750:4;65756:8;65734:35;;;;;;;;;;;;:10;:35::i;74407:154::-;4703:13;:11;:13::i;:::-;74486:27:::1;74493:20;;74486:27;:::i;:::-;74524:29;:20;74547:6:::0;;74524:29:::1;:::i;29019:407::-:0;-1:-1:-1;;;;;29227:20:0;;3395:10;29227:20;;:60;;-1:-1:-1;29251:36:0;29268:4;3395:10;28779:168;:::i;29251:36::-;29205:157;;;;-1:-1:-1;;;29205:157:0;;;;;;;:::i;:::-;29373:45;29391:4;29397:2;29401;29405:6;29413:4;29373:17;:45::i;5723:201::-;4703:13;:11;:13::i;:::-;-1:-1:-1;;;;;5812:22:0;::::1;5804:73;;;::::0;-1:-1:-1;;;5804:73:0;;19194:2:1;5804:73:0::1;::::0;::::1;19176:21:1::0;19233:2;19213:18;;;19206:30;19272:34;19252:18;;;19245:62;-1:-1:-1;;;19323:18:1;;;19316:36;19369:19;;5804:73:0::1;18992:402:1::0;5804:73:0::1;5888:28;5907:8;5888:18;:28::i;7568:326::-:0;-1:-1:-1;;;;;7863:19:0;;:23;;;7568:326::o;4982:132::-;4890:6;;-1:-1:-1;;;;;4890:6:0;3395:10;5046:23;5038:68;;;;-1:-1:-1;;;5038:68:0;;23809:2:1;5038:68:0;;;23791:21:1;;;23828:18;;;23821:30;23887:34;23867:18;;;23860:62;23939:18;;5038:68:0;23607:356:1;34202:729:0;-1:-1:-1;;;;;34355:16:0;;34347:62;;;;-1:-1:-1;;;34347:62:0;;;;;;;:::i;:::-;3395:10;34422:16;34487:21;34505:2;34487:17;:21::i;:::-;34464:44;;34519:24;34546:25;34564:6;34546:17;:25::i;:::-;34519:52;;34663:9;:13;;;;;;;;;;;-1:-1:-1;;;;;34663:17:0;;;;;;;;;:27;;34684:6;;34663:9;:27;;34684:6;;34663:27;:::i;:::-;;;;-1:-1:-1;;34706:52:0;;;27805:25:1;;;27861:2;27846:18;;27839:34;;;-1:-1:-1;;;;;34706:52:0;;;;34739:1;;34706:52;;;;;;27778:18:1;34706:52:0;;;;;;;34849:74;34880:8;34898:1;34902:2;34906;34910:6;34918:4;34849:30;:74::i;:::-;34336:595;;;34202:729;;;;:::o;516:723::-;572:13;793:10;789:53;;-1:-1:-1;;820:10:0;;;;;;;;;;;;-1:-1:-1;;;820:10:0;;;;;516:723::o;789:53::-;867:5;852:12;908:78;915:9;;908:78;;941:8;;;;:::i;:::-;;-1:-1:-1;964:10:0;;-1:-1:-1;972:2:0;964:10;;:::i;:::-;;;908:78;;;996:19;1028:6;-1:-1:-1;;;;;1018:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1018:17:0;;996:39;;1046:154;1053:10;;1046:154;;1080:11;1090:1;1080:11;;:::i;:::-;;-1:-1:-1;1149:10:0;1157:2;1149:5;:10;:::i;:::-;1136:24;;:2;:24;:::i;:::-;1123:39;;1106:6;1113;1106:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1106:56:0;;;;;;;;-1:-1:-1;1177:11:0;1186:2;1177:11;;:::i;:::-;;;1046:154;;;1224:6;516:723;-1:-1:-1;;;;516:723:0:o;63075:708::-;63144:4;63164:17;;;:12;:17;;;;;;;;63160:592;;;63212:1;63202:7;:11;:39;;;;;63228:13;;63217:7;:24;;63202:39;:50;;;;;63251:1;63245:3;:7;63202:50;:76;;;;;63263:15;;63256:3;:22;;63202:76;:126;;;;-1:-1:-1;63314:14:0;;;;:9;:14;;;;;;;;;63282:13;:18;;;;;;;:28;;63303:7;;63282:28;:::i;:::-;:46;;63202:126;63198:276;;;63160:592;;63198:276;-1:-1:-1;63453:5:0;63446:12;;63160:592;63529:1;63519:7;:11;:39;;;;;63545:13;;63534:7;:24;;63519:39;:50;;;;;63568:1;63562:3;:7;63519:50;:76;;;;;63580:15;;63573:3;:22;63515:226;;;-1:-1:-1;63771:4:0;63075:708;;;;:::o;31738:1146::-;31965:7;:14;31951:3;:10;:28;31943:81;;;;-1:-1:-1;;;31943:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32043:16:0;;32035:66;;;;-1:-1:-1;;;32035:66:0;;;;;;;:::i;:::-;3395:10;32114:16;32231:421;32255:3;:10;32251:1;:14;32231:421;;;32287:10;32300:3;32304:1;32300:6;;;;;;;;:::i;:::-;;;;;;;32287:19;;32321:14;32338:7;32346:1;32338:10;;;;;;;;:::i;:::-;;;;;;;;;;;;32365:19;32387:13;;;;;;;;;;-1:-1:-1;;;;;32387:19:0;;;;;;;;;;;;32338:10;;-1:-1:-1;32429:21:0;;;;32421:76;;;;-1:-1:-1;;;32421:76:0;;;;;;;:::i;:::-;32541:9;:13;;;;;;;;;;;-1:-1:-1;;;;;32541:19:0;;;;;;;;;;32563:20;;;32541:42;;32613:17;;;;;;;:27;;32563:20;;32541:9;32613:27;;32563:20;;32613:27;:::i;:::-;;;;;;;;32272:380;;;32267:3;;;;:::i;:::-;;;32231:421;;;;32699:2;-1:-1:-1;;;;;32669:47:0;32693:4;-1:-1:-1;;;;;32669:47:0;32683:8;-1:-1:-1;;;;;32669:47:0;;32703:3;32708:7;32669:47;;;;;;;:::i;:::-;;;;;;;;32801:75;32837:8;32847:4;32853:2;32857:3;32862:7;32871:4;32801:35;:75::i;:::-;31932:952;31738:1146;;;;;:::o;6084:191::-;6177:6;;;-1:-1:-1;;;;;6194:17:0;;;-1:-1:-1;;;;;;6194:17:0;;;;;;;6227:40;;6177:6;;;6194:17;6177:6;;6227:40;;6158:16;;6227:40;6147:128;6084:191;:::o;37503:969::-;-1:-1:-1;;;;;37655:18:0;;37647:66;;;;-1:-1:-1;;;37647:66:0;;;;;;;:::i;:::-;37746:7;:14;37732:3;:10;:28;37724:81;;;;-1:-1:-1;;;37724:81:0;;;;;;;:::i;:::-;37862:66;;;;;;;;;37818:16;37862:66;;;;3395:10;;37941:373;37965:3;:10;37961:1;:14;37941:373;;;37997:10;38010:3;38014:1;38010:6;;;;;;;;:::i;:::-;;;;;;;37997:19;;38031:14;38048:7;38056:1;38048:10;;;;;;;;:::i;:::-;;;;;;;;;;;;38075:19;38097:13;;;;;;;;;;-1:-1:-1;;;;;38097:19:0;;;;;;;;;;;;38048:10;;-1:-1:-1;38139:21:0;;;;38131:70;;;;-1:-1:-1;;;38131:70:0;;;;;;;:::i;:::-;38245:9;:13;;;;;;;;;;;-1:-1:-1;;;;;38245:19:0;;;;;;;;;;38267:20;;38245:42;;37977:3;;;;:::i;:::-;;;;37941:373;;;;38369:1;-1:-1:-1;;;;;38331:55:0;38355:4;-1:-1:-1;;;;;38331:55:0;38345:8;-1:-1:-1;;;;;38331:55:0;;38373:3;38378:7;38331:55;;;;;;;:::i;:::-;;;;;;;;38399:65;;;;;;;;;38443:1;38399:65;;;31738:1146;38615:331;38770:8;-1:-1:-1;;;;;38761:17:0;:5;-1:-1:-1;;;;;38761:17:0;;;38753:71;;;;-1:-1:-1;;;38753:71:0;;24930:2:1;38753:71:0;;;24912:21:1;24969:2;24949:18;;;24942:30;25008:34;24988:18;;;24981:62;-1:-1:-1;;;25059:18:1;;;25052:39;25108:19;;38753:71:0;24728:405:1;38753:71:0;-1:-1:-1;;;;;38835:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;38835:46:0;;;;;;;;;;38897:41;;16774::1;;;38897::0;;16747:18:1;38897:41:0;;;;;;;38615:331;;;:::o;36445:808::-;-1:-1:-1;;;;;36572:18:0;;36564:66;;;;-1:-1:-1;;;36564:66:0;;;;;;;:::i;:::-;3395:10;36643:16;36708:21;36726:2;36708:17;:21::i;:::-;36685:44;;36740:24;36767:25;36785:6;36767:17;:25::i;:::-;36805:66;;;;;;;;;-1:-1:-1;36805:66:0;;;;36906:13;;;;;;;;;-1:-1:-1;;;;;36906:19:0;;;;;;;;36740:52;;-1:-1:-1;36944:21:0;;;;36936:70;;;;-1:-1:-1;;;36936:70:0;;;;;;;:::i;:::-;37042:9;:13;;;;;;;;;;;-1:-1:-1;;;;;37042:19:0;;;;;;;;;;;;37064:20;;;37042:42;;37113:54;;27805:25:1;;;27846:18;;;27839:34;;;37042:19:0;;37113:54;;;;;;27778:18:1;37113:54:0;;;;;;;37180:65;;;;;;;;;37224:1;37180:65;;;31738:1146;71501:380;71567:4;;71583:269;71607:4;:11;71603:1;:15;71583:269;;;71640:11;71654:4;71659:1;71654:7;;;;;;;;:::i;:::-;;;;;;;71640:21;;71687:17;;71680:3;:24;71676:165;;;;;-1:-1:-1;71820:5:0;;71501:380;-1:-1:-1;;;71501:380:0:o;71676:165::-;-1:-1:-1;71620:3:0;;;:::i;:::-;;;71583:269;;35334:813;-1:-1:-1;;;;;35512:16:0;;35504:62;;;;-1:-1:-1;;;35504:62:0;;;;;;;:::i;:::-;35599:7;:14;35585:3;:10;:28;35577:81;;;;-1:-1:-1;;;35577:81:0;;;;;;;:::i;:::-;3395:10;35671:16;35794:103;35818:3;:10;35814:1;:14;35794:103;;;35875:7;35883:1;35875:10;;;;;;;;:::i;:::-;;;;;;;35850:9;:17;35860:3;35864:1;35860:6;;;;;;;;:::i;:::-;;;;;;;35850:17;;;;;;;;;;;:21;35868:2;-1:-1:-1;;;;;35850:21:0;-1:-1:-1;;;;;35850:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;35830:3:0;;-1:-1:-1;35830:3:0;;;:::i;:::-;;;;35794:103;;;;35950:2;-1:-1:-1;;;;;35914:53:0;35946:1;-1:-1:-1;;;;;35914:53:0;35928:8;-1:-1:-1;;;;;35914:53:0;;35954:3;35959:7;35914:53;;;;;;;:::i;:::-;;;;;;;;36058:81;36094:8;36112:1;36116:2;36120:3;36125:7;36134:4;36058:35;:81::i;65785:946::-;65878:4;;65894:806;65918:4;:11;65914:1;:15;65894:806;;;65951:11;65965:4;65970:1;65965:7;;;;;;;;:::i;:::-;;;;;;;65951:21;;65987:15;66005:8;66014:1;66005:11;;;;;;;;:::i;:::-;;;;;;;;;;;;66035:17;;;;:12;:17;;;;;;;;66005:11;;-1:-1:-1;66035:17:0;;66031:658;;;66087:1;66077:7;:11;:39;;;;;66103:13;;66092:7;:24;;66077:39;:50;;;;;66126:1;66120:3;:7;66077:50;:76;;;;;66138:15;;66131:3;:22;;66077:76;:126;;;;-1:-1:-1;66189:14:0;;;;:9;:14;;;;;;;;;66157:13;:18;;;;;;;:28;;66178:7;;66157:28;:::i;:::-;:46;;66077:126;66073:299;;;66031:658;;66073:299;66347:5;66340:12;;;;;;;66031:658;66439:1;66429:7;:11;:39;;;;;66455:13;;66444:7;:24;;66429:39;:50;;;;;66478:1;66472:3;:7;66429:50;:76;;;;;66490:15;;66483:3;:22;66425:249;;;65936:764;;65931:3;;;;;:::i;:::-;;;;65894:806;;;-1:-1:-1;66719:4:0;;65785:946;-1:-1:-1;;;65785:946:0:o;30406:974::-;-1:-1:-1;;;;;30594:16:0;;30586:66;;;;-1:-1:-1;;;30586:66:0;;;;;;;:::i;:::-;3395:10;30665:16;30730:21;30748:2;30730:17;:21::i;:::-;30707:44;;30762:24;30789:25;30807:6;30789:17;:25::i;:::-;30762:52;;30900:19;30922:13;;;;;;;;;;;-1:-1:-1;;;;;30922:19:0;;;;;;;;;;30960:21;;;;30952:76;;;;-1:-1:-1;;;30952:76:0;;;;;;;:::i;:::-;31064:9;:13;;;;;;;;;;;-1:-1:-1;;;;;31064:19:0;;;;;;;;;;31086:20;;;31064:42;;31128:17;;;;;;;:27;;31086:20;;31064:9;31128:27;;31086:20;;31128:27;:::i;:::-;;;;-1:-1:-1;;31173:46:0;;;27805:25:1;;;27861:2;27846:18;;27839:34;;;-1:-1:-1;;;;;31173:46:0;;;;;;;;;;;;;;27778:18:1;31173:46:0;;;;;;;31304:68;31335:8;31345:4;31351:2;31355;31359:6;31367:4;31304:30;:68::i;:::-;30575:805;;;;30406:974;;;;;:::o;42881:198::-;43001:16;;;43015:1;43001:16;;;;;;;;;42947;;42976:22;;43001:16;;;;;;;;;;;;-1:-1:-1;43001:16:0;42976:41;;43039:7;43028:5;43034:1;43028:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;43066:5;42881:198;-1:-1:-1;;42881:198:0:o;41308:744::-;-1:-1:-1;;;;;41523:13:0;;7863:19;:23;41519:526;;41559:72;;-1:-1:-1;;;41559:72:0;;-1:-1:-1;;;;;41559:38:0;;;;;:72;;41598:8;;41608:4;;41614:2;;41618:6;;41626:4;;41559:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41559:72:0;;;;;;;;-1:-1:-1;;41559:72:0;;;;;;;;;;;;:::i;:::-;;;41555:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;41907:6;41900:14;;-1:-1:-1;;;41900:14:0;;;;;;;;:::i;41555:479::-;;;41956:62;;-1:-1:-1;;;41956:62:0;;17252:2:1;41956:62:0;;;17234:21:1;17291:2;17271:18;;;17264:30;17330:34;17310:18;;;17303:62;-1:-1:-1;;;17381:18:1;;;17374:50;17441:19;;41956:62:0;17050:416:1;41555:479:0;-1:-1:-1;;;;;;41681:55:0;;-1:-1:-1;;;41681:55:0;41677:154;;41761:50;;-1:-1:-1;;;41761:50:0;;;;;;;:::i;42060:813::-;-1:-1:-1;;;;;42300:13:0;;7863:19;:23;42296:570;;42336:79;;-1:-1:-1;;;42336:79:0;;-1:-1:-1;;;;;42336:43:0;;;;;:79;;42380:8;;42390:4;;42396:3;;42401:7;;42410:4;;42336:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42336:79:0;;;;;;;;-1:-1:-1;;42336:79:0;;;;;;;;;;;;:::i;:::-;;;42332:523;;;;:::i;:::-;-1:-1:-1;;;;;;42497:60:0;;-1:-1:-1;;;42497:60:0;42493:159;;42582:50;;-1:-1:-1;;;42582:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:735;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;402:43;442:2;402:43;:::i;:::-;474:2;468:9;486:31;514:2;506:6;486:31;:::i;:::-;552:18;;;586:15;;;;-1:-1:-1;621:15:1;;;671:1;667:10;;;655:23;;651:32;;648:41;-1:-1:-1;645:61:1;;;702:1;699;692:12;645:61;724:1;734:163;748:2;745:1;742:9;734:163;;;805:17;;793:30;;843:12;;;;875;;;;766:1;759:9;734:163;;;-1:-1:-1;915:6:1;;192:735;-1:-1:-1;;;;;;;192:735:1:o;932:160::-;997:20;;1053:13;;1046:21;1036:32;;1026:60;;1082:1;1079;1072:12;1097:555;1139:5;1192:3;1185:4;1177:6;1173:17;1169:27;1159:55;;1210:1;1207;1200:12;1159:55;1246:6;1233:20;-1:-1:-1;;;;;1268:2:1;1265:26;1262:52;;;1294:18;;:::i;:::-;1343:2;1337:9;1355:67;1410:2;1391:13;;-1:-1:-1;;1387:27:1;1416:4;1383:38;1337:9;1355:67;:::i;:::-;1446:2;1438:6;1431:18;1492:3;1485:4;1480:2;1472:6;1468:15;1464:26;1461:35;1458:55;;;1509:1;1506;1499:12;1458:55;1573:2;1566:4;1558:6;1554:17;1547:4;1539:6;1535:17;1522:54;1620:1;1596:15;;;1613:4;1592:26;1585:37;;;;1600:6;1097:555;-1:-1:-1;;;1097:555:1:o;1657:186::-;1716:6;1769:2;1757:9;1748:7;1744:23;1740:32;1737:52;;;1785:1;1782;1775:12;1737:52;1808:29;1827:9;1808:29;:::i;:::-;1798:39;1657:186;-1:-1:-1;;;1657:186:1:o;1848:260::-;1916:6;1924;1977:2;1965:9;1956:7;1952:23;1948:32;1945:52;;;1993:1;1990;1983:12;1945:52;2016:29;2035:9;2016:29;:::i;:::-;2006:39;;2064:38;2098:2;2087:9;2083:18;2064:38;:::i;:::-;2054:48;;1848:260;;;;;:::o;2113:943::-;2267:6;2275;2283;2291;2299;2352:3;2340:9;2331:7;2327:23;2323:33;2320:53;;;2369:1;2366;2359:12;2320:53;2392:29;2411:9;2392:29;:::i;:::-;2382:39;;2440:38;2474:2;2463:9;2459:18;2440:38;:::i;:::-;2430:48;;2529:2;2518:9;2514:18;2501:32;-1:-1:-1;;;;;2593:2:1;2585:6;2582:14;2579:34;;;2609:1;2606;2599:12;2579:34;2632:61;2685:7;2676:6;2665:9;2661:22;2632:61;:::i;:::-;2622:71;;2746:2;2735:9;2731:18;2718:32;2702:48;;2775:2;2765:8;2762:16;2759:36;;;2791:1;2788;2781:12;2759:36;2814:63;2869:7;2858:8;2847:9;2843:24;2814:63;:::i;:::-;2804:73;;2930:3;2919:9;2915:19;2902:33;2886:49;;2960:2;2950:8;2947:16;2944:36;;;2976:1;2973;2966:12;2944:36;;2999:51;3042:7;3031:8;3020:9;3016:24;2999:51;:::i;:::-;2989:61;;;2113:943;;;;;;;;:::o;3061:606::-;3165:6;3173;3181;3189;3197;3250:3;3238:9;3229:7;3225:23;3221:33;3218:53;;;3267:1;3264;3257:12;3218:53;3290:29;3309:9;3290:29;:::i;:::-;3280:39;;3338:38;3372:2;3361:9;3357:18;3338:38;:::i;:::-;3328:48;;3423:2;3412:9;3408:18;3395:32;3385:42;;3474:2;3463:9;3459:18;3446:32;3436:42;;3529:3;3518:9;3514:19;3501:33;-1:-1:-1;;;;;3549:6:1;3546:30;3543:50;;;3589:1;3586;3579:12;3543:50;3612:49;3653:7;3644:6;3633:9;3629:22;3612:49;:::i;3672:669::-;3799:6;3807;3815;3868:2;3856:9;3847:7;3843:23;3839:32;3836:52;;;3884:1;3881;3874:12;3836:52;3907:29;3926:9;3907:29;:::i;:::-;3897:39;;3987:2;3976:9;3972:18;3959:32;-1:-1:-1;;;;;4051:2:1;4043:6;4040:14;4037:34;;;4067:1;4064;4057:12;4037:34;4090:61;4143:7;4134:6;4123:9;4119:22;4090:61;:::i;:::-;4080:71;;4204:2;4193:9;4189:18;4176:32;4160:48;;4233:2;4223:8;4220:16;4217:36;;;4249:1;4246;4239:12;4217:36;;4272:63;4327:7;4316:8;4305:9;4301:24;4272:63;:::i;:::-;4262:73;;;3672:669;;;;;:::o;4346:254::-;4411:6;4419;4472:2;4460:9;4451:7;4447:23;4443:32;4440:52;;;4488:1;4485;4478:12;4440:52;4511:29;4530:9;4511:29;:::i;:::-;4501:39;;4559:35;4590:2;4579:9;4575:18;4559:35;:::i;4605:254::-;4673:6;4681;4734:2;4722:9;4713:7;4709:23;4705:32;4702:52;;;4750:1;4747;4740:12;4702:52;4773:29;4792:9;4773:29;:::i;:::-;4763:39;4849:2;4834:18;;;;4821:32;;-1:-1:-1;;;4605:254:1:o;4864:322::-;4941:6;4949;4957;5010:2;4998:9;4989:7;4985:23;4981:32;4978:52;;;5026:1;5023;5016:12;4978:52;5049:29;5068:9;5049:29;:::i;:::-;5039:39;5125:2;5110:18;;5097:32;;-1:-1:-1;5176:2:1;5161:18;;;5148:32;;4864:322;-1:-1:-1;;;4864:322:1:o;5191:615::-;5277:6;5285;5338:2;5326:9;5317:7;5313:23;5309:32;5306:52;;;5354:1;5351;5344:12;5306:52;5394:9;5381:23;-1:-1:-1;;;;;5464:2:1;5456:6;5453:14;5450:34;;;5480:1;5477;5470:12;5450:34;5518:6;5507:9;5503:22;5493:32;;5563:7;5556:4;5552:2;5548:13;5544:27;5534:55;;5585:1;5582;5575:12;5534:55;5625:2;5612:16;5651:2;5643:6;5640:14;5637:34;;;5667:1;5664;5657:12;5637:34;5720:7;5715:2;5705:6;5702:1;5698:14;5694:2;5690:23;5686:32;5683:45;5680:65;;;5741:1;5738;5731:12;5680:65;5772:2;5764:11;;;;;5794:6;;-1:-1:-1;5191:615:1;;-1:-1:-1;;;;5191:615:1:o;5811:1219::-;5929:6;5937;5990:2;5978:9;5969:7;5965:23;5961:32;5958:52;;;6006:1;6003;5996:12;5958:52;6046:9;6033:23;-1:-1:-1;;;;;6116:2:1;6108:6;6105:14;6102:34;;;6132:1;6129;6122:12;6102:34;6170:6;6159:9;6155:22;6145:32;;6215:7;6208:4;6204:2;6200:13;6196:27;6186:55;;6237:1;6234;6227:12;6186:55;6273:2;6260:16;6295:4;6318:43;6358:2;6318:43;:::i;:::-;6390:2;6384:9;6402:31;6430:2;6422:6;6402:31;:::i;:::-;6468:18;;;6502:15;;;;-1:-1:-1;6537:11:1;;;6579:1;6575:10;;;6567:19;;6563:28;;6560:41;-1:-1:-1;6557:61:1;;;6614:1;6611;6604:12;6557:61;6636:1;6627:10;;6646:169;6660:2;6657:1;6654:9;6646:169;;;6717:23;6736:3;6717:23;:::i;:::-;6705:36;;6678:1;6671:9;;;;;6761:12;;;;6793;;6646:169;;;-1:-1:-1;6834:6:1;-1:-1:-1;;6878:18:1;;6865:32;;-1:-1:-1;;6909:16:1;;;6906:36;;;6938:1;6935;6928:12;6906:36;;6961:63;7016:7;7005:8;6994:9;6990:24;6961:63;:::i;:::-;6951:73;;;5811:1219;;;;;:::o;7035:595::-;7153:6;7161;7214:2;7202:9;7193:7;7189:23;7185:32;7182:52;;;7230:1;7227;7220:12;7182:52;7270:9;7257:23;-1:-1:-1;;;;;7340:2:1;7332:6;7329:14;7326:34;;;7356:1;7353;7346:12;7326:34;7379:61;7432:7;7423:6;7412:9;7408:22;7379:61;:::i;:::-;7369:71;;7493:2;7482:9;7478:18;7465:32;7449:48;;7522:2;7512:8;7509:16;7506:36;;;7538:1;7535;7528:12;7635:636;7744:6;7752;7760;7813:2;7801:9;7792:7;7788:23;7784:32;7781:52;;;7829:1;7826;7819:12;7781:52;7869:9;7856:23;-1:-1:-1;;;;;7939:2:1;7931:6;7928:14;7925:34;;;7955:1;7952;7945:12;7925:34;7978:61;8031:7;8022:6;8011:9;8007:22;7978:61;:::i;:::-;7968:71;;8092:2;8081:9;8077:18;8064:32;8048:48;;8121:2;8111:8;8108:16;8105:36;;;8137:1;8134;8127:12;8105:36;;8160:51;8203:7;8192:8;8181:9;8177:24;8160:51;:::i;:::-;8150:61;;;8230:35;8261:2;8250:9;8246:18;8230:35;:::i;:::-;8220:45;;7635:636;;;;;:::o;8276:180::-;8332:6;8385:2;8373:9;8364:7;8360:23;8356:32;8353:52;;;8401:1;8398;8391:12;8353:52;8424:26;8440:9;8424:26;:::i;8461:245::-;8519:6;8572:2;8560:9;8551:7;8547:23;8543:32;8540:52;;;8588:1;8585;8578:12;8540:52;8627:9;8614:23;8646:30;8670:5;8646:30;:::i;8711:249::-;8780:6;8833:2;8821:9;8812:7;8808:23;8804:32;8801:52;;;8849:1;8846;8839:12;8801:52;8881:9;8875:16;8900:30;8924:5;8900:30;:::i;8965:321::-;9034:6;9087:2;9075:9;9066:7;9062:23;9058:32;9055:52;;;9103:1;9100;9093:12;9055:52;9143:9;9130:23;-1:-1:-1;;;;;9168:6:1;9165:30;9162:50;;;9208:1;9205;9198:12;9162:50;9231:49;9272:7;9263:6;9252:9;9248:22;9231:49;:::i;9291:180::-;9350:6;9403:2;9391:9;9382:7;9378:23;9374:32;9371:52;;;9419:1;9416;9409:12;9371:52;-1:-1:-1;9442:23:1;;9291:180;-1:-1:-1;9291:180:1:o;9476:457::-;9560:6;9568;9576;9629:2;9617:9;9608:7;9604:23;9600:32;9597:52;;;9645:1;9642;9635:12;9597:52;9681:9;9668:23;9658:33;;9742:2;9731:9;9727:18;9714:32;-1:-1:-1;;;;;9761:6:1;9758:30;9755:50;;;9801:1;9798;9791:12;9755:50;9824:49;9865:7;9856:6;9845:9;9841:22;9824:49;:::i;9938:248::-;10006:6;10014;10067:2;10055:9;10046:7;10042:23;10038:32;10035:52;;;10083:1;10080;10073:12;10035:52;-1:-1:-1;;10106:23:1;;;10176:2;10161:18;;;10148:32;;-1:-1:-1;9938:248:1:o;10191:435::-;10244:3;10282:5;10276:12;10309:6;10304:3;10297:19;10335:4;10364:2;10359:3;10355:12;10348:19;;10401:2;10394:5;10390:14;10422:1;10432:169;10446:6;10443:1;10440:13;10432:169;;;10507:13;;10495:26;;10541:12;;;;10576:15;;;;10468:1;10461:9;10432:169;;;-1:-1:-1;10617:3:1;;10191:435;-1:-1:-1;;;;;10191:435:1:o;10631:257::-;10672:3;10710:5;10704:12;10737:6;10732:3;10725:19;10753:63;10809:6;10802:4;10797:3;10793:14;10786:4;10779:5;10775:16;10753:63;:::i;:::-;10870:2;10849:15;-1:-1:-1;;10845:29:1;10836:39;;;;10877:4;10832:50;;10631:257;-1:-1:-1;;10631:257:1:o;10893:185::-;10935:3;10973:5;10967:12;10988:52;11033:6;11028:3;11021:4;11014:5;11010:16;10988:52;:::i;:::-;11056:16;;;;;10893:185;-1:-1:-1;;10893:185:1:o;11320:909::-;-1:-1:-1;;;11827:3:1;11820:22;11802:3;11871:6;11865:13;11887:61;11941:6;11937:1;11932:3;11928:11;11921:4;11913:6;11909:17;11887:61;:::i;:::-;-1:-1:-1;;;12007:1:1;11967:16;;;11999:10;;;11992:23;12040:13;;12062:62;12040:13;12111:1;12103:10;;12096:4;12084:17;;12062:62;:::i;:::-;-1:-1:-1;;;12184:1:1;12143:17;;;;12176:10;;;12169:27;12220:2;12212:11;;11320:909;-1:-1:-1;;;;11320:909:1:o;12234:1621::-;-1:-1:-1;;;12738:3:1;12731:22;12713:3;12772:1;12793;12826:6;12820:13;12856:3;12878:1;12906:9;12902:2;12898:18;12888:28;;12966:2;12955:9;12951:18;12988;12978:61;;13032:4;13024:6;13020:17;13010:27;;12978:61;13058:2;13106;13098:6;13095:14;13075:18;13072:38;13069:165;;;-1:-1:-1;;;13133:33:1;;13189:4;13186:1;13179:15;13219:4;13140:3;13207:17;13069:165;13250:18;13277:122;;;;13413:1;13408:338;;;;13243:503;;13277:122;-1:-1:-1;;13319:24:1;;13305:12;;;13298:46;13368:16;;;13364:25;;;-1:-1:-1;13277:122:1;;13408:338;28145:1;28138:14;;;28182:4;28169:18;;13503:1;13517:174;13531:6;13528:1;13525:13;13517:174;;;13618:14;;13600:11;;;13596:20;;13589:44;13661:16;;;;13546:10;;13517:174;;;13521:3;;13733:2;13724:6;13719:3;13715:16;13711:25;13704:32;;13243:503;;;;;;;13762:87;13787:61;13813:34;13843:3;-1:-1:-1;;;11266:16:1;;11307:1;11298:11;;11201:114;13813:34;13805:6;13787:61;:::i;:::-;-1:-1:-1;;;11143:20:1;;11188:1;11179:11;;11083:113;13762:87;13755:94;12234:1621;-1:-1:-1;;;;;;12234:1621:1:o;14502:826::-;-1:-1:-1;;;;;14899:15:1;;;14881:34;;14951:15;;14946:2;14931:18;;14924:43;14861:3;14998:2;14983:18;;14976:31;;;14824:4;;15030:57;;15067:19;;15059:6;15030:57;:::i;:::-;15135:9;15127:6;15123:22;15118:2;15107:9;15103:18;15096:50;15169:44;15206:6;15198;15169:44;:::i;:::-;15155:58;;15262:9;15254:6;15250:22;15244:3;15233:9;15229:19;15222:51;15290:32;15315:6;15307;15290:32;:::i;:::-;15282:40;14502:826;-1:-1:-1;;;;;;;;14502:826:1:o;15333:560::-;-1:-1:-1;;;;;15630:15:1;;;15612:34;;15682:15;;15677:2;15662:18;;15655:43;15729:2;15714:18;;15707:34;;;15772:2;15757:18;;15750:34;;;15592:3;15815;15800:19;;15793:32;;;15555:4;;15842:45;;15867:19;;15859:6;15842:45;:::i;:::-;15834:53;15333:560;-1:-1:-1;;;;;;;15333:560:1:o;15898:261::-;16077:2;16066:9;16059:21;16040:4;16097:56;16149:2;16138:9;16134:18;16126:6;16097:56;:::i;16164:465::-;16421:2;16410:9;16403:21;16384:4;16447:56;16499:2;16488:9;16484:18;16476:6;16447:56;:::i;:::-;16551:9;16543:6;16539:22;16534:2;16523:9;16519:18;16512:50;16579:44;16616:6;16608;16579:44;:::i;:::-;16571:52;16164:465;-1:-1:-1;;;;;16164:465:1:o;16826:219::-;16975:2;16964:9;16957:21;16938:4;16995:44;17035:2;17024:9;17020:18;17012:6;16995:44;:::i;17471:411::-;17673:2;17655:21;;;17712:2;17692:18;;;17685:30;17751:34;17746:2;17731:18;;17724:62;-1:-1:-1;;;17817:2:1;17802:18;;17795:45;17872:3;17857:19;;17471:411::o;17887:404::-;18089:2;18071:21;;;18128:2;18108:18;;;18101:30;18167:34;18162:2;18147:18;;18140:62;-1:-1:-1;;;18233:2:1;18218:18;;18211:38;18281:3;18266:19;;17887:404::o;19399:400::-;19601:2;19583:21;;;19640:2;19620:18;;;19613:30;19679:34;19674:2;19659:18;;19652:62;-1:-1:-1;;;19745:2:1;19730:18;;19723:34;19789:3;19774:19;;19399:400::o;21328:401::-;21530:2;21512:21;;;21569:2;21549:18;;;21542:30;21608:34;21603:2;21588:18;;21581:62;-1:-1:-1;;;21674:2:1;21659:18;;21652:35;21719:3;21704:19;;21328:401::o;22433:399::-;22635:2;22617:21;;;22674:2;22654:18;;;22647:30;22713:34;22708:2;22693:18;;22686:62;-1:-1:-1;;;22779:2:1;22764:18;;22757:33;22822:3;22807:19;;22433:399::o;22837:406::-;23039:2;23021:21;;;23078:2;23058:18;;;23051:30;23117:34;23112:2;23097:18;;23090:62;-1:-1:-1;;;23183:2:1;23168:18;;23161:40;23233:3;23218:19;;22837:406::o;23968:403::-;24170:2;24152:21;;;24209:2;24189:18;;;24182:30;24248:34;24243:2;24228:18;;24221:62;-1:-1:-1;;;24314:2:1;24299:18;;24292:37;24361:3;24346:19;;23968:403::o;25548:404::-;25750:2;25732:21;;;25789:2;25769:18;;;25762:30;25828:34;25823:2;25808:18;;25801:62;-1:-1:-1;;;25894:2:1;25879:18;;25872:38;25942:3;25927:19;;25548:404::o;26301:397::-;26503:2;26485:21;;;26542:2;26522:18;;;26515:30;26581:34;26576:2;26561:18;;26554:62;-1:-1:-1;;;26647:2:1;26632:18;;26625:31;26688:3;26673:19;;26301:397::o;27047:::-;27249:2;27231:21;;;27288:2;27268:18;;;27261:30;27327:34;27322:2;27307:18;;27300:62;-1:-1:-1;;;27393:2:1;27378:18;;27371:31;27434:3;27419:19;;27047:397::o;27884:183::-;27944:4;-1:-1:-1;;;;;27969:6:1;27966:30;27963:56;;;27999:18;;:::i;:::-;-1:-1:-1;28044:1:1;28040:14;28056:4;28036:25;;27884:183::o;28198:128::-;28238:3;28269:1;28265:6;28262:1;28259:13;28256:39;;;28275:18;;:::i;:::-;-1:-1:-1;28311:9:1;;28198:128::o;28331:120::-;28371:1;28397;28387:35;;28402:18;;:::i;:::-;-1:-1:-1;28436:9:1;;28331:120::o;28456:168::-;28496:7;28562:1;28558;28554:6;28550:14;28547:1;28544:21;28539:1;28532:9;28525:17;28521:45;28518:71;;;28569:18;;:::i;:::-;-1:-1:-1;28609:9:1;;28456:168::o;28629:125::-;28669:4;28697:1;28694;28691:8;28688:34;;;28702:18;;:::i;:::-;-1:-1:-1;28739:9:1;;28629:125::o;28759:258::-;28831:1;28841:113;28855:6;28852:1;28849:13;28841:113;;;28931:11;;;28925:18;28912:11;;;28905:39;28877:2;28870:10;28841:113;;;28972:6;28969:1;28966:13;28963:48;;;-1:-1:-1;;29007:1:1;28989:16;;28982:27;28759:258::o;29022:380::-;29101:1;29097:12;;;;29144;;;29165:61;;29219:4;29211:6;29207:17;29197:27;;29165:61;29272:2;29264:6;29261:14;29241:18;29238:38;29235:161;;;29318:10;29313:3;29309:20;29306:1;29299:31;29353:4;29350:1;29343:15;29381:4;29378:1;29371:15;29235:161;;29022:380;;;:::o;29407:249::-;29517:2;29498:13;;-1:-1:-1;;29494:27:1;29482:40;;-1:-1:-1;;;;;29537:34:1;;29573:22;;;29534:62;29531:88;;;29599:18;;:::i;:::-;29635:2;29628:22;-1:-1:-1;;29407:249:1:o;29661:135::-;29700:3;-1:-1:-1;;29721:17:1;;29718:43;;;29741:18;;:::i;:::-;-1:-1:-1;29788:1:1;29777:13;;29661:135::o;29801:112::-;29833:1;29859;29849:35;;29864:18;;:::i;:::-;-1:-1:-1;29898:9:1;;29801:112::o;29918:127::-;29979:10;29974:3;29970:20;29967:1;29960:31;30010:4;30007:1;30000:15;30034:4;30031:1;30024:15;30050:127;30111:10;30106:3;30102:20;30099:1;30092:31;30142:4;30139:1;30132:15;30166:4;30163:1;30156:15;30182:127;30243:10;30238:3;30234:20;30231:1;30224:31;30274:4;30271:1;30264:15;30298:4;30295:1;30288:15;30314:127;30375:10;30370:3;30366:20;30363:1;30356:31;30406:4;30403:1;30396:15;30430:4;30427:1;30420:15;30446:179;30481:3;30523:1;30505:16;30502:23;30499:120;;;30569:1;30566;30563;30548:23;-1:-1:-1;30606:1:1;30600:8;30595:3;30591:18;30499:120;30446:179;:::o;30630:671::-;30669:3;30711:4;30693:16;30690:26;30687:39;;;30630:671;:::o;30687:39::-;30753:2;30747:9;-1:-1:-1;;30818:16:1;30814:25;;30811:1;30747:9;30790:50;30869:4;30863:11;30893:16;-1:-1:-1;;;;;30999:2:1;30992:4;30984:6;30980:17;30977:25;30972:2;30964:6;30961:14;30958:45;30955:58;;;31006:5;;;;;30630:671;:::o;30955:58::-;31043:6;31037:4;31033:17;31022:28;;31079:3;31073:10;31106:2;31098:6;31095:14;31092:27;;;31112:5;;;;;;30630:671;:::o;31092:27::-;31196:2;31177:16;31171:4;31167:27;31163:36;31156:4;31147:6;31142:3;31138:16;31134:27;31131:69;31128:82;;;31203:5;;;;;;30630:671;:::o;31128:82::-;31219:57;31270:4;31261:6;31253;31249:19;31245:30;31239:4;31219:57;:::i;:::-;-1:-1:-1;31292:3:1;;30630:671;-1:-1:-1;;;;;30630:671:1:o;31306:131::-;-1:-1:-1;;;;;;31380:32:1;;31370:43;;31360:71;;31427:1;31424;31417:12

Swarm Source

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