Token XPower NFT
Token migration announcement. XPower NFT token contract has migrated to a new address.
Overview ERC1155
Total Supply:
0 ODIN
Holders:
3 addresses
Transfers:
-
Contract:
Official Site:
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
XPowerOdinNft
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-04-28 */ // Sources flattened with hardhat v2.9.3 https://hardhat.org // SPDX-License-Identifier: GPL-3.0 // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts v4.4.1 (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 be 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 @openzeppelin/contracts/token/ERC1155/[email protected] // 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 @openzeppelin/contracts/token/ERC1155/extensions/[email protected] // 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 @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts v4.4.1 (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: balance query for the zero address"); 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 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: transfer caller is not 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(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), 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); _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); _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(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * 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); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * 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(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); 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); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * 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); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {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 `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 _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.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 @openzeppelin/contracts/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burnBatch(account, ids, values); } } // File @openzeppelin/contracts/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] -= amounts[i]; } } } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/URIMalleable.sol pragma solidity ^0.8.0; /** * Allows changing of the NFT's URI (by only the contract owner), where the URI * should redirect permanently (301) to e.g. a corresponding IPFS address. */ abstract contract URIMalleable is ERC1155, Ownable { function setURI(string memory newuri) public onlyOwner { _setURI(newuri); } } // File contracts/MigratableNft.sol // solhint-disable not-rely-on-time pragma solidity ^0.8.0; /** * Allows migration of NFTs from an old contract; batch migration is also * possible. Further, manually sealing the migration is also possible. */ abstract contract MigratableNft is ERC1155, ERC1155Burnable, Ownable { /** old contract to migrate from */ ERC1155Burnable private _token; /** timestamp of migration deadline */ uint256 private _deadlineBy; /** flag to control migration */ bool private _migratable = true; /** @param base address of old contract */ /** @param deadlineIn seconds to end-of-migration */ constructor(address base, uint256 deadlineIn) { _deadlineBy = block.timestamp + deadlineIn; _token = ERC1155Burnable(base); } /** import NFT from old contract */ function migrate(uint256 nftId, uint256 amount) public { require(_migratable, "migration sealed"); uint256 timestamp = block.timestamp; require(_deadlineBy >= timestamp, "deadline passed"); _token.burn(msg.sender, nftId, amount); require(amount > 0, "non-positive amount"); _mint(msg.sender, nftId, amount, ""); } /** batch import NFTs from old contract */ function migrateBatch(uint256[] memory nftIds, uint256[] memory amounts) public { require(_migratable, "migration sealed"); uint256 timestamp = block.timestamp; require(_deadlineBy >= timestamp, "deadline passed"); _token.burnBatch(msg.sender, nftIds, amounts); for (uint256 i = 0; i < amounts.length; i++) { require(amounts[i] > 0, "non-positive amount"); } _mintBatch(msg.sender, nftIds, amounts, ""); } /** seal migration (manually) */ function seal() public onlyOwner { _migratable = false; } } // File contracts/XPowerNftBase.sol // solhint-disable not-rely-on-time // solhint-disable no-empty-blocks pragma solidity ^0.8.0; /** * Abstract base NFT class: publicly *not* minteable (nor burneable). */ abstract contract XPowerNftBase is ERC1155, ERC1155Burnable, ERC1155Supply, URIMalleable, MigratableNft { /** NFT levels: UNIT, ..., YOTTA *or* higher! */ uint256 public constant UNIT = 0; uint256 public constant KILO = 3; uint256 public constant MEGA = 6; uint256 public constant GIGA = 9; uint256 public constant TERA = 12; uint256 public constant PETA = 15; uint256 public constant EXA = 18; uint256 public constant ZETTA = 21; uint256 public constant YOTTA = 24; /** @param uri meta-data URI */ /** @param base address of old contract */ /** @param deadlineIn seconds to end-of-migration */ constructor( string memory uri, address base, uint256 deadlineIn ) // ERC1155 constructor: meta-data URI ERC1155(uri) // MigratableNft: old contract, rel. deadline [seconds] MigratableNft(base, deadlineIn) {} /** @return nft-id composed of (year, level) */ function idBy(uint256 anno, uint256 level) public pure returns (uint256) { require(level % 3 == 0, "non-ternary level"); require(level < 100, "invalid level"); require(anno > 1970, "invalid year"); return anno * 100 + level; } /** @return nft-ids composed of [(year, level) for level in levels] */ function idsBy(uint256 anno, uint256[] memory levels) public pure returns (uint256[] memory) { uint256[] memory ids = new uint256[](levels.length); for (uint256 i = 0; i < levels.length; i++) { ids[i] = idBy(anno, levels[i]); } return ids; } /** @return denomination of level (1, 1'000, 1'000'000, ...) */ function denominationOf(uint256 level) public pure returns (uint256) { require(level % 3 == 0, "non-ternary level"); require(level < 100, "invalid level"); return 10**level; } /** @return level of nft-id (0, 3, 6, ...) */ function levelOf(uint256 nftId) public pure returns (uint256) { uint256 level = nftId % 100; require(level % 3 == 0, "non-ternary level"); require(level < 100, "invalid level"); return level; } /** @return year of nft-id (2021, 2022, ...) */ function yearOf(uint256 nftId) public pure returns (uint256) { uint256 anno = nftId / 100; require(anno > 1970, "invalid year"); return anno; } /** @return current number of years since anno domini */ function year() public view returns (uint256) { uint256 anno = 1970 + (100 * block.timestamp) / (365_25 days); require(anno > 1970, "invalid year"); return anno; } /** called before any token transfer; includes (batched) minting and burning */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory nftIds, uint256[] memory amounts, bytes memory data ) internal override(ERC1155, ERC1155Supply) { super._beforeTokenTransfer(operator, from, to, nftIds, amounts, data); } } // File contracts/XPowerNft.sol // solhint-disable not-rely-on-time // solhint-disable no-empty-blocks pragma solidity ^0.8.0; /** * Abstract base class for the THOR, LOKI & ODIN proof-of-work NFTs, where each * can only be minted by burning the corresponding amount of tokens. */ contract XPowerNft is XPowerNftBase { /** (Burnable) proof-of-work tokens */ ERC20Burnable private _moe; /** @param uri meta-data URI */ /** @param base address of old contract */ /** @param deadlineIn seconds to end-of-migration */ /** @param moe address of contract for proof-of-work tokens */ constructor( string memory uri, address base, uint256 deadlineIn, address moe ) XPowerNftBase(uri, base, deadlineIn) { _moe = ERC20Burnable(moe); } /** mint particular amount of NFTs for given address and level */ function mint( address to, uint256 level, uint256 amount ) public { uint256 moe = amount * denominationOf(level); require(moe > 0, "non-positive amount"); _moe.burnFrom(to, moe); _mint(to, idBy(year(), level), amount, ""); } /** mint particular amounts of NFTs for given address and levels */ function mintBatch( address to, uint256[] memory levels, uint256[] memory amounts ) public { uint256 moe = 0; for (uint256 i = 0; i < levels.length; i++) { uint256 delta = amounts[i] * denominationOf(levels[i]); require(delta > 0, "non-positive amount"); moe += delta; } _moe.burnFrom(to, moe); _mintBatch(to, idsBy(year(), levels), amounts, ""); } } /** * NFT class for ODIN tokens: Only the latter are allowed to get burned, to * mint ODIN NFTs. */ contract XPowerOdinNft is XPowerNft { constructor( string memory uri, address base, uint256 deadlineIn, address moe ) XPowerNft(uri, base, deadlineIn, moe) {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"address","name":"base","type":"address"},{"internalType":"uint256","name":"deadlineIn","type":"uint256"},{"internalType":"address","name":"moe","type":"address"}],"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":[],"name":"EXA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GIGA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KILO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MEGA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PETA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TERA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YOTTA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZETTA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level","type":"uint256"}],"name":"denominationOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"anno","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"}],"name":"idBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"anno","type":"uint256"},{"internalType":"uint256[]","name":"levels","type":"uint256[]"}],"name":"idsBy","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"pure","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":"uint256","name":"nftId","type":"uint256"}],"name":"levelOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"migrateBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"levels","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seal","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":"string","name":"newuri","type":"string"}],"name":"setURI","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":[{"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":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"year","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"yearOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60806040526007805460ff191660011790553480156200001e57600080fd5b5060405162002f4238038062002f42833981016040819052620000419162000201565b838383838383838181846200005681620000bd565b506200006233620000d6565b6200006e81426200030e565b60065550600580546001600160a01b0319166001600160a01b0392831617905560078054610100600160a81b031916610100969092169590950217909355506200037298505050505050505050565b8051620000d290600290602084019062000128565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001369062000335565b90600052602060002090601f0160209004810192826200015a5760008555620001a5565b82601f106200017557805160ff1916838001178555620001a5565b82800160010185558215620001a5579182015b82811115620001a557825182559160200191906001019062000188565b50620001b3929150620001b7565b5090565b5b80821115620001b35760008155600101620001b8565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620001fc57600080fd5b919050565b600080600080608085870312156200021857600080fd5b84516001600160401b03808211156200023057600080fd5b818701915087601f8301126200024557600080fd5b8151818111156200025a576200025a620001ce565b604051601f8201601f19908116603f01168101908382118183101715620002855762000285620001ce565b81604052828152602093508a84848701011115620002a257600080fd5b600091505b82821015620002c65784820184015181830185015290830190620002a7565b82821115620002d85760008484830101525b9750620002ea915050878201620001e4565b94505050604085015191506200030360608601620001e4565b905092959194509250565b600082198211156200033057634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200034a57607f821691505b602082108114156200036c57634e487b7160e01b600052602260045260246000fd5b50919050565b612bc080620003826000396000f3fe608060405234801561001057600080fd5b506004361061021b5760003560e01c80636d5e303211610125578063cb431e76116100ad578063e985e9c51161007c578063e985e9c514610457578063f242432a14610493578063f2fde38b146104a6578063f3269716146104b9578063f5298aca146104c157600080fd5b8063cb431e761461042c578063d5e5e06214610434578063d81d0a151461043c578063df435be81461044f57600080fd5b80639d8e2177116100f45780639d8e2177146103d6578063a22cb465146103de578063bd85b039146103f1578063c446d55014610411578063c7b8b19d1461041957600080fd5b80636d5e303214610398578063715018a6146103ab57806389c3cbae146103b35780638da5cb5b146103bb57600080fd5b80633e54bacb116101a857806355095bd21161017757806355095bd21461034f5780635925e211146103625780636252e4e71461036a5780636b20c4541461037d5780636c749c261461039057600080fd5b80633e54bacb146102f25780633fb27b85146103055780634e1273f41461030d5780634f558e791461032d57600080fd5b8063156e29f6116101ef578063156e29f61461029e57806329cd827d146102b15780632eb2c2d6146102c45780632ffa2d76146102d7578063361ce97e146102ea57600080fd5b8062fdd58e1461022057806301ffc9a71461024657806302fe5305146102695780630e89341c1461027e575b600080fd5b61023361022e366004611e37565b6104d4565b6040519081526020015b60405180910390f35b610259610254366004611e77565b61056e565b604051901515815260200161023d565b61027c610277366004611f33565b6105be565b005b61029161028c366004611f83565b6105f4565b60405161023d9190611fe9565b61027c6102ac366004611ffc565b610688565b6102336102bf366004611f83565b61075c565b61027c6102d23660046120e3565b6107b1565b61027c6102e536600461218c565b610848565b610233600381565b61027c6103003660046121ef565b6109b1565b61027c610ae2565b61032061031b366004612211565b610b18565b60405161023d91906122ff565b61025961033b366004611f83565b600090815260036020526040902054151590565b61023361035d366004611f83565b610c41565b610233601581565b6102336103783660046121ef565b610c72565b61027c61038b366004612312565b610cfa565b610233601281565b6102336103a6366004611f83565b610d3d565b61027c610d95565b610233600c81565b6004546040516001600160a01b03909116815260200161023d565b610233600081565b61027c6103ec366004612385565b610dcb565b6102336103ff366004611f83565b60009081526003602052604090205490565b610233600981565b6103206104273660046123c1565b610dda565b610233600681565b610233601881565b61027c61044a366004612312565b610e81565b610233600f81565b6102596104653660046123fd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b61027c6104a1366004612430565b610fb0565b61027c6104b4366004612494565b610ff5565b61023361108d565b61027c6104cf366004611ffc565b6110de565b60006001600160a01b0383166105455760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061059f57506001600160e01b031982166303a24d0760e21b145b8061056857506301ffc9a760e01b6001600160e01b0319831614610568565b6004546001600160a01b031633146105e85760405162461bcd60e51b815260040161053c906124af565b6105f181611121565b50565b606060028054610603906124e4565b80601f016020809104026020016040519081016040528092919081815260200182805461062f906124e4565b801561067c5780601f106106515761010080835404028352916020019161067c565b820191906000526020600020905b81548152906001019060200180831161065f57829003601f168201915b50505050509050919050565b60006106938361075c565b61069d9083612535565b9050600081116106bf5760405162461bcd60e51b815260040161053c90612554565b60075460405163079cc67960e41b81526001600160a01b03868116600483015260248201849052610100909204909116906379cc679090604401600060405180830381600087803b15801561071357600080fd5b505af1158015610727573d6000803e3d6000fd5b505050506107568461074061073a61108d565b86610c72565b8460405180602001604052806000815250611134565b50505050565b6000610769600383612597565b156107865760405162461bcd60e51b815260040161053c906125ab565b606482106107a65760405162461bcd60e51b815260040161053c906125d6565b61056882600a6126e1565b6001600160a01b0385163314806107cd57506107cd8533610465565b6108345760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161053c565b610841858585858561120a565b5050505050565b60075460ff1661088d5760405162461bcd60e51b815260206004820152601060248201526f1b5a59dc985d1a5bdb881cd9585b195960821b604482015260640161053c565b60065442908111156108d35760405162461bcd60e51b815260206004820152600f60248201526e191958591b1a5b99481c185cdcd959608a1b604482015260640161053c565b600554604051631ac8311560e21b81526001600160a01b0390911690636b20c45490610907903390879087906004016126ed565b600060405180830381600087803b15801561092157600080fd5b505af1158015610935573d6000803e3d6000fd5b5050505060005b82518110156109905760008382815181106109595761095961272d565b60200260200101511161097e5760405162461bcd60e51b815260040161053c90612554565b8061098881612743565b91505061093c565b506109ac338484604051806020016040528060008152506113b4565b505050565b60075460ff166109f65760405162461bcd60e51b815260206004820152601060248201526f1b5a59dc985d1a5bdb881cd9585b195960821b604482015260640161053c565b6006544290811115610a3c5760405162461bcd60e51b815260206004820152600f60248201526e191958591b1a5b99481c185cdcd959608a1b604482015260640161053c565b600554604051637a94c56560e11b815233600482015260248101859052604481018490526001600160a01b039091169063f5298aca90606401600060405180830381600087803b158015610a8f57600080fd5b505af1158015610aa3573d6000803e3d6000fd5b5050505060008211610ac75760405162461bcd60e51b815260040161053c90612554565b6109ac33848460405180602001604052806000815250611134565b6004546001600160a01b03163314610b0c5760405162461bcd60e51b815260040161053c906124af565b6007805460ff19169055565b60608151835114610b7d5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161053c565b600083516001600160401b03811115610b9857610b98611e94565b604051908082528060200260200182016040528015610bc1578160200160208202803683370190505b50905060005b8451811015610c3957610c0c858281518110610be557610be561272d565b6020026020010151858381518110610bff57610bff61272d565b60200260200101516104d4565b828281518110610c1e57610c1e61272d565b6020908102919091010152610c3281612743565b9050610bc7565b509392505050565b600080610c4f60648461275e565b90506107b281116105685760405162461bcd60e51b815260040161053c90612772565b6000610c7f600383612597565b15610c9c5760405162461bcd60e51b815260040161053c906125ab565b60648210610cbc5760405162461bcd60e51b815260040161053c906125d6565b6107b28311610cdd5760405162461bcd60e51b815260040161053c90612772565b81610ce9846064612535565b610cf39190612798565b9392505050565b6001600160a01b038316331480610d165750610d168333610465565b610d325760405162461bcd60e51b815260040161053c906127b0565b6109ac83838361150e565b600080610d4b606484612597565b9050610d58600382612597565b15610d755760405162461bcd60e51b815260040161053c906125ab565b606481106105685760405162461bcd60e51b815260040161053c906125d6565b6004546001600160a01b03163314610dbf5760405162461bcd60e51b815260040161053c906124af565b610dc9600061169c565b565b610dd63383836116ee565b5050565b6060600082516001600160401b03811115610df757610df7611e94565b604051908082528060200260200182016040528015610e20578160200160208202803683370190505b50905060005b8351811015610c3957610e5285858381518110610e4557610e4561272d565b6020026020010151610c72565b828281518110610e6457610e6461272d565b602090810291909101015280610e7981612743565b915050610e26565b6000805b8351811015610f18576000610eb2858381518110610ea557610ea561272d565b602002602001015161075c565b848381518110610ec457610ec461272d565b6020026020010151610ed69190612535565b905060008111610ef85760405162461bcd60e51b815260040161053c90612554565b610f028184612798565b9250508080610f1090612743565b915050610e85565b5060075460405163079cc67960e41b81526001600160a01b03868116600483015260248201849052610100909204909116906379cc679090604401600060405180830381600087803b158015610f6d57600080fd5b505af1158015610f81573d6000803e3d6000fd5b5050505061075684610f9a610f9461108d565b86610dda565b84604051806020016040528060008152506113b4565b6001600160a01b038516331480610fcc5750610fcc8533610465565b610fe85760405162461bcd60e51b815260040161053c906127b0565b61084185858585856117cf565b6004546001600160a01b0316331461101f5760405162461bcd60e51b815260040161053c906124af565b6001600160a01b0381166110845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161053c565b6105f18161169c565b60008063bc1913806110a0426064612535565b6110aa919061275e565b6110b6906107b2612798565b90506107b281116110d95760405162461bcd60e51b815260040161053c90612772565b919050565b6001600160a01b0383163314806110fa57506110fa8333610465565b6111165760405162461bcd60e51b815260040161053c906127b0565b6109ac8383836118ec565b8051610dd6906002906020840190611d87565b6001600160a01b03841661115a5760405162461bcd60e51b815260040161053c906127f9565b3361117a8160008761116b886119ed565b611174886119ed565b87611a38565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906111aa908490612798565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461084181600087878787611a46565b815183511461122b5760405162461bcd60e51b815260040161053c9061283a565b6001600160a01b0384166112515760405162461bcd60e51b815260040161053c90612882565b33611260818787878787611a38565b60005b84518110156113465760008582815181106112805761128061272d565b60200260200101519050600085838151811061129e5761129e61272d565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156112ee5760405162461bcd60e51b815260040161053c906128c7565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061132b908490612798565b925050819055505050508061133f90612743565b9050611263565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611396929190612911565b60405180910390a46113ac818787878787611bb1565b505050505050565b6001600160a01b0384166113da5760405162461bcd60e51b815260040161053c906127f9565b81518351146113fb5760405162461bcd60e51b815260040161053c9061283a565b3361140b81600087878787611a38565b60005b84518110156114a6578381815181106114295761142961272d565b60200260200101516000808784815181106114465761144661272d565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020600082825461148e9190612798565b9091555081905061149e81612743565b91505061140e565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516114f7929190612911565b60405180910390a461084181600087878787611bb1565b6001600160a01b0383166115345760405162461bcd60e51b815260040161053c9061293f565b80518251146115555760405162461bcd60e51b815260040161053c9061283a565b600033905061157881856000868660405180602001604052806000815250611a38565b60005b835181101561163d5760008482815181106115985761159861272d565b6020026020010151905060008483815181106115b6576115b661272d565b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156116065760405162461bcd60e51b815260040161053c90612982565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061163581612743565b91505061157b565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161168e929190612911565b60405180910390a450505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156117625760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161053c565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166117f55760405162461bcd60e51b815260040161053c90612882565b3361180581878761116b886119ed565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156118465760405162461bcd60e51b815260040161053c906128c7565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611883908490612798565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46118e3828888888888611a46565b50505050505050565b6001600160a01b0383166119125760405162461bcd60e51b815260040161053c9061293f565b3361194181856000611923876119ed565b61192c876119ed565b60405180602001604052806000815250611a38565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156119825760405162461bcd60e51b815260040161053c90612982565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611a2757611a2761272d565b602090810291909101015292915050565b6113ac868686868686611c7b565b6001600160a01b0384163b156113ac5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611a8a90899089908890889088906004016129c6565b602060405180830381600087803b158015611aa457600080fd5b505af1925050508015611ad4575060408051601f3d908101601f19168201909252611ad191810190612a0b565b60015b611b8157611ae0612a28565b806308c379a01415611b1a5750611af5612a44565b80611b005750611b1c565b8060405162461bcd60e51b815260040161053c9190611fe9565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161053c565b6001600160e01b0319811663f23a6e6160e01b146118e35760405162461bcd60e51b815260040161053c90612acd565b6001600160a01b0384163b156113ac5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611bf59089908990889088908890600401612b15565b602060405180830381600087803b158015611c0f57600080fd5b505af1925050508015611c3f575060408051601f3d908101601f19168201909252611c3c91810190612a0b565b60015b611c4b57611ae0612a28565b6001600160e01b0319811663bc197c8160e01b146118e35760405162461bcd60e51b815260040161053c90612acd565b6001600160a01b038516611d025760005b8351811015611d0057828181518110611ca757611ca761272d565b602002602001015160036000868481518110611cc557611cc561272d565b602002602001015181526020019081526020016000206000828254611cea9190612798565b90915550611cf9905081612743565b9050611c8c565b505b6001600160a01b0384166113ac5760005b83518110156118e357828181518110611d2e57611d2e61272d565b602002602001015160036000868481518110611d4c57611d4c61272d565b602002602001015181526020019081526020016000206000828254611d719190612b73565b90915550611d80905081612743565b9050611d13565b828054611d93906124e4565b90600052602060002090601f016020900481019282611db55760008555611dfb565b82601f10611dce57805160ff1916838001178555611dfb565b82800160010185558215611dfb579182015b82811115611dfb578251825591602001919060010190611de0565b50611e07929150611e0b565b5090565b5b80821115611e075760008155600101611e0c565b80356001600160a01b03811681146110d957600080fd5b60008060408385031215611e4a57600080fd5b611e5383611e20565b946020939093013593505050565b6001600160e01b0319811681146105f157600080fd5b600060208284031215611e8957600080fd5b8135610cf381611e61565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715611ecf57611ecf611e94565b6040525050565b60006001600160401b03831115611eef57611eef611e94565b604051611f06601f8501601f191660200182611eaa565b809150838152848484011115611f1b57600080fd5b83836020830137600060208583010152509392505050565b600060208284031215611f4557600080fd5b81356001600160401b03811115611f5b57600080fd5b8201601f81018413611f6c57600080fd5b611f7b84823560208401611ed6565b949350505050565b600060208284031215611f9557600080fd5b5035919050565b6000815180845260005b81811015611fc257602081850181015186830182015201611fa6565b81811115611fd4576000602083870101525b50601f01601f19169290920160200192915050565b602081526000610cf36020830184611f9c565b60008060006060848603121561201157600080fd5b61201a84611e20565b95602085013595506040909401359392505050565b60006001600160401b0382111561204857612048611e94565b5060051b60200190565b600082601f83011261206357600080fd5b813560206120708261202f565b60405161207d8282611eaa565b83815260059390931b850182019282810191508684111561209d57600080fd5b8286015b848110156120b857803583529183019183016120a1565b509695505050505050565b600082601f8301126120d457600080fd5b610cf383833560208501611ed6565b600080600080600060a086880312156120fb57600080fd5b61210486611e20565b945061211260208701611e20565b935060408601356001600160401b038082111561212e57600080fd5b61213a89838a01612052565b9450606088013591508082111561215057600080fd5b61215c89838a01612052565b9350608088013591508082111561217257600080fd5b5061217f888289016120c3565b9150509295509295909350565b6000806040838503121561219f57600080fd5b82356001600160401b03808211156121b657600080fd5b6121c286838701612052565b935060208501359150808211156121d857600080fd5b506121e585828601612052565b9150509250929050565b6000806040838503121561220257600080fd5b50508035926020909101359150565b6000806040838503121561222457600080fd5b82356001600160401b038082111561223b57600080fd5b818501915085601f83011261224f57600080fd5b8135602061225c8261202f565b6040516122698282611eaa565b83815260059390931b850182019282810191508984111561228957600080fd5b948201945b838610156122ae5761229f86611e20565b8252948201949082019061228e565b965050860135925050808211156121d857600080fd5b600081518084526020808501945080840160005b838110156122f4578151875295820195908201906001016122d8565b509495945050505050565b602081526000610cf360208301846122c4565b60008060006060848603121561232757600080fd5b61233084611e20565b925060208401356001600160401b038082111561234c57600080fd5b61235887838801612052565b9350604086013591508082111561236e57600080fd5b5061237b86828701612052565b9150509250925092565b6000806040838503121561239857600080fd5b6123a183611e20565b9150602083013580151581146123b657600080fd5b809150509250929050565b600080604083850312156123d457600080fd5b8235915060208301356001600160401b038111156123f157600080fd5b6121e585828601612052565b6000806040838503121561241057600080fd5b61241983611e20565b915061242760208401611e20565b90509250929050565b600080600080600060a0868803121561244857600080fd5b61245186611e20565b945061245f60208701611e20565b9350604086013592506060860135915060808601356001600160401b0381111561248857600080fd5b61217f888289016120c3565b6000602082840312156124a657600080fd5b610cf382611e20565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806124f857607f821691505b6020821081141561251957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561254f5761254f61251f565b500290565b6020808252601390820152721b9bdb8b5c1bdcda5d1a5d9948185b5bdd5b9d606a1b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b6000826125a6576125a6612581565b500690565b6020808252601190820152701b9bdb8b5d195c9b985c9e481b195d995b607a1b604082015260600190565b6020808252600d908201526c1a5b9d985b1a59081b195d995b609a1b604082015260600190565b600181815b8085111561263857816000190482111561261e5761261e61251f565b8085161561262b57918102915b93841c9390800290612602565b509250929050565b60008261264f57506001610568565b8161265c57506000610568565b8160018114612672576002811461267c57612698565b6001915050610568565b60ff84111561268d5761268d61251f565b50506001821b610568565b5060208310610133831016604e8410600b84101617156126bb575081810a610568565b6126c583836125fd565b80600019048211156126d9576126d961251f565b029392505050565b6000610cf38383612640565b6001600160a01b0384168152606060208201819052600090612711908301856122c4565b828103604084015261272381856122c4565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156127575761275761251f565b5060010190565b60008261276d5761276d612581565b500490565b6020808252600c908201526b34b73b30b634b2103cb2b0b960a11b604082015260600190565b600082198211156127ab576127ab61251f565b500190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061292460408301856122c4565b828103602084015261293681856122c4565b95945050505050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612a0090830184611f9c565b979650505050505050565b600060208284031215612a1d57600080fd5b8151610cf381611e61565b600060033d1115612a415760046000803e5060005160e01c5b90565b600060443d1015612a525790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612a8157505050505090565b8285019150815181811115612a995750505050505090565b843d8701016020828501011115612ab35750505050505090565b612ac260208286010187611eaa565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090612b41908301866122c4565b8281036060840152612b5381866122c4565b90508281036080840152612b678185611f9c565b98975050505050505050565b600082821015612b8557612b8561251f565b50039056fea2646970667358221220b3a5baaa8a01cc919221c3167d46acad4b60f12faeacd0d52498e6cc082168a064736f6c634300080900330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000a4b204720b49c2f60e837435ed6eca97c6bd65520000000000000000000000000000000000000000000000000000000007861f80000000000000000000000000a18cd7e596aaa98a697d0511ed87dd19ac981afb000000000000000000000000000000000000000000000000000000000000002e68747470733a2f2f7777772e78706f7765726d696e652e636f6d2f6e6674732f6f64696e2f7b69647d2e6a736f6e000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000a4b204720b49c2f60e837435ed6eca97c6bd65520000000000000000000000000000000000000000000000000000000007861f80000000000000000000000000a18cd7e596aaa98a697d0511ed87dd19ac981afb000000000000000000000000000000000000000000000000000000000000002e68747470733a2f2f7777772e78706f7765726d696e652e636f6d2f6e6674732f6f64696e2f7b69647d2e6a736f6e000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : uri (string): https://www.xpowermine.com/nfts/odin/{id}.json
Arg [1] : base (address): 0xa4b204720b49c2f60e837435ed6eca97c6bd6552
Arg [2] : deadlineIn (uint256): 126230400
Arg [3] : moe (address): 0xa18cd7e596aaa98a697d0511ed87dd19ac981afb
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 000000000000000000000000a4b204720b49c2f60e837435ed6eca97c6bd6552
Arg [2] : 0000000000000000000000000000000000000000000000000000000007861f80
Arg [3] : 000000000000000000000000a18cd7e596aaa98a697d0511ed87dd19ac981afb
Arg [4] : 000000000000000000000000000000000000000000000000000000000000002e
Arg [5] : 68747470733a2f2f7777772e78706f7765726d696e652e636f6d2f6e6674732f
Arg [6] : 6f64696e2f7b69647d2e6a736f6e000000000000000000000000000000000000
Deployed ByteCode Sourcemap
65165:207:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38659:231;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;38659:231:0;;;;;;;;37682:310;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;37682:310:0;1019:187:1;57899:89:0;;;;;;:::i;:::-;;:::i;:::-;;38403:105;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;64204:297::-;;;;;;:::i;:::-;;:::i;61858:207::-;;;;;;:::i;:::-;;:::i;40598:442::-;;;;;;:::i;:::-;;:::i;59296:486::-;;;;;;:::i;:::-;;:::i;60330:32::-;;60361:1;60330:32;;58868:372;;;;;;:::i;:::-;;:::i;59828:71::-;;;:::i;39056:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;54220:122::-;;;;;;:::i;:::-;54277:4;54098:16;;;:12;:16;;;;;;-1:-1:-1;;;54220:122:0;62419:175;;;;;;:::i;:::-;;:::i;60566:34::-;;60598:2;60566:34;;61135:267;;;;;;:::i;:::-;;:::i;52922:353::-;;;;;;:::i;:::-;;:::i;60527:32::-;;60557:2;60527:32;;62124:234;;;;;;:::i;:::-;;:::i;56792:103::-;;;:::i;60447:33::-;;60478:2;60447:33;;56141:87;56214:6;;56141:87;;-1:-1:-1;;;;;56214:6:0;;;9424:51:1;;9412:2;9397:18;56141:87:0;9278:203:1;60291:32:0;;60322:1;60291:32;;39653:155;;;;;;:::i;:::-;;:::i;54009:113::-;;;;;;:::i;:::-;54071:7;54098:16;;;:12;:16;;;;;;;54009:113;60408:32;;60439:1;60408:32;;61486:295;;;;;;:::i;:::-;;:::i;60369:32::-;;60400:1;60369:32;;60607:34;;60639:2;60607:34;;64582:469;;;;;;:::i;:::-;;:::i;60487:33::-;;60518:2;60487:33;;39880:168;;;;;;:::i;:::-;-1:-1:-1;;;;;40003:27:0;;;39979:4;40003:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;39880:168;40120:401;;;;;;:::i;:::-;;:::i;57050:201::-;;;;;;:::i;:::-;;:::i;62664:195::-;;;:::i;52593:321::-;;;;;;:::i;:::-;;:::i;38659:231::-;38745:7;-1:-1:-1;;;;;38773:21:0;;38765:77;;;;-1:-1:-1;;;38765:77:0;;11528:2:1;38765:77:0;;;11510:21:1;11567:2;11547:18;;;11540:30;11606:34;11586:18;;;11579:62;-1:-1:-1;;;11657:18:1;;;11650:41;11708:19;;38765:77:0;;;;;;;;;-1:-1:-1;38860:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;38860:22:0;;;;;;;;;;38659:231;;;;;:::o;37682:310::-;37784:4;-1:-1:-1;;;;;;37821:41:0;;-1:-1:-1;;;37821:41:0;;:110;;-1:-1:-1;;;;;;;37879:52:0;;-1:-1:-1;;;37879:52:0;37821:110;:163;;;-1:-1:-1;;;;;;;;;;36560:40:0;;;37948:36;36451:157;57899:89;56214:6;;-1:-1:-1;;;;;56214:6:0;4478:10;56361:23;56353:68;;;;-1:-1:-1;;;56353:68:0;;;;;;;:::i;:::-;57965:15:::1;57973:6;57965:7;:15::i;:::-;57899:89:::0;:::o;38403:105::-;38463:13;38496:4;38489:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38403:105;;;:::o;64204:297::-;64313:11;64336:21;64351:5;64336:14;:21::i;:::-;64327:30;;:6;:30;:::i;:::-;64313:44;;64382:1;64376:3;:7;64368:39;;;;-1:-1:-1;;;64368:39:0;;;;;;;:::i;:::-;64418:4;;:22;;-1:-1:-1;;;64418:22:0;;-1:-1:-1;;;;;13329:32:1;;;64418:22:0;;;13311:51:1;13378:18;;;13371:34;;;64418:4:0;;;;;;;;:13;;13284:18:1;;64418:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64451:42;64457:2;64461:19;64466:6;:4;:6::i;:::-;64474:5;64461:4;:19::i;:::-;64482:6;64451:42;;;;;;;;;;;;:5;:42::i;:::-;64302:199;64204:297;;;:::o;61858:207::-;61918:7;61946:9;61954:1;61946:5;:9;:::i;:::-;:14;61938:44;;;;-1:-1:-1;;;61938:44:0;;;;;;;:::i;:::-;62009:3;62001:5;:11;61993:37;;;;-1:-1:-1;;;61993:37:0;;;;;;;:::i;:::-;62048:9;62052:5;62048:2;:9;:::i;40598:442::-;-1:-1:-1;;;;;40831:20:0;;4478:10;40831:20;;:60;;-1:-1:-1;40855:36:0;40872:4;4478:10;39880:168;:::i;40855:36::-;40809:160;;;;-1:-1:-1;;;40809:160:0;;15929:2:1;40809:160:0;;;15911:21:1;15968:2;15948:18;;;15941:30;16007:34;15987:18;;;15980:62;-1:-1:-1;;;16058:18:1;;;16051:48;16116:19;;40809:160:0;15727:414:1;40809:160:0;40980:52;41003:4;41009:2;41013:3;41018:7;41027:4;40980:22;:52::i;:::-;40598:442;;;;;:::o;59296:486::-;59395:11;;;;59387:40;;;;-1:-1:-1;;;59387:40:0;;16348:2:1;59387:40:0;;;16330:21:1;16387:2;16367:18;;;16360:30;-1:-1:-1;;;16406:18:1;;;16399:46;16462:18;;59387:40:0;16146:340:1;59387:40:0;59492:11;;59458:15;;59492:24;-1:-1:-1;59492:24:0;59484:52;;;;-1:-1:-1;;;59484:52:0;;16693:2:1;59484:52:0;;;16675:21:1;16732:2;16712:18;;;16705:30;-1:-1:-1;;;16751:18:1;;;16744:45;16806:18;;59484:52:0;16491:339:1;59484:52:0;59547:6;;:45;;-1:-1:-1;;;59547:45:0;;-1:-1:-1;;;;;59547:6:0;;;;:16;;:45;;59564:10;;59576:6;;59584:7;;59547:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59608:9;59603:118;59627:7;:14;59623:1;:18;59603:118;;;59684:1;59671:7;59679:1;59671:10;;;;;;;;:::i;:::-;;;;;;;:14;59663:46;;;;-1:-1:-1;;;59663:46:0;;;;;;;:::i;:::-;59643:3;;;;:::i;:::-;;;;59603:118;;;;59731:43;59742:10;59754:6;59762:7;59731:43;;;;;;;;;;;;:10;:43::i;:::-;59376:406;59296:486;;:::o;58868:372::-;58942:11;;;;58934:40;;;;-1:-1:-1;;;58934:40:0;;16348:2:1;58934:40:0;;;16330:21:1;16387:2;16367:18;;;16360:30;-1:-1:-1;;;16406:18:1;;;16399:46;16462:18;;58934:40:0;16146:340:1;58934:40:0;59039:11;;59005:15;;59039:24;-1:-1:-1;59039:24:0;59031:52;;;;-1:-1:-1;;;59031:52:0;;16693:2:1;59031:52:0;;;16675:21:1;16732:2;16712:18;;;16705:30;-1:-1:-1;;;16751:18:1;;;16744:45;16806:18;;59031:52:0;16491:339:1;59031:52:0;59094:6;;:38;;-1:-1:-1;;;59094:38:0;;59106:10;59094:38;;;17876:51:1;17943:18;;;17936:34;;;17986:18;;;17979:34;;;-1:-1:-1;;;;;59094:6:0;;;;:11;;17849:18:1;;59094:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59160:1;59151:6;:10;59143:42;;;;-1:-1:-1;;;59143:42:0;;;;;;;:::i;:::-;59196:36;59202:10;59214:5;59221:6;59196:36;;;;;;;;;;;;:5;:36::i;59828:71::-;56214:6;;-1:-1:-1;;;;;56214:6:0;4478:10;56361:23;56353:68;;;;-1:-1:-1;;;56353:68:0;;;;;;;:::i;:::-;59872:11:::1;:19:::0;;-1:-1:-1;;59872:19:0::1;::::0;;59828:71::o;39056:524::-;39212:16;39273:3;:10;39254:8;:15;:29;39246:83;;;;-1:-1:-1;;;39246:83:0;;18226:2:1;39246:83:0;;;18208:21:1;18265:2;18245:18;;;18238:30;18304:34;18284:18;;;18277:62;-1:-1:-1;;;18355:18:1;;;18348:39;18404:19;;39246:83:0;18024:405:1;39246:83:0;39342:30;39389:8;:15;-1:-1:-1;;;;;39375:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39375:30:0;;39342:63;;39423:9;39418:122;39442:8;:15;39438:1;:19;39418:122;;;39498:30;39508:8;39517:1;39508:11;;;;;;;;:::i;:::-;;;;;;;39521:3;39525:1;39521:6;;;;;;;;:::i;:::-;;;;;;;39498:9;:30::i;:::-;39479:13;39493:1;39479:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;39459:3;;;:::i;:::-;;;39418:122;;;-1:-1:-1;39559:13:0;39056:524;-1:-1:-1;;;39056:524:0:o;62419:175::-;62471:7;;62506:11;62514:3;62506:5;:11;:::i;:::-;62491:26;;62543:4;62536;:11;62528:36;;;;-1:-1:-1;;;62528:36:0;;;;;;;:::i;61135:267::-;61199:7;61227:9;61235:1;61227:5;:9;:::i;:::-;:14;61219:44;;;;-1:-1:-1;;;61219:44:0;;;;;;;:::i;:::-;61290:3;61282:5;:11;61274:37;;;;-1:-1:-1;;;61274:37:0;;;;;;;:::i;:::-;61337:4;61330;:11;61322:36;;;;-1:-1:-1;;;61322:36:0;;;;;;;:::i;:::-;61389:5;61376:10;:4;61383:3;61376:10;:::i;:::-;:18;;;;:::i;:::-;61369:25;61135:267;-1:-1:-1;;;61135:267:0:o;52922:353::-;-1:-1:-1;;;;;53087:23:0;;4478:10;53087:23;;:66;;-1:-1:-1;53114:39:0;53131:7;4478:10;39880:168;:::i;53114:39::-;53065:157;;;;-1:-1:-1;;;53065:157:0;;;;;;;:::i;:::-;53235:32;53246:7;53255:3;53260:6;53235:10;:32::i;62124:234::-;62177:7;;62213:11;62221:3;62213:5;:11;:::i;:::-;62197:27;-1:-1:-1;62243:9:0;62251:1;62197:27;62243:9;:::i;:::-;:14;62235:44;;;;-1:-1:-1;;;62235:44:0;;;;;;;:::i;:::-;62306:3;62298:5;:11;62290:37;;;;-1:-1:-1;;;62290:37:0;;;;;;;:::i;56792:103::-;56214:6;;-1:-1:-1;;;;;56214:6:0;4478:10;56361:23;56353:68;;;;-1:-1:-1;;;56353:68:0;;;;;;;:::i;:::-;56857:30:::1;56884:1;56857:18;:30::i;:::-;56792:103::o:0;39653:155::-;39748:52;4478:10;39781:8;39791;39748:18;:52::i;:::-;39653:155;;:::o;61486:295::-;61561:16;61590:20;61627:6;:13;-1:-1:-1;;;;;61613:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61613:28:0;;61590:51;;61657:9;61652:101;61676:6;:13;61672:1;:17;61652:101;;;61720:21;61725:4;61731:6;61738:1;61731:9;;;;;;;;:::i;:::-;;;;;;;61720:4;:21::i;:::-;61711:3;61715:1;61711:6;;;;;;;;:::i;:::-;;;;;;;;;;:30;61691:3;;;;:::i;:::-;;;;61652:101;;64582:469;64716:11;64747:9;64742:208;64766:6;:13;64762:1;:17;64742:208;;;64801:13;64830:25;64845:6;64852:1;64845:9;;;;;;;;:::i;:::-;;;;;;;64830:14;:25::i;:::-;64817:7;64825:1;64817:10;;;;;;;;:::i;:::-;;;;;;;:38;;;;:::i;:::-;64801:54;;64886:1;64878:5;:9;64870:41;;;;-1:-1:-1;;;64870:41:0;;;;;;;:::i;:::-;64926:12;64933:5;64926:12;;:::i;:::-;;;64786:164;64781:3;;;;;:::i;:::-;;;;64742:208;;;-1:-1:-1;64960:4:0;;:22;;-1:-1:-1;;;64960:22:0;;-1:-1:-1;;;;;13329:32:1;;;64960:22:0;;;13311:51:1;13378:18;;;13371:34;;;64960:4:0;;;;;;;;:13;;13284:18:1;;64960:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64993:50;65004:2;65008:21;65014:6;:4;:6::i;:::-;65022;65008:5;:21::i;:::-;65031:7;64993:50;;;;;;;;;;;;:10;:50::i;40120:401::-;-1:-1:-1;;;;;40328:20:0;;4478:10;40328:20;;:60;;-1:-1:-1;40352:36:0;40369:4;4478:10;39880:168;:::i;40352:36::-;40306:151;;;;-1:-1:-1;;;40306:151:0;;;;;;;:::i;:::-;40468:45;40486:4;40492:2;40496;40500:6;40508:4;40468:17;:45::i;57050:201::-;56214:6;;-1:-1:-1;;;;;56214:6:0;4478:10;56361:23;56353:68;;;;-1:-1:-1;;;56353:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57139:22:0;::::1;57131:73;;;::::0;-1:-1:-1;;;57131:73:0;;19645:2:1;57131:73:0::1;::::0;::::1;19627:21:1::0;19684:2;19664:18;;;19657:30;19723:34;19703:18;;;19696:62;-1:-1:-1;;;19774:18:1;;;19767:36;19820:19;;57131:73:0::1;19443:402:1::0;57131:73:0::1;57215:28;57234:8;57215:18;:28::i;62664:195::-:0;62701:7;;62770:11;62744:21;62750:15;62744:3;:21;:::i;:::-;62743:39;;;;:::i;:::-;62736:46;;:4;:46;:::i;:::-;62721:61;;62808:4;62801;:11;62793:36;;;;-1:-1:-1;;;62793:36:0;;;;;;;:::i;:::-;62847:4;62664:195;-1:-1:-1;62664:195:0:o;52593:321::-;-1:-1:-1;;;;;52733:23:0;;4478:10;52733:23;;:66;;-1:-1:-1;52760:39:0;52777:7;4478:10;39880:168;:::i;52760:39::-;52711:157;;;;-1:-1:-1;;;52711:157:0;;;;;;;:::i;:::-;52881:25;52887:7;52896:2;52900:5;52881;:25::i;44600:88::-;44667:13;;;;:4;;:13;;;;;:::i;45074:569::-;-1:-1:-1;;;;;45227:16:0;;45219:62;;;;-1:-1:-1;;;45219:62:0;;;;;;;:::i;:::-;4478:10;45338:102;4478:10;45294:16;45381:2;45385:21;45403:2;45385:17;:21::i;:::-;45408:25;45426:6;45408:17;:25::i;:::-;45435:4;45338:20;:102::i;:::-;45453:9;:13;;;;;;;;;;;-1:-1:-1;;;;;45453:17:0;;;;;;;;;:27;;45474:6;;45453:9;:27;;45474:6;;45453:27;:::i;:::-;;;;-1:-1:-1;;45496:52:0;;;20426:25:1;;;20482:2;20467:18;;20460:34;;;-1:-1:-1;;;;;45496:52:0;;;;45529:1;;45496:52;;;;;;20399:18:1;45496:52:0;;;;;;;45561:74;45592:8;45610:1;45614:2;45618;45622:6;45630:4;45561:30;:74::i;42682:1074::-;42909:7;:14;42895:3;:10;:28;42887:81;;;;-1:-1:-1;;;42887:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42987:16:0;;42979:66;;;;-1:-1:-1;;;42979:66:0;;;;;;;:::i;:::-;4478:10;43102:60;4478:10;43133:4;43139:2;43143:3;43148:7;43157:4;43102:20;:60::i;:::-;43180:9;43175:421;43199:3;:10;43195:1;:14;43175:421;;;43231:10;43244:3;43248:1;43244:6;;;;;;;;:::i;:::-;;;;;;;43231:19;;43265:14;43282:7;43290:1;43282:10;;;;;;;;:::i;:::-;;;;;;;;;;;;43309:19;43331:13;;;;;;;;;;-1:-1:-1;;;;;43331:19:0;;;;;;;;;;;;43282:10;;-1:-1:-1;43373:21:0;;;;43365:76;;;;-1:-1:-1;;;43365:76:0;;;;;;;:::i;:::-;43485:9;:13;;;;;;;;;;;-1:-1:-1;;;;;43485:19:0;;;;;;;;;;43507:20;;;43485:42;;43557:17;;;;;;;:27;;43507:20;;43485:9;43557:27;;43507:20;;43557:27;:::i;:::-;;;;;;;;43216:380;;;43211:3;;;;:::i;:::-;;;43175:421;;;;43643:2;-1:-1:-1;;;;;43613:47:0;43637:4;-1:-1:-1;;;;;43613:47:0;43627:8;-1:-1:-1;;;;;43613:47:0;;43647:3;43652:7;43613:47;;;;;;;:::i;:::-;;;;;;;;43673:75;43709:8;43719:4;43725:2;43729:3;43734:7;43743:4;43673:35;:75::i;:::-;42876:880;42682:1074;;;;;:::o;45999:735::-;-1:-1:-1;;;;;46177:16:0;;46169:62;;;;-1:-1:-1;;;46169:62:0;;;;;;;:::i;:::-;46264:7;:14;46250:3;:10;:28;46242:81;;;;-1:-1:-1;;;46242:81:0;;;;;;;:::i;:::-;4478:10;46380:66;4478:10;46336:16;46423:2;46427:3;46432:7;46441:4;46380:20;:66::i;:::-;46464:9;46459:103;46483:3;:10;46479:1;:14;46459:103;;;46540:7;46548:1;46540:10;;;;;;;;:::i;:::-;;;;;;;46515:9;:17;46525:3;46529:1;46525:6;;;;;;;;:::i;:::-;;;;;;;46515:17;;;;;;;;;;;:21;46533:2;-1:-1:-1;;;;;46515:21:0;-1:-1:-1;;;;;46515:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;46495:3:0;;-1:-1:-1;46495:3:0;;;:::i;:::-;;;;46459:103;;;;46615:2;-1:-1:-1;;;;;46579:53:0;46611:1;-1:-1:-1;;;;;46579:53:0;46593:8;-1:-1:-1;;;;;46579:53:0;;46619:3;46624:7;46579:53;;;;;;;:::i;:::-;;;;;;;;46645:81;46681:8;46699:1;46703:2;46707:3;46712:7;46721:4;46645:35;:81::i;47835:891::-;-1:-1:-1;;;;;47987:18:0;;47979:66;;;;-1:-1:-1;;;47979:66:0;;;;;;;:::i;:::-;48078:7;:14;48064:3;:10;:28;48056:81;;;;-1:-1:-1;;;48056:81:0;;;;;;;:::i;:::-;48150:16;4478:10;48150:31;;48194:66;48215:8;48225:4;48239:1;48243:3;48248:7;48194:66;;;;;;;;;;;;:20;:66::i;:::-;48278:9;48273:373;48297:3;:10;48293:1;:14;48273:373;;;48329:10;48342:3;48346:1;48342:6;;;;;;;;:::i;:::-;;;;;;;48329:19;;48363:14;48380:7;48388:1;48380:10;;;;;;;;:::i;:::-;;;;;;;;;;;;48407:19;48429:13;;;;;;;;;;-1:-1:-1;;;;;48429:19:0;;;;;;;;;;;;48380:10;;-1:-1:-1;48471:21:0;;;;48463:70;;;;-1:-1:-1;;;48463:70:0;;;;;;;:::i;:::-;48577:9;:13;;;;;;;;;;;-1:-1:-1;;;;;48577:19:0;;;;;;;;;;48599:20;;48577:42;;48309:3;;;;:::i;:::-;;;;48273:373;;;;48701:1;-1:-1:-1;;;;;48663:55:0;48687:4;-1:-1:-1;;;;;48663:55:0;48677:8;-1:-1:-1;;;;;48663:55:0;;48705:3;48710:7;48663:55;;;;;;;:::i;:::-;;;;;;;;47968:758;47835:891;;;:::o;57411:191::-;57504:6;;;-1:-1:-1;;;;;57521:17:0;;;-1:-1:-1;;;;;;57521:17:0;;;;;;;57554:40;;57504:6;;;57521:17;57504:6;;57554:40;;57485:16;;57554:40;57474:128;57411:191;:::o;48868:331::-;49023:8;-1:-1:-1;;;;;49014:17:0;:5;-1:-1:-1;;;;;49014:17:0;;;49006:71;;;;-1:-1:-1;;;49006:71:0;;23212:2:1;49006:71:0;;;23194:21:1;23251:2;23231:18;;;23224:30;23290:34;23270:18;;;23263:62;-1:-1:-1;;;23341:18:1;;;23334:39;23390:19;;49006:71:0;23010:405:1;49006:71:0;-1:-1:-1;;;;;49088:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;49088:46:0;;;;;;;;;;49150:41;;1159::1;;;49150::0;;1132:18:1;49150:41:0;;;;;;;48868:331;;;:::o;41504:820::-;-1:-1:-1;;;;;41692:16:0;;41684:66;;;;-1:-1:-1;;;41684:66:0;;;;;;;:::i;:::-;4478:10;41807:96;4478:10;41838:4;41844:2;41848:21;41866:2;41848:17;:21::i;41807:96::-;41916:19;41938:13;;;;;;;;;;;-1:-1:-1;;;;;41938:19:0;;;;;;;;;;41976:21;;;;41968:76;;;;-1:-1:-1;;;41968:76:0;;;;;;;:::i;:::-;42080:9;:13;;;;;;;;;;;-1:-1:-1;;;;;42080:19:0;;;;;;;;;;42102:20;;;42080:42;;42144:17;;;;;;;:27;;42102:20;;42080:9;42144:27;;42102:20;;42144:27;:::i;:::-;;;;-1:-1:-1;;42189:46:0;;;20426:25:1;;;20482:2;20467:18;;20460:34;;;-1:-1:-1;;;;;42189:46:0;;;;;;;;;;;;;;20399:18:1;42189:46:0;;;;;;;42248:68;42279:8;42289:4;42295:2;42299;42303:6;42311:4;42248:30;:68::i;:::-;41673:651;;41504:820;;;;;:::o;46984:648::-;-1:-1:-1;;;;;47111:18:0;;47103:66;;;;-1:-1:-1;;;47103:66:0;;;;;;;:::i;:::-;4478:10;47226:102;4478:10;47257:4;47182:16;47275:21;47293:2;47275:17;:21::i;:::-;47298:25;47316:6;47298:17;:25::i;:::-;47226:102;;;;;;;;;;;;:20;:102::i;:::-;47341:19;47363:13;;;;;;;;;;;-1:-1:-1;;;;;47363:19:0;;;;;;;;;;47401:21;;;;47393:70;;;;-1:-1:-1;;;47393:70:0;;;;;;;:::i;:::-;47499:9;:13;;;;;;;;;;;-1:-1:-1;;;;;47499:19:0;;;;;;;;;;;;47521:20;;;47499:42;;47570:54;;20426:25:1;;;20467:18;;;20460:34;;;47499:19:0;;47570:54;;;;;;20399:18:1;47570:54:0;;;;;;;47092:540;;46984:648;;;:::o;51957:198::-;52077:16;;;52091:1;52077:16;;;;;;;;;52023;;52052:22;;52077:16;;;;;;;;;;;;-1:-1:-1;52077:16:0;52052:41;;52115:7;52104:5;52110:1;52104:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;52142:5;51957:198;-1:-1:-1;;51957:198:0:o;62952:335::-;63210:69;63237:8;63247:4;63253:2;63257:6;63265:7;63274:4;63210:26;:69::i;50384:744::-;-1:-1:-1;;;;;50599:13:0;;28611:19;:23;50595:526;;50635:72;;-1:-1:-1;;;50635:72:0;;-1:-1:-1;;;;;50635:38:0;;;;;:72;;50674:8;;50684:4;;50690:2;;50694:6;;50702:4;;50635:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50635:72:0;;;;;;;;-1:-1:-1;;50635:72:0;;;;;;;;;;;;:::i;:::-;;;50631:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;50983:6;50976:14;;-1:-1:-1;;;50976:14:0;;;;;;;;:::i;50631:479::-;;;51032:62;;-1:-1:-1;;;51032:62:0;;25302:2:1;51032:62:0;;;25284:21:1;25341:2;25321:18;;;25314:30;25380:34;25360:18;;;25353:62;-1:-1:-1;;;25431:18:1;;;25424:50;25491:19;;51032:62:0;25100:416:1;50631:479:0;-1:-1:-1;;;;;;50757:55:0;;-1:-1:-1;;;50757:55:0;50753:154;;50837:50;;-1:-1:-1;;;50837:50:0;;;;;;;:::i;51136:813::-;-1:-1:-1;;;;;51376:13:0;;28611:19;:23;51372:570;;51412:79;;-1:-1:-1;;;51412:79:0;;-1:-1:-1;;;;;51412:43:0;;;;;:79;;51456:8;;51466:4;;51472:3;;51477:7;;51486:4;;51412:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51412:79:0;;;;;;;;-1:-1:-1;;51412:79:0;;;;;;;;;;;;:::i;:::-;;;51408:523;;;;:::i;:::-;-1:-1:-1;;;;;;51573:60:0;;-1:-1:-1;;;51573:60:0;51569:159;;51658:50;;-1:-1:-1;;;51658:50:0;;;;;;;:::i;54417:655::-;-1:-1:-1;;;;;54739:18:0;;54735:160;;54779:9;54774:110;54798:3;:10;54794:1;:14;54774:110;;;54858:7;54866:1;54858:10;;;;;;;;:::i;:::-;;;;;;;54834:12;:20;54847:3;54851:1;54847:6;;;;;;;;:::i;:::-;;;;;;;54834:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;54810:3:0;;-1:-1:-1;54810:3:0;;:::i;:::-;;;54774:110;;;;54735:160;-1:-1:-1;;;;;54911:16:0;;54907:158;;54949:9;54944:110;54968:3;:10;54964:1;:14;54944:110;;;55028:7;55036:1;55028:10;;;;;;;;:::i;:::-;;;;;;;55004:12;:20;55017:3;55021:1;55017:6;;;;;;;;:::i;:::-;;;;;;;55004:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;54980:3:0;;-1:-1:-1;54980:3:0;;:::i;:::-;;;54944:110;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:254;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:127::-;1272:10;1267:3;1263:20;1260:1;1253:31;1303:4;1300:1;1293:15;1327:4;1324:1;1317:15;1343:249;1453:2;1434:13;;-1:-1:-1;;1430:27:1;1418:40;;-1:-1:-1;;;;;1473:34:1;;1509:22;;;1470:62;1467:88;;;1535:18;;:::i;:::-;1571:2;1564:22;-1:-1:-1;;1343:249:1:o;1597:469::-;1662:5;-1:-1:-1;;;;;1688:6:1;1685:30;1682:56;;;1718:18;;:::i;:::-;1767:2;1761:9;1779:69;1836:2;1815:15;;-1:-1:-1;;1811:29:1;1842:4;1807:40;1761:9;1779:69;:::i;:::-;1866:6;1857:15;;1896:6;1888;1881:22;1936:3;1927:6;1922:3;1918:16;1915:25;1912:45;;;1953:1;1950;1943:12;1912:45;2003:6;1998:3;1991:4;1983:6;1979:17;1966:44;2058:1;2051:4;2042:6;2034;2030:19;2026:30;2019:41;;1597:469;;;;;:::o;2071:451::-;2140:6;2193:2;2181:9;2172:7;2168:23;2164:32;2161:52;;;2209:1;2206;2199:12;2161:52;2249:9;2236:23;-1:-1:-1;;;;;2274:6:1;2271:30;2268:50;;;2314:1;2311;2304:12;2268:50;2337:22;;2390:4;2382:13;;2378:27;-1:-1:-1;2368:55:1;;2419:1;2416;2409:12;2368:55;2442:74;2508:7;2503:2;2490:16;2485:2;2481;2477:11;2442:74;:::i;:::-;2432:84;2071:451;-1:-1:-1;;;;2071:451:1:o;2527:180::-;2586:6;2639:2;2627:9;2618:7;2614:23;2610:32;2607:52;;;2655:1;2652;2645:12;2607:52;-1:-1:-1;2678:23:1;;2527:180;-1:-1:-1;2527:180:1:o;2712:472::-;2754:3;2792:5;2786:12;2819:6;2814:3;2807:19;2844:1;2854:162;2868:6;2865:1;2862:13;2854:162;;;2930:4;2986:13;;;2982:22;;2976:29;2958:11;;;2954:20;;2947:59;2883:12;2854:162;;;3034:6;3031:1;3028:13;3025:87;;;3100:1;3093:4;3084:6;3079:3;3075:16;3071:27;3064:38;3025:87;-1:-1:-1;3166:2:1;3145:15;-1:-1:-1;;3141:29:1;3132:39;;;;3173:4;3128:50;;2712:472;-1:-1:-1;;2712:472:1:o;3189:220::-;3338:2;3327:9;3320:21;3301:4;3358:45;3399:2;3388:9;3384:18;3376:6;3358:45;:::i;3414:322::-;3491:6;3499;3507;3560:2;3548:9;3539:7;3535:23;3531:32;3528:52;;;3576:1;3573;3566:12;3528:52;3599:29;3618:9;3599:29;:::i;:::-;3589:39;3675:2;3660:18;;3647:32;;-1:-1:-1;3726:2:1;3711:18;;;3698:32;;3414:322;-1:-1:-1;;;3414:322:1:o;3741:183::-;3801:4;-1:-1:-1;;;;;3826:6:1;3823:30;3820:56;;;3856:18;;:::i;:::-;-1:-1:-1;3901:1:1;3897:14;3913:4;3893:25;;3741:183::o;3929:724::-;3983:5;4036:3;4029:4;4021:6;4017:17;4013:27;4003:55;;4054:1;4051;4044:12;4003:55;4090:6;4077:20;4116:4;4139:43;4179:2;4139:43;:::i;:::-;4211:2;4205:9;4223:31;4251:2;4243:6;4223:31;:::i;:::-;4289:18;;;4381:1;4377:10;;;;4365:23;;4361:32;;;4323:15;;;;-1:-1:-1;4405:15:1;;;4402:35;;;4433:1;4430;4423:12;4402:35;4469:2;4461:6;4457:15;4481:142;4497:6;4492:3;4489:15;4481:142;;;4563:17;;4551:30;;4601:12;;;;4514;;4481:142;;;-1:-1:-1;4641:6:1;3929:724;-1:-1:-1;;;;;;3929:724:1:o;4658:221::-;4700:5;4753:3;4746:4;4738:6;4734:17;4730:27;4720:55;;4771:1;4768;4761:12;4720:55;4793:80;4869:3;4860:6;4847:20;4840:4;4832:6;4828:17;4793:80;:::i;4884:943::-;5038:6;5046;5054;5062;5070;5123:3;5111:9;5102:7;5098:23;5094:33;5091:53;;;5140:1;5137;5130:12;5091:53;5163:29;5182:9;5163:29;:::i;:::-;5153:39;;5211:38;5245:2;5234:9;5230:18;5211:38;:::i;:::-;5201:48;;5300:2;5289:9;5285:18;5272:32;-1:-1:-1;;;;;5364:2:1;5356:6;5353:14;5350:34;;;5380:1;5377;5370:12;5350:34;5403:61;5456:7;5447:6;5436:9;5432:22;5403:61;:::i;:::-;5393:71;;5517:2;5506:9;5502:18;5489:32;5473:48;;5546:2;5536:8;5533:16;5530:36;;;5562:1;5559;5552:12;5530:36;5585:63;5640:7;5629:8;5618:9;5614:24;5585:63;:::i;:::-;5575:73;;5701:3;5690:9;5686:19;5673:33;5657:49;;5731:2;5721:8;5718:16;5715:36;;;5747:1;5744;5737:12;5715:36;;5770:51;5813:7;5802:8;5791:9;5787:24;5770:51;:::i;:::-;5760:61;;;4884:943;;;;;;;;:::o;5832:595::-;5950:6;5958;6011:2;5999:9;5990:7;5986:23;5982:32;5979:52;;;6027:1;6024;6017:12;5979:52;6067:9;6054:23;-1:-1:-1;;;;;6137:2:1;6129:6;6126:14;6123:34;;;6153:1;6150;6143:12;6123:34;6176:61;6229:7;6220:6;6209:9;6205:22;6176:61;:::i;:::-;6166:71;;6290:2;6279:9;6275:18;6262:32;6246:48;;6319:2;6309:8;6306:16;6303:36;;;6335:1;6332;6325:12;6303:36;;6358:63;6413:7;6402:8;6391:9;6387:24;6358:63;:::i;:::-;6348:73;;;5832:595;;;;;:::o;6432:248::-;6500:6;6508;6561:2;6549:9;6540:7;6536:23;6532:32;6529:52;;;6577:1;6574;6567:12;6529:52;-1:-1:-1;;6600:23:1;;;6670:2;6655:18;;;6642:32;;-1:-1:-1;6432:248:1:o;6685:1208::-;6803:6;6811;6864:2;6852:9;6843:7;6839:23;6835:32;6832:52;;;6880:1;6877;6870:12;6832:52;6920:9;6907:23;-1:-1:-1;;;;;6990:2:1;6982:6;6979:14;6976:34;;;7006:1;7003;6996:12;6976:34;7044:6;7033:9;7029:22;7019:32;;7089:7;7082:4;7078:2;7074:13;7070:27;7060:55;;7111:1;7108;7101:12;7060:55;7147:2;7134:16;7169:4;7192:43;7232:2;7192:43;:::i;:::-;7264:2;7258:9;7276:31;7304:2;7296:6;7276:31;:::i;:::-;7342:18;;;7430:1;7426:10;;;;7418:19;;7414:28;;;7376:15;;;;-1:-1:-1;7454:19:1;;;7451:39;;;7486:1;7483;7476:12;7451:39;7510:11;;;;7530:148;7546:6;7541:3;7538:15;7530:148;;;7612:23;7631:3;7612:23;:::i;:::-;7600:36;;7563:12;;;;7656;;;;7530:148;;;7697:6;-1:-1:-1;;7741:18:1;;7728:32;;-1:-1:-1;;7772:16:1;;;7769:36;;;7801:1;7798;7791:12;7898:435;7951:3;7989:5;7983:12;8016:6;8011:3;8004:19;8042:4;8071:2;8066:3;8062:12;8055:19;;8108:2;8101:5;8097:14;8129:1;8139:169;8153:6;8150:1;8147:13;8139:169;;;8214:13;;8202:26;;8248:12;;;;8283:15;;;;8175:1;8168:9;8139:169;;;-1:-1:-1;8324:3:1;;7898:435;-1:-1:-1;;;;;7898:435:1:o;8338:261::-;8517:2;8506:9;8499:21;8480:4;8537:56;8589:2;8578:9;8574:18;8566:6;8537:56;:::i;8604:669::-;8731:6;8739;8747;8800:2;8788:9;8779:7;8775:23;8771:32;8768:52;;;8816:1;8813;8806:12;8768:52;8839:29;8858:9;8839:29;:::i;:::-;8829:39;;8919:2;8908:9;8904:18;8891:32;-1:-1:-1;;;;;8983:2:1;8975:6;8972:14;8969:34;;;8999:1;8996;8989:12;8969:34;9022:61;9075:7;9066:6;9055:9;9051:22;9022:61;:::i;:::-;9012:71;;9136:2;9125:9;9121:18;9108:32;9092:48;;9165:2;9155:8;9152:16;9149:36;;;9181:1;9178;9171:12;9149:36;;9204:63;9259:7;9248:8;9237:9;9233:24;9204:63;:::i;:::-;9194:73;;;8604:669;;;;;:::o;9486:347::-;9551:6;9559;9612:2;9600:9;9591:7;9587:23;9583:32;9580:52;;;9628:1;9625;9618:12;9580:52;9651:29;9670:9;9651:29;:::i;:::-;9641:39;;9730:2;9719:9;9715:18;9702:32;9777:5;9770:13;9763:21;9756:5;9753:32;9743:60;;9799:1;9796;9789:12;9743:60;9822:5;9812:15;;;9486:347;;;;;:::o;9838:416::-;9931:6;9939;9992:2;9980:9;9971:7;9967:23;9963:32;9960:52;;;10008:1;10005;9998:12;9960:52;10044:9;10031:23;10021:33;;10105:2;10094:9;10090:18;10077:32;-1:-1:-1;;;;;10124:6:1;10121:30;10118:50;;;10164:1;10161;10154:12;10118:50;10187:61;10240:7;10231:6;10220:9;10216:22;10187:61;:::i;10259:260::-;10327:6;10335;10388:2;10376:9;10367:7;10363:23;10359:32;10356:52;;;10404:1;10401;10394:12;10356:52;10427:29;10446:9;10427:29;:::i;:::-;10417:39;;10475:38;10509:2;10498:9;10494:18;10475:38;:::i;:::-;10465:48;;10259:260;;;;;:::o;10524:606::-;10628:6;10636;10644;10652;10660;10713:3;10701:9;10692:7;10688:23;10684:33;10681:53;;;10730:1;10727;10720:12;10681:53;10753:29;10772:9;10753:29;:::i;:::-;10743:39;;10801:38;10835:2;10824:9;10820:18;10801:38;:::i;:::-;10791:48;;10886:2;10875:9;10871:18;10858:32;10848:42;;10937:2;10926:9;10922:18;10909:32;10899:42;;10992:3;10981:9;10977:19;10964:33;-1:-1:-1;;;;;11012:6:1;11009:30;11006:50;;;11052:1;11049;11042:12;11006:50;11075:49;11116:7;11107:6;11096:9;11092:22;11075:49;:::i;11135:186::-;11194:6;11247:2;11235:9;11226:7;11222:23;11218:32;11215:52;;;11263:1;11260;11253:12;11215:52;11286:29;11305:9;11286:29;:::i;11738:356::-;11940:2;11922:21;;;11959:18;;;11952:30;12018:34;12013:2;11998:18;;11991:62;12085:2;12070:18;;11738:356::o;12099:380::-;12178:1;12174:12;;;;12221;;;12242:61;;12296:4;12288:6;12284:17;12274:27;;12242:61;12349:2;12341:6;12338:14;12318:18;12315:38;12312:161;;;12395:10;12390:3;12386:20;12383:1;12376:31;12430:4;12427:1;12420:15;12458:4;12455:1;12448:15;12312:161;;12099:380;;;:::o;12484:127::-;12545:10;12540:3;12536:20;12533:1;12526:31;12576:4;12573:1;12566:15;12600:4;12597:1;12590:15;12616:168;12656:7;12722:1;12718;12714:6;12710:14;12707:1;12704:21;12699:1;12692:9;12685:17;12681:45;12678:71;;;12729:18;;:::i;:::-;-1:-1:-1;12769:9:1;;12616:168::o;12789:343::-;12991:2;12973:21;;;13030:2;13010:18;;;13003:30;-1:-1:-1;;;13064:2:1;13049:18;;13042:49;13123:2;13108:18;;12789:343::o;13416:127::-;13477:10;13472:3;13468:20;13465:1;13458:31;13508:4;13505:1;13498:15;13532:4;13529:1;13522:15;13548:112;13580:1;13606;13596:35;;13611:18;;:::i;:::-;-1:-1:-1;13645:9:1;;13548:112::o;13665:341::-;13867:2;13849:21;;;13906:2;13886:18;;;13879:30;-1:-1:-1;;;13940:2:1;13925:18;;13918:47;13997:2;13982:18;;13665:341::o;14011:337::-;14213:2;14195:21;;;14252:2;14232:18;;;14225:30;-1:-1:-1;;;14286:2:1;14271:18;;14264:43;14339:2;14324:18;;14011:337::o;14353:422::-;14442:1;14485:5;14442:1;14499:270;14520:7;14510:8;14507:21;14499:270;;;14579:4;14575:1;14571:6;14567:17;14561:4;14558:27;14555:53;;;14588:18;;:::i;:::-;14638:7;14628:8;14624:22;14621:55;;;14658:16;;;;14621:55;14737:22;;;;14697:15;;;;14499:270;;;14503:3;14353:422;;;;;:::o;14780:806::-;14829:5;14859:8;14849:80;;-1:-1:-1;14900:1:1;14914:5;;14849:80;14948:4;14938:76;;-1:-1:-1;14985:1:1;14999:5;;14938:76;15030:4;15048:1;15043:59;;;;15116:1;15111:130;;;;15023:218;;15043:59;15073:1;15064:10;;15087:5;;;15111:130;15148:3;15138:8;15135:17;15132:43;;;15155:18;;:::i;:::-;-1:-1:-1;;15211:1:1;15197:16;;15226:5;;15023:218;;15325:2;15315:8;15312:16;15306:3;15300:4;15297:13;15293:36;15287:2;15277:8;15274:16;15269:2;15263:4;15260:12;15256:35;15253:77;15250:159;;;-1:-1:-1;15362:19:1;;;15394:5;;15250:159;15441:34;15466:8;15460:4;15441:34;:::i;:::-;15511:6;15507:1;15503:6;15499:19;15490:7;15487:32;15484:58;;;15522:18;;:::i;:::-;15560:20;;14780:806;-1:-1:-1;;;14780:806:1:o;15591:131::-;15651:5;15680:36;15707:8;15701:4;15680:36;:::i;16835:562::-;-1:-1:-1;;;;;17120:32:1;;17102:51;;17189:2;17184;17169:18;;17162:30;;;-1:-1:-1;;17215:56:1;;17252:18;;17244:6;17215:56;:::i;:::-;17319:9;17311:6;17307:22;17302:2;17291:9;17287:18;17280:50;17347:44;17384:6;17376;17347:44;:::i;:::-;17339:52;16835:562;-1:-1:-1;;;;;;16835:562:1:o;17402:127::-;17463:10;17458:3;17454:20;17451:1;17444:31;17494:4;17491:1;17484:15;17518:4;17515:1;17508:15;17534:135;17573:3;-1:-1:-1;;17594:17:1;;17591:43;;;17614:18;;:::i;:::-;-1:-1:-1;17661:1:1;17650:13;;17534:135::o;18434:120::-;18474:1;18500;18490:35;;18505:18;;:::i;:::-;-1:-1:-1;18539:9:1;;18434:120::o;18559:336::-;18761:2;18743:21;;;18800:2;18780:18;;;18773:30;-1:-1:-1;;;18834:2:1;18819:18;;18812:42;18886:2;18871:18;;18559:336::o;18900:128::-;18940:3;18971:1;18967:6;18964:1;18961:13;18958:39;;;18977:18;;:::i;:::-;-1:-1:-1;19013:9:1;;18900:128::o;19033:405::-;19235:2;19217:21;;;19274:2;19254:18;;;19247:30;19313:34;19308:2;19293:18;;19286:62;-1:-1:-1;;;19379:2:1;19364:18;;19357:39;19428:3;19413:19;;19033:405::o;19850:397::-;20052:2;20034:21;;;20091:2;20071:18;;;20064:30;20130:34;20125:2;20110:18;;20103:62;-1:-1:-1;;;20196:2:1;20181:18;;20174:31;20237:3;20222:19;;19850:397::o;20505:404::-;20707:2;20689:21;;;20746:2;20726:18;;;20719:30;20785:34;20780:2;20765:18;;20758:62;-1:-1:-1;;;20851:2:1;20836:18;;20829:38;20899:3;20884:19;;20505:404::o;20914:401::-;21116:2;21098:21;;;21155:2;21135:18;;;21128:30;21194:34;21189:2;21174:18;;21167:62;-1:-1:-1;;;21260:2:1;21245:18;;21238:35;21305:3;21290:19;;20914:401::o;21320:406::-;21522:2;21504:21;;;21561:2;21541:18;;;21534:30;21600:34;21595:2;21580:18;;21573:62;-1:-1:-1;;;21666:2:1;21651:18;;21644:40;21716:3;21701:19;;21320:406::o;21731:465::-;21988:2;21977:9;21970:21;21951:4;22014:56;22066:2;22055:9;22051:18;22043:6;22014:56;:::i;:::-;22118:9;22110:6;22106:22;22101:2;22090:9;22086:18;22079:50;22146:44;22183:6;22175;22146:44;:::i;:::-;22138:52;21731:465;-1:-1:-1;;;;;21731:465:1:o;22201:399::-;22403:2;22385:21;;;22442:2;22422:18;;;22415:30;22481:34;22476:2;22461:18;;22454:62;-1:-1:-1;;;22547:2:1;22532:18;;22525:33;22590:3;22575:19;;22201:399::o;22605:400::-;22807:2;22789:21;;;22846:2;22826:18;;;22819:30;22885:34;22880:2;22865:18;;22858:62;-1:-1:-1;;;22951:2:1;22936:18;;22929:34;22995:3;22980:19;;22605:400::o;23420:561::-;-1:-1:-1;;;;;23717:15:1;;;23699:34;;23769:15;;23764:2;23749:18;;23742:43;23816:2;23801:18;;23794:34;;;23859:2;23844:18;;23837:34;;;23679:3;23902;23887:19;;23880:32;;;23642:4;;23929:46;;23955:19;;23947:6;23929:46;:::i;:::-;23921:54;23420:561;-1:-1:-1;;;;;;;23420:561:1:o;23986:249::-;24055:6;24108:2;24096:9;24087:7;24083:23;24079:32;24076:52;;;24124:1;24121;24114:12;24076:52;24156:9;24150:16;24175:30;24199:5;24175:30;:::i;24240:179::-;24275:3;24317:1;24299:16;24296:23;24293:120;;;24363:1;24360;24357;24342:23;-1:-1:-1;24400:1:1;24394:8;24389:3;24385:18;24293:120;24240:179;:::o;24424:671::-;24463:3;24505:4;24487:16;24484:26;24481:39;;;24424:671;:::o;24481:39::-;24547:2;24541:9;-1:-1:-1;;24612:16:1;24608:25;;24605:1;24541:9;24584:50;24663:4;24657:11;24687:16;-1:-1:-1;;;;;24793:2:1;24786:4;24778:6;24774:17;24771:25;24766:2;24758:6;24755:14;24752:45;24749:58;;;24800:5;;;;;24424:671;:::o;24749:58::-;24837:6;24831:4;24827:17;24816:28;;24873:3;24867:10;24900:2;24892:6;24889:14;24886:27;;;24906:5;;;;;;24424:671;:::o;24886:27::-;24990:2;24971:16;24965:4;24961:27;24957:36;24950:4;24941:6;24936:3;24932:16;24928:27;24925:69;24922:82;;;24997:5;;;;;;24424:671;:::o;24922:82::-;25013:57;25064:4;25055:6;25047;25043:19;25039:30;25033:4;25013:57;:::i;:::-;-1:-1:-1;25086:3:1;;24424:671;-1:-1:-1;;;;;24424:671:1:o;25521:404::-;25723:2;25705:21;;;25762:2;25742:18;;;25735:30;25801:34;25796:2;25781:18;;25774:62;-1:-1:-1;;;25867:2:1;25852:18;;25845:38;25915:3;25900:19;;25521:404::o;25930:827::-;-1:-1:-1;;;;;26327:15:1;;;26309:34;;26379:15;;26374:2;26359:18;;26352:43;26289:3;26426:2;26411:18;;26404:31;;;26252:4;;26458:57;;26495:19;;26487:6;26458:57;:::i;:::-;26563:9;26555:6;26551:22;26546:2;26535:9;26531:18;26524:50;26597:44;26634:6;26626;26597:44;:::i;:::-;26583:58;;26690:9;26682:6;26678:22;26672:3;26661:9;26657:19;26650:51;26718:33;26744:6;26736;26718:33;:::i;:::-;26710:41;25930:827;-1:-1:-1;;;;;;;;25930:827:1:o;26762:125::-;26802:4;26830:1;26827;26824:8;26821:34;;;26835:18;;:::i;:::-;-1:-1:-1;26872:9:1;;26762:125::o
Swarm Source
ipfs://b3a5baaa8a01cc919221c3167d46acad4b60f12faeacd0d52498e6cc082168a0