Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 5 from a total of 5 transactions
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MintableOwnableToken
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-06-03 */ pragma solidity ^0.5.0; pragma experimental ABIEncoderV2; /* * @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 GSN 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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @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. * * 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. */ 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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _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 onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } contract SignerRole is Context { using Roles for Roles.Role; event SignerAdded(address indexed account); event SignerRemoved(address indexed account); Roles.Role private _signers; constructor () internal { _addSigner(_msgSender()); } modifier onlySigner() { require(isSigner(_msgSender()), "SignerRole: caller does not have the Signer role"); _; } function isSigner(address account) public view returns (bool) { return _signers.has(account); } function addSigner(address account) public onlySigner { _addSigner(account); } function renounceSigner() public { _removeSigner(_msgSender()); } function _addSigner(address account) internal { _signers.add(account); emit SignerAdded(account); } function _removeSigner(address account) internal { _signers.remove(account); emit SignerRemoved(account); } } /** * @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); } /** * @dev Required interface of an ERC721 compliant contract. */ contract IERC721 is IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of NFTs in `owner`'s account. */ function balanceOf(address owner) public view returns (uint256 balance); /** * @dev Returns the owner of the NFT specified by `tokenId`. */ function ownerOf(uint256 tokenId) public view returns (address owner); /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * * * Requirements: * - `from`, `to` cannot be zero. * - `tokenId` must be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this * NFT by either {approve} or {setApprovalForAll}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public; /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * Requirements: * - If the caller is not `from`, it must be approved to move this NFT by * either {approve} or {setApprovalForAll}. */ function transferFrom(address from, address to, uint256 tokenId) public; function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a {IERC721-safeTransferFrom}. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onERC721Received.selector`. This * function MAY throw to revert and reject the transfer. * Note: the ERC721 contract address is always the message sender. * @param operator The address which called `safeTransferFrom` function * @param from The address which previously owned the token * @param tokenId The NFT identifier which is being transferred * @param data Additional data with no specified format * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4); } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @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]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath} * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never * directly accessed. */ library Counters { using SafeMath for uint256; struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { // The {SafeMath} overflow check can be skipped here, see the comment at the top counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721 { using SafeMath for uint256; using Address for address; using Counters for Counters.Counter; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from token ID to owner mapping (uint256 => address) private _tokenOwner; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to number of owned token mapping (address => Counters.Counter) private _ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; constructor () public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); } /** * @dev Gets the balance of the specified address. * @param owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address owner) public view returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _ownedTokensCount[owner].current(); } /** * @dev Gets the owner of the specified token ID. * @param tokenId uint256 ID of the token to query the owner of * @return address currently marked as the owner of the given token ID */ function ownerOf(uint256 tokenId) public view returns (address) { address owner = _tokenOwner[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param to address to be approved for the given token ID * @param tokenId uint256 ID of the token to be approved */ function approve(address to, uint256 tokenId) public { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 tokenId) public view returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev Sets or unsets the approval of a given operator * An operator is allowed to transfer all tokens of the sender on their behalf. * @param to operator address to set the approval * @param approved representing the status of the approval to be set */ function setApprovalForAll(address to, bool approved) public { require(to != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][to] = approved; emit ApprovalForAll(_msgSender(), to, approved); } /** * @dev Tells whether an operator is approved by a given owner. * @param owner owner address which you want to query the approval of * @param operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ function isApprovedForAll(address owner, address operator) public view returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Transfers the ownership of a given token ID to another address. * Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * Requires the msg.sender to be the owner, approved, or operator. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom(address from, address to, uint256 tokenId) public { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transferFrom(from, to, tokenId); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the _msgSender() to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransferFrom(from, to, tokenId, _data); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function _safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) internal { _transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether the specified token exists. * @param tokenId uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists(uint256 tokenId) internal view returns (bool) { address owner = _tokenOwner[tokenId]; return owner != address(0); } /** * @dev Returns whether the given spender can transfer a given token ID. * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Internal function to safely mint a new token. * Reverts if the given token ID already exists. * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _safeMint(address to, uint256 tokenId) internal { _safeMint(to, tokenId, ""); } /** * @dev Internal function to safely mint a new token. * Reverts if the given token ID already exists. * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted * @param _data bytes data to send along with a safe transfer check */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Internal function to mint a new token. * Reverts if the given token ID already exists. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _tokenOwner[tokenId] = to; _ownedTokensCount[to].increment(); emit Transfer(address(0), to, tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * Deprecated, use {_burn} instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned */ function _burn(address owner, uint256 tokenId) internal { require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own"); _clearApproval(tokenId); _ownedTokensCount[owner].decrement(); _tokenOwner[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * @param tokenId uint256 ID of the token being burned */ function _burn(uint256 tokenId) internal { _burn(ownerOf(tokenId), tokenId); } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transferFrom(address from, address to, uint256 tokenId) internal { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _clearApproval(tokenId); _ownedTokensCount[from].decrement(); _ownedTokensCount[to].increment(); _tokenOwner[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * This is an internal detail of the `ERC721` contract and its use is deprecated. * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) { if (!to.isContract()) { return true; } // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = to.call(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data )); if (!success) { if (returndata.length > 0) { // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert("ERC721: transfer to non ERC721Receiver implementer"); } } else { bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } } /** * @dev Private function to clear current approval of a given token ID. * @param tokenId uint256 ID of the token to be transferred */ function _clearApproval(uint256 tokenId) private { if (_tokenApprovals[tokenId] != address(0)) { _tokenApprovals[tokenId] = address(0); } } } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract IERC721Metadata is IERC721 { function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ contract ERC721Burnable is Context, ERC721 { /** * @dev Burns a specific ERC721 token. * @param tokenId uint256 id of the ERC721 token to be burned. */ function burn(uint256 tokenId) public { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract IERC721Enumerable is IERC721 { function totalSupply() public view returns (uint256); function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId); function tokenByIndex(uint256 index) public view returns (uint256); } /** * @title ERC-721 Non-Fungible Token with optional enumeration extension logic * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721Enumerable is Context, ERC165, ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => uint256[]) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Constructor function. */ constructor () public { // register the supported interface to conform to ERC721Enumerable via ERC165 _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev Gets the token ID at a given index of the tokens list of the requested owner. * @param owner address owning the tokens list to be accessed * @param index uint256 representing the index to be accessed of the requested tokens list * @return uint256 token ID at the given index of the tokens list owned by the requested address */ function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) { require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev Gets the total amount of tokens stored by the contract. * @return uint256 representing the total amount of tokens */ function totalSupply() public view returns (uint256) { return _allTokens.length; } /** * @dev Gets the token ID at a given index of all the tokens in this contract * Reverts if the index is greater or equal to the total number of tokens. * @param index uint256 representing the index to be accessed of the tokens list * @return uint256 token ID at the given index of the tokens list */ function tokenByIndex(uint256 index) public view returns (uint256) { require(index < totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to transferFrom, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transferFrom(address from, address to, uint256 tokenId) internal { super._transferFrom(from, to, tokenId); _removeTokenFromOwnerEnumeration(from, tokenId); _addTokenToOwnerEnumeration(to, tokenId); } /** * @dev Internal function to mint a new token. * Reverts if the given token ID already exists. * @param to address the beneficiary that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal { super._mint(to, tokenId); _addTokenToOwnerEnumeration(to, tokenId); _addTokenToAllTokensEnumeration(tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * Deprecated, use {ERC721-_burn} instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned */ function _burn(address owner, uint256 tokenId) internal { super._burn(owner, tokenId); _removeTokenFromOwnerEnumeration(owner, tokenId); // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund _ownedTokensIndex[tokenId] = 0; _removeTokenFromAllTokensEnumeration(tokenId); } /** * @dev Gets the list of token IDs of the requested owner. * @param owner address owning the tokens * @return uint256[] List of token IDs owned by the requested address */ function _tokensOfOwner(address owner) internal view returns (uint256[] storage) { return _ownedTokens[owner]; } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { _ownedTokensIndex[tokenId] = _ownedTokens[to].length; _ownedTokens[to].push(tokenId); } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _ownedTokens[from].length.sub(1); uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array _ownedTokens[from].length--; // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by // lastTokenId, or just over the end of the array if the token was the last one). } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length.sub(1); uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array _allTokens.length--; _allTokensIndex[tokenId] = 0; } } library UintLibrary { function toString(uint256 _i) internal pure returns (string memory) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len - 1; while (_i != 0) { bstr[k--] = byte(uint8(48 + _i % 10)); _i /= 10; } return string(bstr); } } library StringLibrary { using UintLibrary for uint256; function append(string memory _a, string memory _b) internal pure returns (string memory) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory bab = new bytes(_ba.length + _bb.length); uint k = 0; for (uint i = 0; i < _ba.length; i++) bab[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) bab[k++] = _bb[i]; return string(bab); } function append(string memory _a, string memory _b, string memory _c) internal pure returns (string memory) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory _bc = bytes(_c); bytes memory bbb = new bytes(_ba.length + _bb.length + _bc.length); uint k = 0; for (uint i = 0; i < _ba.length; i++) bbb[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) bbb[k++] = _bb[i]; for (uint i = 0; i < _bc.length; i++) bbb[k++] = _bc[i]; return string(bbb); } function recover(string memory message, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { bytes memory msgBytes = bytes(message); bytes memory fullMessage = concat( bytes("\x19Ethereum Signed Message:\n"), bytes(msgBytes.length.toString()), msgBytes, new bytes(0), new bytes(0), new bytes(0), new bytes(0) ); return ecrecover(keccak256(fullMessage), v, r, s); } function concat(bytes memory _ba, bytes memory _bb, bytes memory _bc, bytes memory _bd, bytes memory _be, bytes memory _bf, bytes memory _bg) internal pure returns (bytes memory) { bytes memory resultBytes = new bytes(_ba.length + _bb.length + _bc.length + _bd.length + _be.length + _bf.length + _bg.length); uint k = 0; for (uint i = 0; i < _ba.length; i++) resultBytes[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) resultBytes[k++] = _bb[i]; for (uint i = 0; i < _bc.length; i++) resultBytes[k++] = _bc[i]; for (uint i = 0; i < _bd.length; i++) resultBytes[k++] = _bd[i]; for (uint i = 0; i < _be.length; i++) resultBytes[k++] = _be[i]; for (uint i = 0; i < _bf.length; i++) resultBytes[k++] = _bf[i]; for (uint i = 0; i < _bg.length; i++) resultBytes[k++] = _bg[i]; return resultBytes; } } contract HasContractURI is ERC165 { string public contractURI; /* * bytes4(keccak256('contractURI()')) == 0xe8a3d485 */ bytes4 private constant _INTERFACE_ID_CONTRACT_URI = 0xe8a3d485; constructor(string memory _contractURI) public { contractURI = _contractURI; _registerInterface(_INTERFACE_ID_CONTRACT_URI); } /** * @dev Internal function to set the contract URI * @param _contractURI string URI prefix to assign */ function _setContractURI(string memory _contractURI) internal { contractURI = _contractURI; } } contract HasTokenURI { using StringLibrary for string; //Token URI prefix string public tokenURIPrefix; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; constructor(string memory _tokenURIPrefix) public { tokenURIPrefix = _tokenURIPrefix; } /** * @dev Returns an URI for a given token ID. * Throws if the token ID does not exist. May return an empty string. * @param tokenId uint256 ID of the token to query */ function _tokenURI(uint256 tokenId) internal view returns (string memory) { return tokenURIPrefix.append(_tokenURIs[tokenId]); } /** * @dev Internal function to set the token URI for a given token. * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to set its URI * @param uri string URI to assign */ function _setTokenURI(uint256 tokenId, string memory uri) internal { _tokenURIs[tokenId] = uri; } /** * @dev Internal function to set the token URI prefix. * @param _tokenURIPrefix string URI prefix to assign */ function _setTokenURIPrefix(string memory _tokenURIPrefix) internal { tokenURIPrefix = _tokenURIPrefix; } function _clearTokenURI(uint256 tokenId) internal { if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } contract HasSecondarySaleFees is ERC165 { event SecondarySaleFees(uint256 tokenId, address[] recipients, uint[] bps); /* * bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f * bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb * * => 0x0ebd4c7f ^ 0xb9c4d9fb == 0xb7799584 */ bytes4 private constant _INTERFACE_ID_FEES = 0xb7799584; constructor() public { _registerInterface(_INTERFACE_ID_FEES); } function getFeeRecipients(uint256 id) public view returns (address payable[] memory); function getFeeBps(uint256 id) public view returns (uint[] memory); } /** * @title Full ERC721 Token with support for tokenURIPrefix * This implementation includes all the required and some optional functionality of the ERC721 standard * Moreover, it includes approve all functionality using operator terminology * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721Base is HasSecondarySaleFees, ERC721, HasContractURI, HasTokenURI, ERC721Enumerable { // Token name string public name; // Token symbol string public symbol; struct Fee { address payable recipient; uint256 value; } // id => fees mapping (uint256 => Fee[]) public fees; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /** * @dev Constructor function */ constructor (string memory _name, string memory _symbol, string memory contractURI, string memory _tokenURIPrefix) HasContractURI(contractURI) HasTokenURI(_tokenURIPrefix) public { name = _name; symbol = _symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721_METADATA); } function getFeeRecipients(uint256 id) public view returns (address payable[] memory) { Fee[] memory _fees = fees[id]; address payable[] memory result = new address payable[](_fees.length); for (uint i = 0; i < _fees.length; i++) { result[i] = _fees[i].recipient; } return result; } function getFeeBps(uint256 id) public view returns (uint[] memory) { Fee[] memory _fees = fees[id]; uint[] memory result = new uint[](_fees.length); for (uint i = 0; i < _fees.length; i++) { result[i] = _fees[i].value; } return result; } function _mint(address to, uint256 tokenId, Fee[] memory _fees) internal { _mint(to, tokenId); address[] memory recipients = new address[](_fees.length); uint[] memory bps = new uint[](_fees.length); for (uint i = 0; i < _fees.length; i++) { require(_fees[i].recipient != address(0x0), "Recipient should be present"); require(_fees[i].value != 0, "Fee value should be positive"); fees[tokenId].push(_fees[i]); recipients[i] = _fees[i].recipient; bps[i] = _fees[i].value; } if (_fees.length > 0) { emit SecondarySaleFees(tokenId, recipients, bps); } } /** * @dev Returns an URI for a given token ID. * Throws if the token ID does not exist. May return an empty string. * @param tokenId uint256 ID of the token to query */ function tokenURI(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return super._tokenURI(tokenId); } /** * @dev Internal function to set the token URI for a given token. * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to set its URI * @param uri string URI to assign */ function _setTokenURI(uint256 tokenId, string memory uri) internal { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); super._setTokenURI(tokenId, uri); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * Deprecated, use _burn(uint256) instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned by the msg.sender */ function _burn(address owner, uint256 tokenId) internal { super._burn(owner, tokenId); _clearTokenURI(tokenId); } } /** * @title MintableOwnableToken * @dev only owner can mint token. */ contract MintableOwnableToken is Ownable, ERC721, IERC721Metadata, ERC721Burnable, ERC721Base, SignerRole { event CreateERC721_v4(address indexed creator, string name, string symbol); constructor (string memory name, string memory symbol, string memory contractURI, string memory tokenURIPrefix, address signer) public ERC721Base(name, symbol, contractURI, tokenURIPrefix) { emit CreateERC721_v4(msg.sender, name, symbol); _addSigner(signer); _registerInterface(bytes4(keccak256('MINT_WITH_ADDRESS'))); } function mint(uint256 tokenId, uint8 v, bytes32 r, bytes32 s, Fee[] memory _fees, string memory tokenURI) onlyOwner public { require(isSigner(ecrecover(keccak256(abi.encodePacked(this, tokenId)), v, r, s)), "signer should sign tokenId"); _mint(msg.sender, tokenId, _fees); _setTokenURI(tokenId, tokenURI); } function addSigner(address account) public onlyOwner { _addSigner(account); } function removeSigner(address account) public onlyOwner { _removeSigner(account); } function setTokenURIPrefix(string memory tokenURIPrefix) public onlyOwner { _setTokenURIPrefix(tokenURIPrefix); } function setContractURI(string memory contractURI) public onlyOwner { _setContractURI(contractURI); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"contractURI","type":"string"},{"internalType":"string","name":"tokenURIPrefix","type":"string"},{"internalType":"address","name":"signer","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"}],"name":"CreateERC721_v4","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":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"recipients","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"name":"SecondarySaleFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SignerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SignerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addSigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"fees","outputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"components":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct ERC721Base.Fee[]","name":"_fees","type":"tuple[]"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeSigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceSigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"contractURI","type":"string"}],"name":"setContractURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"tokenURIPrefix","type":"string"}],"name":"setTokenURIPrefix","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenURIPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003999380380620039998339810160408190526200003491620004b4565b84848484808260006200004f6001600160e01b036200024b16565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000b46301ffc9a760e01b6001600160e01b036200025016565b620000cf632dde656160e21b6001600160e01b036200025016565b620000ea6380ac58cd60e01b6001600160e01b036200025016565b8051620000ff906006906020840190620003a9565b506200011b63e8a3d48560e01b6001600160e01b036200025016565b50805162000131906007906020840190620003a9565b506200014f905063780e9d6360e01b6001600160e01b036200025016565b83516200016490600d906020870190620003a9565b5082516200017a90600e906020860190620003a9565b5062000196635b5e139f60e01b6001600160e01b036200025016565b50505050620001bd620001ae6200024b60201b60201c565b6001600160e01b03620002ae16565b336001600160a01b03167f565f2552ba3b09c1a27ca36ec97f816d9f12f464c3f7f145c28b527057df0ac78686604051620001fa929190620006cb565b60405180910390a262000216816001600160e01b03620002ae16565b620002406040516200022890620006be565b6040519081900390206001600160e01b036200025016565b5050505050620007fc565b335b90565b6001600160e01b03198082161415620002865760405162461bcd60e51b81526004016200027d906200070e565b60405180910390fd5b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b620002c98160106200030060201b62001a521790919060201c565b6040516001600160a01b038216907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a250565b6200031582826001600160e01b036200035a16565b15620003355760405162461bcd60e51b81526004016200027d90620006fc565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620003855760405162461bcd60e51b81526004016200027d9062000720565b506001600160a01b03811660009081526020839052604090205460ff165b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003ec57805160ff19168380011785556200041c565b828001600101855582156200041c579182015b828111156200041c578251825591602001919060010190620003ff565b506200042a9291506200042e565b5090565b6200024d91905b808211156200042a576000815560010162000435565b8051620003a381620007e2565b600082601f8301126200046a57600080fd5b8151620004816200047b8262000759565b62000732565b915080825260208301602083018583830111156200049e57600080fd5b620004ab838284620007a5565b50505092915050565b600080600080600060a08688031215620004cd57600080fd5b85516001600160401b03811115620004e457600080fd5b620004f28882890162000458565b95505060208601516001600160401b038111156200050f57600080fd5b6200051d8882890162000458565b94505060408601516001600160401b038111156200053a57600080fd5b620005488882890162000458565b93505060608601516001600160401b038111156200056557600080fd5b620005738882890162000458565b925050608062000586888289016200044b565b9150509295509295909350565b6000620005a08262000781565b620005ac818562000785565b9350620005be818560208601620007a5565b620005c981620007d8565b9093019392505050565b6000620005e2601f8362000785565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500815260200192915050565b60006200061d601c8362000785565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000815260200192915050565b60006200065860228362000785565b7f526f6c65733a206163636f756e7420697320746865207a65726f206164647265815261737360f01b602082015260400192915050565b60006200069e6011836200078e565b704d494e545f574954485f4144445245535360781b815260110192915050565b6000620003a3826200068f565b60408082528101620006de818562000593565b90508181036020830152620006f4818462000593565b949350505050565b60208082528101620003a381620005d3565b60208082528101620003a3816200060e565b60208082528101620003a38162000649565b6040518181016001600160401b03811182821017156200075157600080fd5b604052919050565b60006001600160401b038211156200077057600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b919050565b60006001600160a01b038216620003a3565b60005b83811015620007c2578181015183820152602001620007a8565b83811115620007d2576000848401525b50505050565b601f01601f191690565b620007ed8162000793565b8114620007f957600080fd5b50565b61318d806200080c6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063715018a61161011a578063b88d4fde116100ad578063e5c8b03d1161007c578063e5c8b03d1461042e578063e8a3d48514610436578063e985e9c51461043e578063eb12d61e14610451578063f2fde38b14610464576101fb565b8063b88d4fde146103e0578063b9c4d9fb146103f3578063c0ac998314610413578063c87b56dd1461041b576101fb565b8063938e3d7b116100e9578063938e3d7b1461039f57806395d89b41146103b257806399e0dd7c146103ba578063a22cb465146103cd576101fb565b8063715018a6146103745780637df73e271461037c5780638da5cb5b1461038f5780638f32d59b14610397576101fb565b80632f745c59116101925780636308f1cd116101615780636308f1cd1461031a5780636352211e1461033b578063672a94001461034e57806370a0823114610361576101fb565b80632f745c59146102ce57806342842e0e146102e157806342966c68146102f45780634f6ccce714610307576101fb565b80630e316ab7116101ce5780630e316ab7146102735780630ebd4c7f1461028657806318160ddd146102a657806323b872dd146102bb576101fb565b806301ffc9a71461020057806306fdde0314610229578063081812fc1461023e578063095ea7b31461025e575b600080fd5b61021361020e366004612243565b610477565b6040516102209190612da8565b60405180910390f35b610231610496565b6040516102209190612df4565b61025161024c3660046122b4565b610524565b6040516102209190612d19565b61027161026c366004612213565b610570565b005b6102716102813660046120c5565b610655565b6102996102943660046122b4565b610685565b6040516102209190612d97565b6102ae610778565b6040516102209190612fb5565b6102716102c936600461211d565b61077f565b6102ae6102dc366004612213565b6107bc565b6102716102ef36600461211d565b61081d565b6102716103023660046122b4565b610838565b6102ae6103153660046122b4565b610868565b61032d6103283660046122d2565b6108af565b604051610220929190612d6b565b6102516103493660046122b4565b6108f2565b61027161035c3660046122f1565b610927565b6102ae61036f3660046120c5565b610a03565b610271610a4c565b61021361038a3660046120c5565b610aba565b610251610acd565b610213610adc565b6102716103ad36600461227f565b610b00565b610231610b2d565b6102716103c836600461227f565b610b88565b6102716103db3660046121e3565b610bb5565b6102716103ee36600461216a565b610c83565b6104066104013660046122b4565b610cc2565b6040516102209190612d86565b610231610dba565b6102316104293660046122b4565b610e15565b610271610e45565b610231610e57565b61021361044c3660046120e3565b610eb2565b61027161045f3660046120c5565b610ee0565b6102716104723660046120c5565b610f0d565b6001600160e01b03191660009081526001602052604090205460ff1690565b600d805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561051c5780601f106104f15761010080835404028352916020019161051c565b820191906000526020600020905b8154815290600101906020018083116104ff57829003601f168201915b505050505081565b600061052f82610f3a565b6105545760405162461bcd60e51b815260040161054b90612ee5565b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b600061057b826108f2565b9050806001600160a01b0316836001600160a01b031614156105af5760405162461bcd60e51b815260040161054b90612f45565b806001600160a01b03166105c1610f57565b6001600160a01b031614806105dd57506105dd8161044c610f57565b6105f95760405162461bcd60e51b815260040161054b90612e95565b60008281526003602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61065d610adc565b6106795760405162461bcd60e51b815260040161054b90612f05565b61068281610f5b565b50565b6000818152600f602090815260408083208054825181850281018501909352808352606094859484015b828210156106f7576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016106af565b5050505090506060815160405190808252806020026020018201604052801561072a578160200160208202803883390190505b50905060005b82518110156107705782818151811061074557fe5b60200260200101516020015182828151811061075d57fe5b6020908102919091010152600101610730565b509392505050565b600b545b90565b61079061078a610f57565b82610fa3565b6107ac5760405162461bcd60e51b815260040161054b90612f55565b6107b7838383611028565b505050565b60006107c783610a03565b82106107e55760405162461bcd60e51b815260040161054b90612e25565b6001600160a01b038316600090815260096020526040902080548390811061080957fe5b906000526020600020015490505b92915050565b6107b783838360405180602001604052806000815250610c83565b61084361078a610f57565b61085f5760405162461bcd60e51b815260040161054b90612f95565b61068281611047565b6000610872610778565b82106108905760405162461bcd60e51b815260040161054b90612f65565b600b828154811061089d57fe5b90600052602060002001549050919050565b600f60205281600052604060002081815481106108c857fe5b6000918252602090912060029091020180546001909101546001600160a01b039091169250905082565b6000818152600260205260408120546001600160a01b0316806108175760405162461bcd60e51b815260040161054b90612eb5565b61092f610adc565b61094b5760405162461bcd60e51b815260040161054b90612f05565b6109ca60013088604051602001610963929190612cf3565b60405160208183030381529060405280519060200120878787604051600081526020016040526040516109999493929190612db6565b6020604051602081039080840390855afa1580156109bb573d6000803e3d6000fd5b50505060206040510351610aba565b6109e65760405162461bcd60e51b815260040161054b90612fa5565b6109f1338784611059565b6109fb868261127e565b505050505050565b60006001600160a01b038216610a2b5760405162461bcd60e51b815260040161054b90612ea5565b6001600160a01b0382166000908152600460205260409020610817906112b1565b610a54610adc565b610a705760405162461bcd60e51b815260040161054b90612f05565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600061081760108363ffffffff6112b516565b6000546001600160a01b031690565b600080546001600160a01b0316610af1610f57565b6001600160a01b031614905090565b610b08610adc565b610b245760405162461bcd60e51b815260040161054b90612f05565b610682816112fd565b600e805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561051c5780601f106104f15761010080835404028352916020019161051c565b610b90610adc565b610bac5760405162461bcd60e51b815260040161054b90612f05565b61068281611310565b610bbd610f57565b6001600160a01b0316826001600160a01b03161415610bee5760405162461bcd60e51b815260040161054b90612e75565b8060056000610bfb610f57565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610c3f610f57565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c779190612da8565b60405180910390a35050565b610c94610c8e610f57565b83610fa3565b610cb05760405162461bcd60e51b815260040161054b90612f55565b610cbc84848484611323565b50505050565b6000818152600f602090815260408083208054825181850281018501909352808352606094859484015b82821015610d34576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101610cec565b50505050905060608151604051908082528060200260200182016040528015610d67578160200160208202803883390190505b50905060005b825181101561077057828181518110610d8257fe5b602002602001015160000151828281518110610d9a57fe5b6001600160a01b0390921660209283029190910190910152600101610d6d565b6007805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561051c5780601f106104f15761010080835404028352916020019161051c565b6060610e2082610f3a565b610e3c5760405162461bcd60e51b815260040161054b90612f35565b61081782611356565b610e55610e50610f57565b610f5b565b565b6006805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561051c5780601f106104f15761010080835404028352916020019161051c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610ee8610adc565b610f045760405162461bcd60e51b815260040161054b90612f05565b61068281611491565b610f15610adc565b610f315760405162461bcd60e51b815260040161054b90612f05565b610682816114d9565b6000908152600260205260409020546001600160a01b0316151590565b3390565b610f6c60108263ffffffff61155a16565b6040516001600160a01b038216907f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b90600090a250565b6000610fae82610f3a565b610fca5760405162461bcd60e51b815260040161054b90612e85565b6000610fd5836108f2565b9050806001600160a01b0316846001600160a01b031614806110105750836001600160a01b031661100584610524565b6001600160a01b0316145b8061102057506110208185610eb2565b949350505050565b6110338383836115a2565b61103d83826116a8565b6107b78282611796565b610682611053826108f2565b826117d4565b61106383836117e7565b60608151604051908082528060200260200182016040528015611090578160200160208202803883390190505b509050606082516040519080825280602002602001820160405280156110c0578160200160208202803883390190505b50905060005b83518110156112335760006001600160a01b03168482815181106110e657fe5b6020026020010151600001516001600160a01b031614156111195760405162461bcd60e51b815260040161054b90612f85565b83818151811061112557fe5b602002602001015160200151600014156111515760405162461bcd60e51b815260040161054b90612e05565b6000858152600f60205260409020845185908390811061116d57fe5b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b0390921691909117815591015191015583518490829081106111c457fe5b6020026020010151600001518382815181106111dc57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083818151811061120857fe5b60200260200101516020015182828151811061122057fe5b60209081029190910101526001016110c6565b50825115611277577f99aba1d63749cfd5ad1afda7c4663840924d54eb5f005bbbeadedc6ec13674b284838360405161126e93929190612fc3565b60405180910390a15b5050505050565b61128782610f3a565b6112a35760405162461bcd60e51b815260040161054b90612ef5565b6112ad8282611804565b5050565b5490565b60006001600160a01b0382166112dd5760405162461bcd60e51b815260040161054b90612f15565b506001600160a01b03166000908152602091909152604090205460ff1690565b80516112ad906006906020840190611e70565b80516112ad906007906020840190611e70565b61132e848484611028565b61133a84848484611823565b610cbc5760405162461bcd60e51b815260040161054b90612e35565b6000818152600860209081526040918290208054835160026001831615610100026000190190921691909104601f8101849004840282018401909452838152606093610817939192918301828280156113f05780601f106113c5576101008083540402835291602001916113f0565b820191906000526020600020905b8154815290600101906020018083116113d357829003601f168201915b505060078054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529550919350915083018282801561147e5780601f106114535761010080835404028352916020019161147e565b820191906000526020600020905b81548152906001019060200180831161146157829003601f168201915b505050505061195d90919063ffffffff16565b6114a260108263ffffffff611a5216565b6040516001600160a01b038216907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a250565b6001600160a01b0381166114ff5760405162461bcd60e51b815260040161054b90612e45565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61156482826112b5565b6115805760405162461bcd60e51b815260040161054b90612ec5565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b826001600160a01b03166115b5826108f2565b6001600160a01b0316146115db5760405162461bcd60e51b815260040161054b90612f25565b6001600160a01b0382166116015760405162461bcd60e51b815260040161054b90612e65565b61160a81611a9e565b6001600160a01b038316600090815260046020526040902061162b90611ad9565b6001600160a01b038216600090815260046020526040902061164c90611af0565b60008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152600960205260408120546116d290600163ffffffff611af916565b6000838152600a602052604090205490915080821461176d576001600160a01b038416600090815260096020526040812080548490811061170f57fe5b906000526020600020015490508060096000876001600160a01b03166001600160a01b03168152602001908152602001600020838154811061174d57fe5b6000918252602080832090910192909255918252600a9052604090208190555b6001600160a01b0384166000908152600960205260409020805490611277906000198301611eee565b6001600160a01b0390911660009081526009602081815260408084208054868652600a84529185208290559282526001810183559183529091200155565b6117de8282611b42565b6112ad81611b6e565b6117f18282611bac565b6117fb8282611796565b6112ad81611c73565b600082815260086020908152604090912082516107b792840190611e70565b6000611837846001600160a01b0316611cb7565b61184357506001611020565b600060606001600160a01b038616630a85bd0160e11b611861610f57565b8988886040516024016118779493929190612d27565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516118b59190612ce7565b6000604051808303816000865af19150503d80600081146118f2576040519150601f19603f3d011682016040523d82523d6000602084013e6118f7565b606091505b509150915081611929578051156119115780518082602001fd5b60405162461bcd60e51b815260040161054b90612e35565b60008180602001905161193f9190810190612261565b6001600160e01b031916630a85bd0160e11b14935061102092505050565b6060808390506060839050606081518351016040519080825280601f01601f191660200182016040528015611999576020820181803883390190505b5090506000805b84518110156119f1578481815181106119b557fe5b602001015160f81c60f81b8383806001019450815181106119d257fe5b60200101906001600160f81b031916908160001a9053506001016119a0565b5060005b8351811015611a4657838181518110611a0a57fe5b602001015160f81c60f81b838380600101945081518110611a2757fe5b60200101906001600160f81b031916908160001a9053506001016119f5565b50909695505050505050565b611a5c82826112b5565b15611a795760405162461bcd60e51b815260040161054b90612e15565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000818152600360205260409020546001600160a01b03161561068257600090815260036020526040902080546001600160a01b0319169055565b8054611aec90600163ffffffff611af916565b9055565b80546001019055565b6000611b3b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cf0565b9392505050565b611b4c8282611d1c565b611b5682826116a8565b6000818152600a60205260408120556112ad81611dd4565b600081815260086020526040902054600260001961010060018416150201909116041561068257600081815260086020526040812061068291611f12565b6001600160a01b038216611bd25760405162461bcd60e51b815260040161054b90612ed5565b611bdb81610f3a565b15611bf85760405162461bcd60e51b815260040161054b90612e55565b600081815260026020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260049091529020611c3790611af0565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600b80546000838152600c60205260408120829055600182018355919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611020575050151592915050565b60008184841115611d145760405162461bcd60e51b815260040161054b9190612df4565b505050900390565b816001600160a01b0316611d2f826108f2565b6001600160a01b031614611d555760405162461bcd60e51b815260040161054b90612f75565b611d5e81611a9e565b6001600160a01b0382166000908152600460205260409020611d7f90611ad9565b60008181526002602052604080822080546001600160a01b0319169055518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600b54600090611deb90600163ffffffff611af916565b6000838152600c6020526040812054600b8054939450909284908110611e0d57fe5b9060005260206000200154905080600b8381548110611e2857fe5b6000918252602080832090910192909255828152600c90915260409020829055600b805490611e5b906000198301611eee565b505050600091825250600c6020526040812055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611eb157805160ff1916838001178555611ede565b82800160010185558215611ede579182015b82811115611ede578251825591602001919060010190611ec3565b50611eea929150611f52565b5090565b8154818355818111156107b7576000838152602090206107b7918101908301611f52565b50805460018160011615610100020316600290046000825580601f10611f385750610682565b601f01602090049060005260206000209081019061068291905b61077c91905b80821115611eea5760008155600101611f58565b803561081781613112565b600082601f830112611f8857600080fd5b8135611f9b611f968261301e565b612ff7565b91508181835260208401935060208101905083856040840282011115611fc057600080fd5b60005b83811015611fee5781611fd68882612073565b84525060209092019160409190910190600101611fc3565b5050505092915050565b803561081781613126565b80356108178161312f565b803561081781613138565b805161081781613138565b600082601f83011261203557600080fd5b8135612043611f968261303f565b9150808252602083016020830185838301111561205f57600080fd5b61206a8382846130b9565b50505092915050565b60006040828403121561208557600080fd5b61208f6040612ff7565b9050600061209d8484611f6c565b82525060206120ae84848301612003565b60208301525092915050565b803561081781613141565b6000602082840312156120d757600080fd5b60006110208484611f6c565b600080604083850312156120f657600080fd5b60006121028585611f6c565b925050602061211385828601611f6c565b9150509250929050565b60008060006060848603121561213257600080fd5b600061213e8686611f6c565b935050602061214f86828701611f6c565b925050604061216086828701612003565b9150509250925092565b6000806000806080858703121561218057600080fd5b600061218c8787611f6c565b945050602061219d87828801611f6c565b93505060406121ae87828801612003565b925050606085013567ffffffffffffffff8111156121cb57600080fd5b6121d787828801612024565b91505092959194509250565b600080604083850312156121f657600080fd5b60006122028585611f6c565b925050602061211385828601611ff8565b6000806040838503121561222657600080fd5b60006122328585611f6c565b925050602061211385828601612003565b60006020828403121561225557600080fd5b6000611020848461200e565b60006020828403121561227357600080fd5b60006110208484612019565b60006020828403121561229157600080fd5b813567ffffffffffffffff8111156122a857600080fd5b61102084828501612024565b6000602082840312156122c657600080fd5b60006110208484612003565b600080604083850312156122e557600080fd5b60006122328585612003565b60008060008060008060c0878903121561230a57600080fd5b60006123168989612003565b965050602061232789828a016120ba565b955050604061233889828a01612003565b945050606061234989828a01612003565b935050608087013567ffffffffffffffff81111561236657600080fd5b61237289828a01611f77565b92505060a087013567ffffffffffffffff81111561238f57600080fd5b61239b89828a01612024565b9150509295509295509295565b60006123b483836123c8565b505060200190565b60006123b483836124d5565b6123d18161307f565b82525050565b60006123e28261306d565b6123ec8185613071565b93506123f783613067565b8060005b8381101561242557815161240f88826123a8565b975061241a83613067565b9250506001016123fb565b509495945050505050565b600061243b8261306d565b6124458185613071565b935061245083613067565b8060005b8381101561242557815161246888826123a8565b975061247383613067565b925050600101612454565b60006124898261306d565b6124938185613071565b935061249e83613067565b8060005b838110156124255781516124b688826123bc565b97506124c183613067565b9250506001016124a2565b6123d18161308a565b6123d18161077c565b60006124e98261306d565b6124f38185613071565b93506125038185602086016130c5565b61250c81613102565b9093019392505050565b60006125218261306d565b61252b818561307a565b935061253b8185602086016130c5565b9290920192915050565b6123d1612551826130ae565b6130f1565b6000612563601c83613071565b7f4665652076616c75652073686f756c6420626520706f73697469766500000000815260200192915050565b600061259c601f83613071565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500815260200192915050565b60006125d5602b83613071565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7581526a74206f6620626f756e647360a81b602082015260400192915050565b6000612622603283613071565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526581527131b2b4bb32b91034b6b83632b6b2b73a32b960711b602082015260400192915050565b6000612676602683613071565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b60006126be601c83613071565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000815260200192915050565b60006126f7602483613071565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164648152637265737360e01b602082015260400192915050565b600061273d601983613071565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000815260200192915050565b6000612776602c83613071565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657881526b34b9ba32b73a103a37b5b2b760a11b602082015260400192915050565b60006127c4603883613071565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7781527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015260400192915050565b6000612823602a83613071565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a65815269726f206164647265737360b01b602082015260400192915050565b600061286f602983613071565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737481526832b73a103a37b5b2b760b91b602082015260400192915050565b60006128ba602183613071565b7f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c8152606560f81b602082015260400192915050565b60006128fd602083613071565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373815260200192915050565b6000612936602c83613071565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657881526b34b9ba32b73a103a37b5b2b760a11b602082015260400192915050565b6000612984602c83613071565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e657881526b34b9ba32b73a103a37b5b2b760a11b602082015260400192915050565b60006129d2602083613071565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000612a0b602283613071565b7f526f6c65733a206163636f756e7420697320746865207a65726f206164647265815261737360f01b602082015260400192915050565b6000612a4f602983613071565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206981526839903737ba1037bbb760b91b602082015260400192915050565b6000612a9a602f83613071565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f81526e3732bc34b9ba32b73a103a37b5b2b760891b602082015260400192915050565b6000612aeb602183613071565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e658152603960f91b602082015260400192915050565b6000612b2e603183613071565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f8152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b602082015260400192915050565b6000612b81602c83613071565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f81526b7574206f6620626f756e647360a01b602082015260400192915050565b6000612bcf602583613071565b7f4552433732313a206275726e206f6620746f6b656e2074686174206973206e6f8152643a1037bbb760d91b602082015260400192915050565b6000612c16601b83613071565b7f526563697069656e742073686f756c642062652070726573656e740000000000815260200192915050565b6000612c4f603083613071565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7781526f1b995c881b9bdc88185c1c1c9bdd995960821b602082015260400192915050565b6000612ca1601a83613071565b7f7369676e65722073686f756c64207369676e20746f6b656e4964000000000000815260200192915050565b6123d1612cd98261077c565b61077c565b6123d1816130a8565b6000611b3b8284612516565b6000612cff8285612545565b601482019150612d0f8284612ccd565b5060200192915050565b6020810161081782846123c8565b60808101612d3582876123c8565b612d4260208301866123c8565b612d4f60408301856124d5565b8181036060830152612d6181846124de565b9695505050505050565b60408101612d7982856123c8565b611b3b60208301846124d5565b60208082528101611b3b8184612430565b60208082528101611b3b818461247e565b6020810161081782846124cc565b60808101612dc482876124d5565b612dd16020830186612cde565b612dde60408301856124d5565b612deb60608301846124d5565b95945050505050565b60208082528101611b3b81846124de565b6020808252810161081781612556565b602080825281016108178161258f565b60208082528101610817816125c8565b6020808252810161081781612615565b6020808252810161081781612669565b60208082528101610817816126b1565b60208082528101610817816126ea565b6020808252810161081781612730565b6020808252810161081781612769565b60208082528101610817816127b7565b6020808252810161081781612816565b6020808252810161081781612862565b60208082528101610817816128ad565b60208082528101610817816128f0565b6020808252810161081781612929565b6020808252810161081781612977565b60208082528101610817816129c5565b60208082528101610817816129fe565b6020808252810161081781612a42565b6020808252810161081781612a8d565b6020808252810161081781612ade565b6020808252810161081781612b21565b6020808252810161081781612b74565b6020808252810161081781612bc2565b6020808252810161081781612c09565b6020808252810161081781612c42565b6020808252810161081781612c94565b6020810161081782846124d5565b60608101612fd182866124d5565b8181036020830152612fe381856123d7565b90508181036040830152612deb818461247e565b60405181810167ffffffffffffffff8111828210171561301657600080fd5b604052919050565b600067ffffffffffffffff82111561303557600080fd5b5060209081020190565b600067ffffffffffffffff82111561305657600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b919050565b60006108178261309c565b151590565b6001600160e01b03191690565b6001600160a01b031690565b60ff1690565b60006108178261307f565b82818337506000910152565b60005b838110156130e05781810151838201526020016130c8565b83811115610cbc5750506000910152565b60006108178260006108178261310c565b601f01601f191690565b60601b90565b61311b8161307f565b811461068257600080fd5b61311b8161308a565b61311b8161077c565b61311b8161308f565b61311b816130a856fea365627a7a72315820cbdb29bb11bc4baf42a2f6229355125f1baa73cc291341c017423c96123797b56c6578706572696d656e74616cf564736f6c6343000511004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000f03ba06dd459ae597357b491219fcb573f5fe683000000000000000000000000000000000000000000000000000000000000000d506f6c69746963616c20417274000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007506f6c6941727400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003168747470733a2f2f6170692d6d61696e6e65742e72617269626c652e636f6d2f636f6e74726163744d657461646174612f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001968747470733a2f2f697066732e64616f6e6f6d69632e636f6d00000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063715018a61161011a578063b88d4fde116100ad578063e5c8b03d1161007c578063e5c8b03d1461042e578063e8a3d48514610436578063e985e9c51461043e578063eb12d61e14610451578063f2fde38b14610464576101fb565b8063b88d4fde146103e0578063b9c4d9fb146103f3578063c0ac998314610413578063c87b56dd1461041b576101fb565b8063938e3d7b116100e9578063938e3d7b1461039f57806395d89b41146103b257806399e0dd7c146103ba578063a22cb465146103cd576101fb565b8063715018a6146103745780637df73e271461037c5780638da5cb5b1461038f5780638f32d59b14610397576101fb565b80632f745c59116101925780636308f1cd116101615780636308f1cd1461031a5780636352211e1461033b578063672a94001461034e57806370a0823114610361576101fb565b80632f745c59146102ce57806342842e0e146102e157806342966c68146102f45780634f6ccce714610307576101fb565b80630e316ab7116101ce5780630e316ab7146102735780630ebd4c7f1461028657806318160ddd146102a657806323b872dd146102bb576101fb565b806301ffc9a71461020057806306fdde0314610229578063081812fc1461023e578063095ea7b31461025e575b600080fd5b61021361020e366004612243565b610477565b6040516102209190612da8565b60405180910390f35b610231610496565b6040516102209190612df4565b61025161024c3660046122b4565b610524565b6040516102209190612d19565b61027161026c366004612213565b610570565b005b6102716102813660046120c5565b610655565b6102996102943660046122b4565b610685565b6040516102209190612d97565b6102ae610778565b6040516102209190612fb5565b6102716102c936600461211d565b61077f565b6102ae6102dc366004612213565b6107bc565b6102716102ef36600461211d565b61081d565b6102716103023660046122b4565b610838565b6102ae6103153660046122b4565b610868565b61032d6103283660046122d2565b6108af565b604051610220929190612d6b565b6102516103493660046122b4565b6108f2565b61027161035c3660046122f1565b610927565b6102ae61036f3660046120c5565b610a03565b610271610a4c565b61021361038a3660046120c5565b610aba565b610251610acd565b610213610adc565b6102716103ad36600461227f565b610b00565b610231610b2d565b6102716103c836600461227f565b610b88565b6102716103db3660046121e3565b610bb5565b6102716103ee36600461216a565b610c83565b6104066104013660046122b4565b610cc2565b6040516102209190612d86565b610231610dba565b6102316104293660046122b4565b610e15565b610271610e45565b610231610e57565b61021361044c3660046120e3565b610eb2565b61027161045f3660046120c5565b610ee0565b6102716104723660046120c5565b610f0d565b6001600160e01b03191660009081526001602052604090205460ff1690565b600d805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561051c5780601f106104f15761010080835404028352916020019161051c565b820191906000526020600020905b8154815290600101906020018083116104ff57829003601f168201915b505050505081565b600061052f82610f3a565b6105545760405162461bcd60e51b815260040161054b90612ee5565b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b600061057b826108f2565b9050806001600160a01b0316836001600160a01b031614156105af5760405162461bcd60e51b815260040161054b90612f45565b806001600160a01b03166105c1610f57565b6001600160a01b031614806105dd57506105dd8161044c610f57565b6105f95760405162461bcd60e51b815260040161054b90612e95565b60008281526003602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61065d610adc565b6106795760405162461bcd60e51b815260040161054b90612f05565b61068281610f5b565b50565b6000818152600f602090815260408083208054825181850281018501909352808352606094859484015b828210156106f7576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001908101548284015290835290920191016106af565b5050505090506060815160405190808252806020026020018201604052801561072a578160200160208202803883390190505b50905060005b82518110156107705782818151811061074557fe5b60200260200101516020015182828151811061075d57fe5b6020908102919091010152600101610730565b509392505050565b600b545b90565b61079061078a610f57565b82610fa3565b6107ac5760405162461bcd60e51b815260040161054b90612f55565b6107b7838383611028565b505050565b60006107c783610a03565b82106107e55760405162461bcd60e51b815260040161054b90612e25565b6001600160a01b038316600090815260096020526040902080548390811061080957fe5b906000526020600020015490505b92915050565b6107b783838360405180602001604052806000815250610c83565b61084361078a610f57565b61085f5760405162461bcd60e51b815260040161054b90612f95565b61068281611047565b6000610872610778565b82106108905760405162461bcd60e51b815260040161054b90612f65565b600b828154811061089d57fe5b90600052602060002001549050919050565b600f60205281600052604060002081815481106108c857fe5b6000918252602090912060029091020180546001909101546001600160a01b039091169250905082565b6000818152600260205260408120546001600160a01b0316806108175760405162461bcd60e51b815260040161054b90612eb5565b61092f610adc565b61094b5760405162461bcd60e51b815260040161054b90612f05565b6109ca60013088604051602001610963929190612cf3565b60405160208183030381529060405280519060200120878787604051600081526020016040526040516109999493929190612db6565b6020604051602081039080840390855afa1580156109bb573d6000803e3d6000fd5b50505060206040510351610aba565b6109e65760405162461bcd60e51b815260040161054b90612fa5565b6109f1338784611059565b6109fb868261127e565b505050505050565b60006001600160a01b038216610a2b5760405162461bcd60e51b815260040161054b90612ea5565b6001600160a01b0382166000908152600460205260409020610817906112b1565b610a54610adc565b610a705760405162461bcd60e51b815260040161054b90612f05565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600061081760108363ffffffff6112b516565b6000546001600160a01b031690565b600080546001600160a01b0316610af1610f57565b6001600160a01b031614905090565b610b08610adc565b610b245760405162461bcd60e51b815260040161054b90612f05565b610682816112fd565b600e805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561051c5780601f106104f15761010080835404028352916020019161051c565b610b90610adc565b610bac5760405162461bcd60e51b815260040161054b90612f05565b61068281611310565b610bbd610f57565b6001600160a01b0316826001600160a01b03161415610bee5760405162461bcd60e51b815260040161054b90612e75565b8060056000610bfb610f57565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610c3f610f57565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c779190612da8565b60405180910390a35050565b610c94610c8e610f57565b83610fa3565b610cb05760405162461bcd60e51b815260040161054b90612f55565b610cbc84848484611323565b50505050565b6000818152600f602090815260408083208054825181850281018501909352808352606094859484015b82821015610d34576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101610cec565b50505050905060608151604051908082528060200260200182016040528015610d67578160200160208202803883390190505b50905060005b825181101561077057828181518110610d8257fe5b602002602001015160000151828281518110610d9a57fe5b6001600160a01b0390921660209283029190910190910152600101610d6d565b6007805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561051c5780601f106104f15761010080835404028352916020019161051c565b6060610e2082610f3a565b610e3c5760405162461bcd60e51b815260040161054b90612f35565b61081782611356565b610e55610e50610f57565b610f5b565b565b6006805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561051c5780601f106104f15761010080835404028352916020019161051c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610ee8610adc565b610f045760405162461bcd60e51b815260040161054b90612f05565b61068281611491565b610f15610adc565b610f315760405162461bcd60e51b815260040161054b90612f05565b610682816114d9565b6000908152600260205260409020546001600160a01b0316151590565b3390565b610f6c60108263ffffffff61155a16565b6040516001600160a01b038216907f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b90600090a250565b6000610fae82610f3a565b610fca5760405162461bcd60e51b815260040161054b90612e85565b6000610fd5836108f2565b9050806001600160a01b0316846001600160a01b031614806110105750836001600160a01b031661100584610524565b6001600160a01b0316145b8061102057506110208185610eb2565b949350505050565b6110338383836115a2565b61103d83826116a8565b6107b78282611796565b610682611053826108f2565b826117d4565b61106383836117e7565b60608151604051908082528060200260200182016040528015611090578160200160208202803883390190505b509050606082516040519080825280602002602001820160405280156110c0578160200160208202803883390190505b50905060005b83518110156112335760006001600160a01b03168482815181106110e657fe5b6020026020010151600001516001600160a01b031614156111195760405162461bcd60e51b815260040161054b90612f85565b83818151811061112557fe5b602002602001015160200151600014156111515760405162461bcd60e51b815260040161054b90612e05565b6000858152600f60205260409020845185908390811061116d57fe5b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b0390921691909117815591015191015583518490829081106111c457fe5b6020026020010151600001518382815181106111dc57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083818151811061120857fe5b60200260200101516020015182828151811061122057fe5b60209081029190910101526001016110c6565b50825115611277577f99aba1d63749cfd5ad1afda7c4663840924d54eb5f005bbbeadedc6ec13674b284838360405161126e93929190612fc3565b60405180910390a15b5050505050565b61128782610f3a565b6112a35760405162461bcd60e51b815260040161054b90612ef5565b6112ad8282611804565b5050565b5490565b60006001600160a01b0382166112dd5760405162461bcd60e51b815260040161054b90612f15565b506001600160a01b03166000908152602091909152604090205460ff1690565b80516112ad906006906020840190611e70565b80516112ad906007906020840190611e70565b61132e848484611028565b61133a84848484611823565b610cbc5760405162461bcd60e51b815260040161054b90612e35565b6000818152600860209081526040918290208054835160026001831615610100026000190190921691909104601f8101849004840282018401909452838152606093610817939192918301828280156113f05780601f106113c5576101008083540402835291602001916113f0565b820191906000526020600020905b8154815290600101906020018083116113d357829003601f168201915b505060078054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529550919350915083018282801561147e5780601f106114535761010080835404028352916020019161147e565b820191906000526020600020905b81548152906001019060200180831161146157829003601f168201915b505050505061195d90919063ffffffff16565b6114a260108263ffffffff611a5216565b6040516001600160a01b038216907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a250565b6001600160a01b0381166114ff5760405162461bcd60e51b815260040161054b90612e45565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61156482826112b5565b6115805760405162461bcd60e51b815260040161054b90612ec5565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b826001600160a01b03166115b5826108f2565b6001600160a01b0316146115db5760405162461bcd60e51b815260040161054b90612f25565b6001600160a01b0382166116015760405162461bcd60e51b815260040161054b90612e65565b61160a81611a9e565b6001600160a01b038316600090815260046020526040902061162b90611ad9565b6001600160a01b038216600090815260046020526040902061164c90611af0565b60008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152600960205260408120546116d290600163ffffffff611af916565b6000838152600a602052604090205490915080821461176d576001600160a01b038416600090815260096020526040812080548490811061170f57fe5b906000526020600020015490508060096000876001600160a01b03166001600160a01b03168152602001908152602001600020838154811061174d57fe5b6000918252602080832090910192909255918252600a9052604090208190555b6001600160a01b0384166000908152600960205260409020805490611277906000198301611eee565b6001600160a01b0390911660009081526009602081815260408084208054868652600a84529185208290559282526001810183559183529091200155565b6117de8282611b42565b6112ad81611b6e565b6117f18282611bac565b6117fb8282611796565b6112ad81611c73565b600082815260086020908152604090912082516107b792840190611e70565b6000611837846001600160a01b0316611cb7565b61184357506001611020565b600060606001600160a01b038616630a85bd0160e11b611861610f57565b8988886040516024016118779493929190612d27565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516118b59190612ce7565b6000604051808303816000865af19150503d80600081146118f2576040519150601f19603f3d011682016040523d82523d6000602084013e6118f7565b606091505b509150915081611929578051156119115780518082602001fd5b60405162461bcd60e51b815260040161054b90612e35565b60008180602001905161193f9190810190612261565b6001600160e01b031916630a85bd0160e11b14935061102092505050565b6060808390506060839050606081518351016040519080825280601f01601f191660200182016040528015611999576020820181803883390190505b5090506000805b84518110156119f1578481815181106119b557fe5b602001015160f81c60f81b8383806001019450815181106119d257fe5b60200101906001600160f81b031916908160001a9053506001016119a0565b5060005b8351811015611a4657838181518110611a0a57fe5b602001015160f81c60f81b838380600101945081518110611a2757fe5b60200101906001600160f81b031916908160001a9053506001016119f5565b50909695505050505050565b611a5c82826112b5565b15611a795760405162461bcd60e51b815260040161054b90612e15565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000818152600360205260409020546001600160a01b03161561068257600090815260036020526040902080546001600160a01b0319169055565b8054611aec90600163ffffffff611af916565b9055565b80546001019055565b6000611b3b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cf0565b9392505050565b611b4c8282611d1c565b611b5682826116a8565b6000818152600a60205260408120556112ad81611dd4565b600081815260086020526040902054600260001961010060018416150201909116041561068257600081815260086020526040812061068291611f12565b6001600160a01b038216611bd25760405162461bcd60e51b815260040161054b90612ed5565b611bdb81610f3a565b15611bf85760405162461bcd60e51b815260040161054b90612e55565b600081815260026020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260049091529020611c3790611af0565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600b80546000838152600c60205260408120829055600182018355919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611020575050151592915050565b60008184841115611d145760405162461bcd60e51b815260040161054b9190612df4565b505050900390565b816001600160a01b0316611d2f826108f2565b6001600160a01b031614611d555760405162461bcd60e51b815260040161054b90612f75565b611d5e81611a9e565b6001600160a01b0382166000908152600460205260409020611d7f90611ad9565b60008181526002602052604080822080546001600160a01b0319169055518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600b54600090611deb90600163ffffffff611af916565b6000838152600c6020526040812054600b8054939450909284908110611e0d57fe5b9060005260206000200154905080600b8381548110611e2857fe5b6000918252602080832090910192909255828152600c90915260409020829055600b805490611e5b906000198301611eee565b505050600091825250600c6020526040812055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611eb157805160ff1916838001178555611ede565b82800160010185558215611ede579182015b82811115611ede578251825591602001919060010190611ec3565b50611eea929150611f52565b5090565b8154818355818111156107b7576000838152602090206107b7918101908301611f52565b50805460018160011615610100020316600290046000825580601f10611f385750610682565b601f01602090049060005260206000209081019061068291905b61077c91905b80821115611eea5760008155600101611f58565b803561081781613112565b600082601f830112611f8857600080fd5b8135611f9b611f968261301e565b612ff7565b91508181835260208401935060208101905083856040840282011115611fc057600080fd5b60005b83811015611fee5781611fd68882612073565b84525060209092019160409190910190600101611fc3565b5050505092915050565b803561081781613126565b80356108178161312f565b803561081781613138565b805161081781613138565b600082601f83011261203557600080fd5b8135612043611f968261303f565b9150808252602083016020830185838301111561205f57600080fd5b61206a8382846130b9565b50505092915050565b60006040828403121561208557600080fd5b61208f6040612ff7565b9050600061209d8484611f6c565b82525060206120ae84848301612003565b60208301525092915050565b803561081781613141565b6000602082840312156120d757600080fd5b60006110208484611f6c565b600080604083850312156120f657600080fd5b60006121028585611f6c565b925050602061211385828601611f6c565b9150509250929050565b60008060006060848603121561213257600080fd5b600061213e8686611f6c565b935050602061214f86828701611f6c565b925050604061216086828701612003565b9150509250925092565b6000806000806080858703121561218057600080fd5b600061218c8787611f6c565b945050602061219d87828801611f6c565b93505060406121ae87828801612003565b925050606085013567ffffffffffffffff8111156121cb57600080fd5b6121d787828801612024565b91505092959194509250565b600080604083850312156121f657600080fd5b60006122028585611f6c565b925050602061211385828601611ff8565b6000806040838503121561222657600080fd5b60006122328585611f6c565b925050602061211385828601612003565b60006020828403121561225557600080fd5b6000611020848461200e565b60006020828403121561227357600080fd5b60006110208484612019565b60006020828403121561229157600080fd5b813567ffffffffffffffff8111156122a857600080fd5b61102084828501612024565b6000602082840312156122c657600080fd5b60006110208484612003565b600080604083850312156122e557600080fd5b60006122328585612003565b60008060008060008060c0878903121561230a57600080fd5b60006123168989612003565b965050602061232789828a016120ba565b955050604061233889828a01612003565b945050606061234989828a01612003565b935050608087013567ffffffffffffffff81111561236657600080fd5b61237289828a01611f77565b92505060a087013567ffffffffffffffff81111561238f57600080fd5b61239b89828a01612024565b9150509295509295509295565b60006123b483836123c8565b505060200190565b60006123b483836124d5565b6123d18161307f565b82525050565b60006123e28261306d565b6123ec8185613071565b93506123f783613067565b8060005b8381101561242557815161240f88826123a8565b975061241a83613067565b9250506001016123fb565b509495945050505050565b600061243b8261306d565b6124458185613071565b935061245083613067565b8060005b8381101561242557815161246888826123a8565b975061247383613067565b925050600101612454565b60006124898261306d565b6124938185613071565b935061249e83613067565b8060005b838110156124255781516124b688826123bc565b97506124c183613067565b9250506001016124a2565b6123d18161308a565b6123d18161077c565b60006124e98261306d565b6124f38185613071565b93506125038185602086016130c5565b61250c81613102565b9093019392505050565b60006125218261306d565b61252b818561307a565b935061253b8185602086016130c5565b9290920192915050565b6123d1612551826130ae565b6130f1565b6000612563601c83613071565b7f4665652076616c75652073686f756c6420626520706f73697469766500000000815260200192915050565b600061259c601f83613071565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500815260200192915050565b60006125d5602b83613071565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7581526a74206f6620626f756e647360a81b602082015260400192915050565b6000612622603283613071565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526581527131b2b4bb32b91034b6b83632b6b2b73a32b960711b602082015260400192915050565b6000612676602683613071565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b60006126be601c83613071565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000815260200192915050565b60006126f7602483613071565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164648152637265737360e01b602082015260400192915050565b600061273d601983613071565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000815260200192915050565b6000612776602c83613071565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657881526b34b9ba32b73a103a37b5b2b760a11b602082015260400192915050565b60006127c4603883613071565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7781527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015260400192915050565b6000612823602a83613071565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a65815269726f206164647265737360b01b602082015260400192915050565b600061286f602983613071565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737481526832b73a103a37b5b2b760b91b602082015260400192915050565b60006128ba602183613071565b7f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c8152606560f81b602082015260400192915050565b60006128fd602083613071565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373815260200192915050565b6000612936602c83613071565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657881526b34b9ba32b73a103a37b5b2b760a11b602082015260400192915050565b6000612984602c83613071565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e657881526b34b9ba32b73a103a37b5b2b760a11b602082015260400192915050565b60006129d2602083613071565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572815260200192915050565b6000612a0b602283613071565b7f526f6c65733a206163636f756e7420697320746865207a65726f206164647265815261737360f01b602082015260400192915050565b6000612a4f602983613071565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206981526839903737ba1037bbb760b91b602082015260400192915050565b6000612a9a602f83613071565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f81526e3732bc34b9ba32b73a103a37b5b2b760891b602082015260400192915050565b6000612aeb602183613071565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e658152603960f91b602082015260400192915050565b6000612b2e603183613071565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f8152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b602082015260400192915050565b6000612b81602c83613071565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f81526b7574206f6620626f756e647360a01b602082015260400192915050565b6000612bcf602583613071565b7f4552433732313a206275726e206f6620746f6b656e2074686174206973206e6f8152643a1037bbb760d91b602082015260400192915050565b6000612c16601b83613071565b7f526563697069656e742073686f756c642062652070726573656e740000000000815260200192915050565b6000612c4f603083613071565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7781526f1b995c881b9bdc88185c1c1c9bdd995960821b602082015260400192915050565b6000612ca1601a83613071565b7f7369676e65722073686f756c64207369676e20746f6b656e4964000000000000815260200192915050565b6123d1612cd98261077c565b61077c565b6123d1816130a8565b6000611b3b8284612516565b6000612cff8285612545565b601482019150612d0f8284612ccd565b5060200192915050565b6020810161081782846123c8565b60808101612d3582876123c8565b612d4260208301866123c8565b612d4f60408301856124d5565b8181036060830152612d6181846124de565b9695505050505050565b60408101612d7982856123c8565b611b3b60208301846124d5565b60208082528101611b3b8184612430565b60208082528101611b3b818461247e565b6020810161081782846124cc565b60808101612dc482876124d5565b612dd16020830186612cde565b612dde60408301856124d5565b612deb60608301846124d5565b95945050505050565b60208082528101611b3b81846124de565b6020808252810161081781612556565b602080825281016108178161258f565b60208082528101610817816125c8565b6020808252810161081781612615565b6020808252810161081781612669565b60208082528101610817816126b1565b60208082528101610817816126ea565b6020808252810161081781612730565b6020808252810161081781612769565b60208082528101610817816127b7565b6020808252810161081781612816565b6020808252810161081781612862565b60208082528101610817816128ad565b60208082528101610817816128f0565b6020808252810161081781612929565b6020808252810161081781612977565b60208082528101610817816129c5565b60208082528101610817816129fe565b6020808252810161081781612a42565b6020808252810161081781612a8d565b6020808252810161081781612ade565b6020808252810161081781612b21565b6020808252810161081781612b74565b6020808252810161081781612bc2565b6020808252810161081781612c09565b6020808252810161081781612c42565b6020808252810161081781612c94565b6020810161081782846124d5565b60608101612fd182866124d5565b8181036020830152612fe381856123d7565b90508181036040830152612deb818461247e565b60405181810167ffffffffffffffff8111828210171561301657600080fd5b604052919050565b600067ffffffffffffffff82111561303557600080fd5b5060209081020190565b600067ffffffffffffffff82111561305657600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b919050565b60006108178261309c565b151590565b6001600160e01b03191690565b6001600160a01b031690565b60ff1690565b60006108178261307f565b82818337506000910152565b60005b838110156130e05781810151838201526020016130c8565b83811115610cbc5750506000910152565b60006108178260006108178261310c565b601f01601f191690565b60601b90565b61311b8161307f565b811461068257600080fd5b61311b8161308a565b61311b8161077c565b61311b8161308f565b61311b816130a856fea365627a7a72315820cbdb29bb11bc4baf42a2f6229355125f1baa73cc291341c017423c96123797b56c6578706572696d656e74616cf564736f6c63430005110040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000f03ba06dd459ae597357b491219fcb573f5fe683000000000000000000000000000000000000000000000000000000000000000d506f6c69746963616c20417274000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007506f6c6941727400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003168747470733a2f2f6170692d6d61696e6e65742e72617269626c652e636f6d2f636f6e74726163744d657461646174612f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001968747470733a2f2f697066732e64616f6e6f6d69632e636f6d00000000000000
-----Decoded View---------------
Arg [0] : name (string): Political Art
Arg [1] : symbol (string): PoliArt
Arg [2] : contractURI (string): https://api-mainnet.rarible.com/contractMetadata/
Arg [3] : tokenURIPrefix (string): https://ipfs.daonomic.com
Arg [4] : signer (address): 0xf03Ba06Dd459AE597357b491219fCb573f5fe683
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 000000000000000000000000f03ba06dd459ae597357b491219fcb573f5fe683
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [6] : 506f6c69746963616c2041727400000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [8] : 506f6c6941727400000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000031
Arg [10] : 68747470733a2f2f6170692d6d61696e6e65742e72617269626c652e636f6d2f
Arg [11] : 636f6e74726163744d657461646174612f000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [13] : 68747470733a2f2f697066732e64616f6e6f6d69632e636f6d00000000000000
Deployed Bytecode Sourcemap
56915:1362:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56915:1362:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20281:135;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;53148:18;;;:::i;:::-;;;;;;;;25142:204;;;;;;;;;:::i;:::-;;;;;;;;24424:425;;;;;;;;;:::i;:::-;;57919:97;;;;;;;;;:::i;54508:300::-;;;;;;;;;:::i;:::-;;;;;;;;40281:96;;;:::i;:::-;;;;;;;;26825:292;;;;;;;;;:::i;39890:232::-;;;;;;;;;:::i;27779:134::-;;;;;;;;;:::i;37549:237::-;;;;;;;;;:::i;40723:199::-;;;;;;;;;:::i;53331:38::-;;;;;;;;;:::i;:::-;;;;;;;;;23765:228;;;;;;;;;:::i;57473:339::-;;;;;;;;;:::i;23328:211::-;;;;;;;;;:::i;2861:140::-;;;:::i;5030:109::-;;;;;;;;;:::i;2050:79::-;;;:::i;2416:94::-;;;:::i;58159:115::-;;;;;;;;;:::i;53196:20::-;;;:::i;58024:127::-;;;;;;;;;:::i;25647:254::-;;;;;;;;;:::i;28650:272::-;;;;;;;;;:::i;54156:344::-;;;;;;;;;:::i;:::-;;;;;;;;50681:28;;;:::i;55719:210::-;;;;;;;;;:::i;5247:79::-;;;:::i;50010:25::-;;;:::i;26231:147::-;;;;;;;;;:::i;57820:91::-;;;;;;;;;:::i;3156:109::-;;;;;;;;;:::i;20281:135::-;-1:-1:-1;;;;;;20375:33:0;20351:4;20375:33;;;:20;:33;;;;;;;;;20281:135::o;53148:18::-;;;;;;;;;;;;;;;-1:-1:-1;;53148:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25142:204::-;25201:7;25229:16;25237:7;25229;:16::i;:::-;25221:73;;;;-1:-1:-1;;;25221:73:0;;;;;;;;;;;;;;;;;-1:-1:-1;25314:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25314:24:0;;25142:204::o;24424:425::-;24488:13;24504:16;24512:7;24504;:16::i;:::-;24488:32;;24545:5;-1:-1:-1;;;;;24539:11:0;:2;-1:-1:-1;;;;;24539:11:0;;;24531:57;;;;-1:-1:-1;;;24531:57:0;;;;;;;;;24625:5;-1:-1:-1;;;;;24609:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;24609:21:0;;:62;;;;24634:37;24651:5;24658:12;:10;:12::i;24634:37::-;24601:154;;;;-1:-1:-1;;;24601:154:0;;;;;;;;;24768:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;24768:29:0;-1:-1:-1;;;;;24768:29:0;;;;;;;;;24813:28;;24768:24;;24813:28;;;;;;;24424:425;;;:::o;57919:97::-;2262:9;:7;:9::i;:::-;2254:54;;;;-1:-1:-1;;;2254:54:0;;;;;;;;;57986:22;58000:7;57986:13;:22::i;:::-;57919:97;:::o;54508:300::-;54607:8;;;;:4;:8;;;;;;;;54586:29;;;;;;;;;;;;;;;;;54560:13;;;;54586:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54586:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54626:20;54660:5;:12;54649:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;54649:24:0;-1:-1:-1;54626:47:0;-1:-1:-1;54689:6:0;54684:93;54705:5;:12;54701:1;:16;54684:93;;;54751:5;54757:1;54751:8;;;;;;;;;;;;;;:14;;;54739:6;54746:1;54739:9;;;;;;;;;;;;;;;;;:26;54719:3;;54684:93;;;-1:-1:-1;54794:6:0;54508:300;-1:-1:-1;;;54508:300:0:o;40281:96::-;40352:10;:17;40281:96;;:::o;26825:292::-;26969:41;26988:12;:10;:12::i;:::-;27002:7;26969:18;:41::i;:::-;26961:103;;;;-1:-1:-1;;;26961:103:0;;;;;;;;;27077:32;27091:4;27097:2;27101:7;27077:13;:32::i;:::-;26825:292;;;:::o;39890:232::-;39970:7;40006:16;40016:5;40006:9;:16::i;:::-;39998:5;:24;39990:80;;;;-1:-1:-1;;;39990:80:0;;;;;;;;;-1:-1:-1;;;;;40088:19:0;;;;;;:12;:19;;;;;:26;;40108:5;;40088:26;;;;;;;;;;;;;;40081:33;;39890:232;;;;;:::o;27779:134::-;27866:39;27883:4;27889:2;27893:7;27866:39;;;;;;;;;;;;:16;:39::i;37549:237::-;37659:41;37678:12;:10;:12::i;37659:41::-;37651:102;;;;-1:-1:-1;;;37651:102:0;;;;;;;;;37764:14;37770:7;37764:5;:14::i;40723:199::-;40781:7;40817:13;:11;:13::i;:::-;40809:5;:21;40801:78;;;;-1:-1:-1;;;40801:78:0;;;;;;;;;40897:10;40908:5;40897:17;;;;;;;;;;;;;;;;40890:24;;40723:199;;;:::o;53331:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53331:38:0;;;;-1:-1:-1;53331:38:0;-1:-1:-1;53331:38:0;:::o;23765:228::-;23820:7;23856:20;;;:11;:20;;;;;;-1:-1:-1;;;;;23856:20:0;23895:19;23887:73;;;;-1:-1:-1;;;23887:73:0;;;;;;;;57473:339;2262:9;:7;:9::i;:::-;2254:54;;;;-1:-1:-1;;;2254:54:0;;;;;;;;;57615:72;57624:62;57661:4;57667:7;57644:31;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;57644:31:0;;;57634:42;;;;;;57678:1;57681;57684;57624:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57624:62:0;;;;;;;;57615:8;:72::i;:::-;57607:111;;;;-1:-1:-1;;;57607:111:0;;;;;;;;;57729:33;57735:10;57747:7;57756:5;57729;:33::i;:::-;57773:31;57786:7;57795:8;57773:12;:31::i;:::-;57473:339;;;;;;:::o;23328:211::-;23383:7;-1:-1:-1;;;;;23411:19:0;;23403:74;;;;-1:-1:-1;;;23403:74:0;;;;;;;;;-1:-1:-1;;;;;23497:24:0;;;;;;:17;:24;;;;;:34;;:32;:34::i;2861:140::-;2262:9;:7;:9::i;:::-;2254:54;;;;-1:-1:-1;;;2254:54:0;;;;;;;;;2960:1;2944:6;;2923:40;;-1:-1:-1;;;;;2944:6:0;;;;2923:40;;2960:1;;2923:40;2991:1;2974:19;;-1:-1:-1;;;;;;2974:19:0;;;2861:140::o;5030:109::-;5086:4;5110:21;:8;5123:7;5110:21;:12;:21;:::i;2050:79::-;2088:7;2115:6;-1:-1:-1;;;;;2115:6:0;2050:79;:::o;2416:94::-;2456:4;2496:6;;-1:-1:-1;;;;;2496:6:0;2480:12;:10;:12::i;:::-;-1:-1:-1;;;;;2480:22:0;;2473:29;;2416:94;:::o;58159:115::-;2262:9;:7;:9::i;:::-;2254:54;;;;-1:-1:-1;;;2254:54:0;;;;;;;;;58238:28;58254:11;58238:15;:28::i;53196:20::-;;;;;;;;;;;;;;;-1:-1:-1;;53196:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58024:127;2262:9;:7;:9::i;:::-;2254:54;;;;-1:-1:-1;;;2254:54:0;;;;;;;;;58109:34;58128:14;58109:18;:34::i;25647:254::-;25733:12;:10;:12::i;:::-;-1:-1:-1;;;;;25727:18:0;:2;-1:-1:-1;;;;;25727:18:0;;;25719:56;;;;-1:-1:-1;;;25719:56:0;;;;;;;;;25827:8;25788:18;:32;25807:12;:10;:12::i;:::-;-1:-1:-1;;;;;25788:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;25788:32:0;;;:36;;;;;;;;;;;;:47;;-1:-1:-1;;25788:47:0;;;;;;;;;;;25866:12;:10;:12::i;:::-;-1:-1:-1;;;;;25851:42:0;;25884:8;25851:42;;;;;;;;;;;;;;;25647:254;;:::o;28650:272::-;28765:41;28784:12;:10;:12::i;:::-;28798:7;28765:18;:41::i;:::-;28757:103;;;;-1:-1:-1;;;28757:103:0;;;;;;;;;28871:43;28889:4;28895:2;28899:7;28908:5;28871:17;:43::i;:::-;28650:272;;;;:::o;54156:344::-;54273:8;;;;:4;:8;;;;;;;;54252:29;;;;;;;;;;;;;;;;;54215:24;;;;54252:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54252:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54292:31;54348:5;:12;54326:35;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;54326:35:0;-1:-1:-1;54292:69:0;-1:-1:-1;54377:6:0;54372:97;54393:5;:12;54389:1;:16;54372:97;;;54439:5;54445:1;54439:8;;;;;;;;;;;;;;:18;;;54427:6;54434:1;54427:9;;;;;;;;-1:-1:-1;;;;;54427:30:0;;;:9;;;;;;;;;;;:30;54407:3;;54372:97;;50681:28;;;;;;;;;;;;;;;-1:-1:-1;;50681:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55719:210;55777:13;55811:16;55819:7;55811;:16::i;:::-;55803:76;;;;-1:-1:-1;;;55803:76:0;;;;;;;;;55897:24;55913:7;55897:15;:24::i;5247:79::-;5291:27;5305:12;:10;:12::i;:::-;5291:13;:27::i;:::-;5247:79::o;50010:25::-;;;;;;;;;;;;;;;-1:-1:-1;;50010:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26231:147;-1:-1:-1;;;;;26335:25:0;;;26311:4;26335:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26231:147::o;57820:91::-;2262:9;:7;:9::i;:::-;2254:54;;;;-1:-1:-1;;;2254:54:0;;;;;;;;;57884:19;57895:7;57884:10;:19::i;3156:109::-;2262:9;:7;:9::i;:::-;2254:54;;;;-1:-1:-1;;;2254:54:0;;;;;;;;;3229:28;3248:8;3229:18;:28::i;30115:155::-;30172:4;30205:20;;;:11;:20;;;;;;-1:-1:-1;;;;;30205:20:0;30243:19;;;30115:155::o;841:98::-;921:10;841:98;:::o;5464:130::-;5524:24;:8;5540:7;5524:24;:15;:24;:::i;:::-;5564:22;;-1:-1:-1;;;;;5564:22:0;;;;;;;;5464:130;:::o;30640:333::-;30725:4;30750:16;30758:7;30750;:16::i;:::-;30742:73;;;;-1:-1:-1;;;30742:73:0;;;;;;;;;30826:13;30842:16;30850:7;30842;:16::i;:::-;30826:32;;30888:5;-1:-1:-1;;;;;30877:16:0;:7;-1:-1:-1;;;;;30877:16:0;;:51;;;;30921:7;-1:-1:-1;;;;;30897:31:0;:20;30909:7;30897:11;:20::i;:::-;-1:-1:-1;;;;;30897:31:0;;30877:51;:87;;;;30932:32;30949:5;30956:7;30932:16;:32::i;:::-;30869:96;30640:333;-1:-1:-1;;;;30640:333:0:o;41306:245::-;41392:38;41412:4;41418:2;41422:7;41392:19;:38::i;:::-;41443:47;41476:4;41482:7;41443:32;:47::i;:::-;41503:40;41531:2;41535:7;41503:27;:40::i;33858:92::-;33910:32;33916:16;33924:7;33916;:16::i;:::-;33934:7;33910:5;:32::i;54816:696::-;54900:18;54906:2;54910:7;54900:5;:18::i;:::-;54929:27;54973:5;:12;54959:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;54959:27:0;;54929:57;;54997:17;55028:5;:12;55017:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;55017:24:0;-1:-1:-1;54997:44:0;-1:-1:-1;55057:6:0;55052:346;55073:5;:12;55069:1;:16;55052:346;;;55145:3;-1:-1:-1;;;;;55115:34:0;:5;55121:1;55115:8;;;;;;;;;;;;;;:18;;;-1:-1:-1;;;;;55115:34:0;;;55107:74;;;;-1:-1:-1;;;55107:74:0;;;;;;;;;55204:5;55210:1;55204:8;;;;;;;;;;;;;;:14;;;55222:1;55204:19;;55196:60;;;;-1:-1:-1;;;55196:60:0;;;;;;;;;55271:13;;;;:4;:13;;;;;55290:8;;:5;;55296:1;;55290:8;;;;;;;;;;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;55271:28:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;55271:28:0;-1:-1:-1;;;;;55271:28:0;;;;;;;;;;;;;;;55330:8;;;;55336:1;;55330:8;;;;;;;;;;;;:18;;;55314:10;55325:1;55314:13;;;;;;;;;;;;;:34;-1:-1:-1;;;;;55314:34:0;;;-1:-1:-1;;;;;55314:34:0;;;;;55372:5;55378:1;55372:8;;;;;;;;;;;;;;:14;;;55363:3;55367:1;55363:6;;;;;;;;;;;;;;;;;:23;55087:3;;55052:346;;;-1:-1:-1;55412:12:0;;:16;55408:97;;55450:43;55468:7;55477:10;55489:3;55450:43;;;;;;;;;;;;;;;;;55408:97;54816:696;;;;;:::o;56176:202::-;56262:16;56270:7;56262;:16::i;:::-;56254:73;;;;-1:-1:-1;;;56254:73:0;;;;;;;;;56338:32;56357:7;56366:3;56338:18;:32::i;:::-;56176:202;;:::o;18960:114::-;19052:14;;18960:114::o;4390:203::-;4462:4;-1:-1:-1;;;;;4487:21:0;;4479:68;;;;-1:-1:-1;;;4479:68:0;;;;;;;;;-1:-1:-1;;;;;;4565:20:0;:11;:20;;;;;;;;;;;;;;;4390:203::o;50476:107::-;50549:26;;;;:11;;:26;;;;;:::i;51765:119::-;51844:32;;;;:14;;:32;;;;;:::i;29641:272::-;29751:32;29765:4;29771:2;29775:7;29751:13;:32::i;:::-;29802:48;29825:4;29831:2;29835:7;29844:5;29802:22;:48::i;:::-;29794:111;;;;-1:-1:-1;;;29794:111:0;;;;;;;;51120:142;51234:19;;;;:10;:19;;;;;;;;;51212:42;;;;;;;;;;;-1:-1:-1;;51212:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;51179:13;;51212:42;;;;51234:19;51212:42;;51234:19;51212:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51212:14:0;:21;;;;;;;;-1:-1:-1;;51212:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51212:14:0;;-1:-1:-1;51212:21:0;-1:-1:-1;51212:21:0;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;;:::i;5334:122::-;5391:21;:8;5404:7;5391:21;:12;:21;:::i;:::-;5428:20;;-1:-1:-1;;;;;5428:20:0;;;;;;;;5334:122;:::o;3371:229::-;-1:-1:-1;;;;;3445:22:0;;3437:73;;;;-1:-1:-1;;;3437:73:0;;;;;;;;;3547:6;;;3526:38;;-1:-1:-1;;;;;3526:38:0;;;;3547:6;;;3526:38;;;3575:6;:17;;-1:-1:-1;;;;;;3575:17:0;-1:-1:-1;;;;;3575:17:0;;;;;;;;;;3371:229::o;4112:183::-;4192:18;4196:4;4202:7;4192:3;:18::i;:::-;4184:64;;;;-1:-1:-1;;;4184:64:0;;;;;;;;;-1:-1:-1;;;;;4259:20:0;4282:5;4259:20;;;;;;;;;;;:28;;-1:-1:-1;;4259:28:0;;;4112:183::o;34336:459::-;34450:4;-1:-1:-1;;;;;34430:24:0;:16;34438:7;34430;:16::i;:::-;-1:-1:-1;;;;;34430:24:0;;34422:78;;;;-1:-1:-1;;;34422:78:0;;;;;;;;;-1:-1:-1;;;;;34519:16:0;;34511:65;;;;-1:-1:-1;;;34511:65:0;;;;;;;;;34589:23;34604:7;34589:14;:23::i;:::-;-1:-1:-1;;;;;34625:23:0;;;;;;:17;:23;;;;;:35;;:33;:35::i;:::-;-1:-1:-1;;;;;34671:21:0;;;;;;:17;:21;;;;;:33;;:31;:33::i;:::-;34717:20;;;;:11;:20;;;;;;:25;;-1:-1:-1;;;;;;34717:25:0;-1:-1:-1;;;;;34717:25:0;;;;;;;;;34760:27;;34717:20;;34760:27;;;;;;;34336:459;;;:::o;44491:1148::-;-1:-1:-1;;;;;44782:18:0;;44757:22;44782:18;;;:12;:18;;;;;:25;:32;;44812:1;44782:32;:29;:32;:::i;:::-;44825:18;44846:26;;;:17;:26;;;;;;44757:57;;-1:-1:-1;44979:28:0;;;44975:328;;-1:-1:-1;;;;;45046:18:0;;45024:19;45046:18;;;:12;:18;;;;;:34;;45065:14;;45046:34;;;;;;;;;;;;;;45024:56;;45130:11;45097:12;:18;45110:4;-1:-1:-1;;;;;45097:18:0;-1:-1:-1;;;;;45097:18:0;;;;;;;;;;;;45116:10;45097:30;;;;;;;;;;;;;;;;;;;:44;;;;45214:30;;;:17;:30;;;;;:43;;;44975:328;-1:-1:-1;;;;;45392:18:0;;;;;;:12;:18;;;;;:27;;;;;-1:-1:-1;;45392:27:0;;;:::i;43313:186::-;-1:-1:-1;;;;;43427:16:0;;;;;;;:12;:16;;;;;;;;:23;;43398:26;;;:17;:26;;;;;:52;;;43461:16;;;39:1:-1;23:18;;45:23;;43461:30:0;;;;;;;;43313:186::o;56680:136::-;56747:27;56759:5;56766:7;56747:11;:27::i;:::-;56785:23;56800:7;56785:14;:23::i;41816:202::-;41880:24;41892:2;41896:7;41880:11;:24::i;:::-;41917:40;41945:2;41949:7;41917:27;:40::i;:::-;41970;42002:7;41970:31;:40::i;51509:111::-;51587:19;;;;:10;:19;;;;;;;;:25;;;;;;;;:::i;35447:1079::-;35569:4;35596:15;:2;-1:-1:-1;;;;;35596:13:0;;:15::i;:::-;35591:60;;-1:-1:-1;35635:4:0;35628:11;;35591:60;35722:12;35736:23;-1:-1:-1;;;;;35763:7:0;;-1:-1:-1;;;35868:12:0;:10;:12::i;:::-;35895:4;35914:7;35936:5;35771:181;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;35771:181:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;35771:181:0;;;179:29:-1;;;;160:49;;;35763:190:0;;;;35771:181;35763:190;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;35721:232:0;;;;35969:7;35964:555;;35997:17;;:21;35993:384;;36165:10;36159:17;36226:15;36213:10;36209:2;36205:19;36198:44;36113:148;36301:60;;-1:-1:-1;;;36301:60:0;;;;;;;;35964:555;36409:13;36436:10;36425:32;;;;;;;;;;;;;;-1:-1:-1;;;;;;36480:26:0;-1:-1:-1;;;36480:26:0;;-1:-1:-1;36472:35:0;;-1:-1:-1;;;36472:35:0;47595:422;47670:13;47696:16;47721:2;47696:28;;47735:16;47760:2;47735:28;;47774:16;47816:3;:10;47803:3;:10;:23;47793:34;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;47793:34:0;87::-1;135:17;;-1:-1;47793:34:0;-1:-1:-1;47774:53:0;-1:-1:-1;47838:6:0;;47859:55;47880:3;:10;47876:1;:14;47859:55;;;47908:3;47912:1;47908:6;;;;;;;;;;;;;;;;47897:3;47901;;;;;;47897:8;;;;;;;;;;;:17;-1:-1:-1;;;;;47897:17:0;;;;;;;;-1:-1:-1;47892:3:0;;47859:55;;;-1:-1:-1;47930:6:0;47925:55;47946:3;:10;47942:1;:14;47925:55;;;47974:3;47978:1;47974:6;;;;;;;;;;;;;;;;47963:3;47967;;;;;;47963:8;;;;;;;;;;;:17;-1:-1:-1;;;;;47963:17:0;;;;;;;;-1:-1:-1;47958:3:0;;47925:55;;;-1:-1:-1;48005:3:0;;47595:422;-1:-1:-1;;;;;;47595:422:0:o;3854:178::-;3932:18;3936:4;3942:7;3932:3;:18::i;:::-;3931:19;3923:63;;;;-1:-1:-1;;;3923:63:0;;;;;;;;;-1:-1:-1;;;;;3997:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;3997:27:0;4020:4;3997:27;;;3854:178::o;36694:175::-;36794:1;36758:24;;;:15;:24;;;;;;-1:-1:-1;;;;;36758:24:0;:38;36754:108;;36848:1;36813:24;;;:15;:24;;;;;:37;;-1:-1:-1;;;;;;36813:37:0;;;36694:175::o;19271:110::-;19352:14;;:21;;19371:1;19352:21;:18;:21;:::i;:::-;19335:38;;19271:110::o;19082:181::-;19236:19;;19254:1;19236:19;;;19082:181::o;10790:136::-;10848:7;10875:43;10879:1;10882;10875:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;10868:50;10790:136;-1:-1:-1;;;10790:136:0:o;42302:372::-;42369:27;42381:5;42388:7;42369:11;:27::i;:::-;42409:48;42442:5;42449:7;42409:32;:48::i;:::-;42607:1;42578:26;;;:17;:26;;;;;:30;42621:45;42596:7;42621:36;:45::i;51892:165::-;51963:19;;;;:10;:19;;;;;51957:33;;-1:-1:-1;;51957:33:0;;;;;;;;;;;:38;51953:97;;52019:19;;;;:10;:19;;;;;52012:26;;;:::i;32725:335::-;-1:-1:-1;;;;;32797:16:0;;32789:61;;;;-1:-1:-1;;;32789:61:0;;;;;;;;;32870:16;32878:7;32870;:16::i;:::-;32869:17;32861:58;;;;-1:-1:-1;;;32861:58:0;;;;;;;;;32932:20;;;;:11;:20;;;;;;;;:25;;-1:-1:-1;;;;;;32932:25:0;-1:-1:-1;;;;;32932:25:0;;;;;;;;32968:21;;:17;:21;;;;;:33;;:31;:33::i;:::-;33019;;33044:7;;-1:-1:-1;;;;;33019:33:0;;;33036:1;;33019:33;;33036:1;;33019:33;32725:335;;:::o;43700:164::-;43804:10;:17;;43777:24;;;;:15;:24;;;;;:44;;;39:1:-1;23:18;;45:23;;43832:24:0;;;;;;;43700:164::o;15613:619::-;15673:4;16141:20;;15984:66;16181:23;;;;;;:42;;-1:-1:-1;;16208:15:0;;;16173:51;-1:-1:-1;;15613:619:0:o;11263:192::-;11349:7;11385:12;11377:6;;;;11369:29;;;;-1:-1:-1;;;11369:29:0;;;;;;;;;;-1:-1:-1;;;11421:5:0;;;11263:192::o;33337:333::-;33432:5;-1:-1:-1;;;;;33412:25:0;:16;33420:7;33412;:16::i;:::-;-1:-1:-1;;;;;33412:25:0;;33404:75;;;;-1:-1:-1;;;33404:75:0;;;;;;;;;33492:23;33507:7;33492:14;:23::i;:::-;-1:-1:-1;;;;;33528:24:0;;;;;;:17;:24;;;;;:36;;:34;:36::i;:::-;33606:1;33575:20;;;:11;:20;;;;;;:33;;-1:-1:-1;;;;;;33575:33:0;;;33626:36;33587:7;;33606:1;-1:-1:-1;;;;;33626:36:0;;;;;33606:1;;33626:36;33337:333;;:::o;45934:1082::-;46212:10;:17;46187:22;;46212:24;;46234:1;46212:24;:21;:24;:::i;:::-;46247:18;46268:24;;;:15;:24;;;;;;46641:10;:26;;46187:49;;-1:-1:-1;46268:24:0;;46187:49;;46641:26;;;;;;;;;;;;;;46619:48;;46705:11;46680:10;46691;46680:22;;;;;;;;;;;;;;;;;;;:36;;;;46785:28;;;:15;:28;;;;;;:41;;;46950:10;:19;;;;;-1:-1:-1;;46950:19:0;;;:::i;:::-;-1:-1:-1;;;47007:1:0;46980:24;;;-1:-1:-1;46980:15:0;:24;;;;;:28;45934:1082::o;56915:1362::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56915:1362:0;;;-1:-1:-1;56915:1362:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:130:-1;72:20;;97:33;72:20;97:33;;327:758;;461:3;454:4;446:6;442:17;438:27;428:2;;479:1;476;469:12;428:2;516:6;503:20;538:97;553:81;627:6;553:81;;;538:97;;;529:106;;652:5;677:6;670:5;663:21;707:4;699:6;695:17;685:27;;729:4;724:3;720:14;713:21;;782:6;829:3;821:4;813:6;809:17;804:3;800:27;797:36;794:2;;;846:1;843;836:12;794:2;871:1;856:223;881:6;878:1;875:13;856:223;;;939:3;961:54;1011:3;999:10;961:54;;;949:67;;-1:-1;1039:4;1030:14;;;;1067:4;1058:14;;;;;903:1;896:9;856:223;;;860:14;421:664;;;;;;;;1093:124;1157:20;;1182:30;1157:20;1182:30;;1224:130;1291:20;;1316:33;1291:20;1316:33;;1361:128;1427:20;;1452:32;1427:20;1452:32;;1496:132;1573:13;;1591:32;1573:13;1591:32;;1636:440;;1737:3;1730:4;1722:6;1718:17;1714:27;1704:2;;1755:1;1752;1745:12;1704:2;1792:6;1779:20;1814:64;1829:48;1870:6;1829:48;;1814:64;1805:73;;1898:6;1891:5;1884:21;1934:4;1926:6;1922:17;1967:4;1960:5;1956:16;2002:3;1993:6;1988:3;1984:16;1981:25;1978:2;;;2019:1;2016;2009:12;1978:2;2029:41;2063:6;2058:3;2053;2029:41;;;1697:379;;;;;;;;2563:473;;2669:4;2657:9;2652:3;2648:19;2644:30;2641:2;;;2687:1;2684;2677:12;2641:2;2705:20;2720:4;2705:20;;;2696:29;-1:-1;2780:1;2812:57;2865:3;2845:9;2812:57;;;2787:83;;-1:-1;2932:2;2965:49;3010:3;2986:22;;;2965:49;;;2958:4;2951:5;2947:16;2940:75;2891:135;2635:401;;;;;3180:126;3245:20;;3270:31;3245:20;3270:31;;3313:241;;3417:2;3405:9;3396:7;3392:23;3388:32;3385:2;;;3433:1;3430;3423:12;3385:2;3468:1;3485:53;3530:7;3510:9;3485:53;;3561:366;;;3682:2;3670:9;3661:7;3657:23;3653:32;3650:2;;;3698:1;3695;3688:12;3650:2;3733:1;3750:53;3795:7;3775:9;3750:53;;;3740:63;;3712:97;3840:2;3858:53;3903:7;3894:6;3883:9;3879:22;3858:53;;;3848:63;;3819:98;3644:283;;;;;;3934:491;;;;4072:2;4060:9;4051:7;4047:23;4043:32;4040:2;;;4088:1;4085;4078:12;4040:2;4123:1;4140:53;4185:7;4165:9;4140:53;;;4130:63;;4102:97;4230:2;4248:53;4293:7;4284:6;4273:9;4269:22;4248:53;;;4238:63;;4209:98;4338:2;4356:53;4401:7;4392:6;4381:9;4377:22;4356:53;;;4346:63;;4317:98;4034:391;;;;;;4432:721;;;;;4596:3;4584:9;4575:7;4571:23;4567:33;4564:2;;;4613:1;4610;4603:12;4564:2;4648:1;4665:53;4710:7;4690:9;4665:53;;;4655:63;;4627:97;4755:2;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;;;4763:63;;4734:98;4863:2;4881:53;4926:7;4917:6;4906:9;4902:22;4881:53;;;4871:63;;4842:98;4999:2;4988:9;4984:18;4971:32;5023:18;5015:6;5012:30;5009:2;;;5055:1;5052;5045:12;5009:2;5075:62;5129:7;5120:6;5109:9;5105:22;5075:62;;;5065:72;;4950:193;4558:595;;;;;;;;5160:360;;;5278:2;5266:9;5257:7;5253:23;5249:32;5246:2;;;5294:1;5291;5284:12;5246:2;5329:1;5346:53;5391:7;5371:9;5346:53;;;5336:63;;5308:97;5436:2;5454:50;5496:7;5487:6;5476:9;5472:22;5454:50;;5527:366;;;5648:2;5636:9;5627:7;5623:23;5619:32;5616:2;;;5664:1;5661;5654:12;5616:2;5699:1;5716:53;5761:7;5741:9;5716:53;;;5706:63;;5678:97;5806:2;5824:53;5869:7;5860:6;5849:9;5845:22;5824:53;;5900:239;;6003:2;5991:9;5982:7;5978:23;5974:32;5971:2;;;6019:1;6016;6009:12;5971:2;6054:1;6071:52;6115:7;6095:9;6071:52;;6146:261;;6260:2;6248:9;6239:7;6235:23;6231:32;6228:2;;;6276:1;6273;6266:12;6228:2;6311:1;6328:63;6383:7;6363:9;6328:63;;6414:347;;6528:2;6516:9;6507:7;6503:23;6499:32;6496:2;;;6544:1;6541;6534:12;6496:2;6579:31;;6630:18;6619:30;;6616:2;;;6662:1;6659;6652:12;6616:2;6682:63;6737:7;6728:6;6717:9;6713:22;6682:63;;6768:241;;6872:2;6860:9;6851:7;6847:23;6843:32;6840:2;;;6888:1;6885;6878:12;6840:2;6923:1;6940:53;6985:7;6965:9;6940:53;;7016:366;;;7137:2;7125:9;7116:7;7112:23;7108:32;7105:2;;;7153:1;7150;7143:12;7105:2;7188:1;7205:53;7250:7;7230:9;7205:53;;7389:1141;;;;;;;7628:3;7616:9;7607:7;7603:23;7599:33;7596:2;;;7645:1;7642;7635:12;7596:2;7680:1;7697:53;7742:7;7722:9;7697:53;;;7687:63;;7659:97;7787:2;7805:51;7848:7;7839:6;7828:9;7824:22;7805:51;;;7795:61;;7766:96;7893:2;7911:53;7956:7;7947:6;7936:9;7932:22;7911:53;;;7901:63;;7872:98;8001:2;8019:53;8064:7;8055:6;8044:9;8040:22;8019:53;;;8009:63;;7980:98;8137:3;8126:9;8122:19;8109:33;8162:18;8154:6;8151:30;8148:2;;;8194:1;8191;8184:12;8148:2;8214:95;8301:7;8292:6;8281:9;8277:22;8214:95;;;8204:105;;8088:227;8374:3;8363:9;8359:19;8346:33;8399:18;8391:6;8388:30;8385:2;;;8431:1;8428;8421:12;8385:2;8451:63;8506:7;8497:6;8486:9;8482:22;8451:63;;;8441:73;;8325:195;7590:940;;;;;;;;;8538:205;;8641:62;8699:3;8691:6;8641:62;;;-1:-1;;8732:4;8723:14;;8634:109;8934:173;;9021:46;9063:3;9055:6;9021:46;;9115:127;9204:32;9230:5;9204:32;;;9199:3;9192:45;9186:56;;;9654:690;;9799:54;9847:5;9799:54;;;9866:86;9945:6;9940:3;9866:86;;;9859:93;;9973:56;10023:5;9973:56;;;10049:7;10077:1;10062:260;10087:6;10084:1;10081:13;10062:260;;;10154:6;10148:13;10175:63;10234:3;10219:13;10175:63;;;10168:70;;10255:60;10308:6;10255:60;;;10245:70;-1:-1;;10109:1;10102:9;10062:260;;;-1:-1;10335:3;;9778:566;-1:-1;;;;;9778:566;10399:754;;10560:62;10616:5;10560:62;;;10635:94;10722:6;10717:3;10635:94;;;10628:101;;10750:64;10808:5;10750:64;;;10834:7;10862:1;10847:284;10872:6;10869:1;10866:13;10847:284;;;10939:6;10933:13;10960:79;11035:3;11020:13;10960:79;;;10953:86;;11056:68;11117:6;11056:68;;;11046:78;-1:-1;;10894:1;10887:9;10847:284;;11192:690;;11337:54;11385:5;11337:54;;;11404:86;11483:6;11478:3;11404:86;;;11397:93;;11511:56;11561:5;11511:56;;;11587:7;11615:1;11600:260;11625:6;11622:1;11619:13;11600:260;;;11692:6;11686:13;11713:63;11772:3;11757:13;11713:63;;;11706:70;;11793:60;11846:6;11793:60;;;11783:70;-1:-1;;11647:1;11640:9;11600:260;;11890:104;11967:21;11982:5;11967:21;;12001:113;12084:24;12102:5;12084:24;;12121:343;;12231:38;12263:5;12231:38;;;12281:70;12344:6;12339:3;12281:70;;;12274:77;;12356:52;12401:6;12396:3;12389:4;12382:5;12378:16;12356:52;;;12429:29;12451:6;12429:29;;;12420:39;;;;12211:253;-1:-1;;;12211:253;12471:356;;12599:38;12631:5;12599:38;;;12649:88;12730:6;12725:3;12649:88;;;12642:95;;12742:52;12787:6;12782:3;12775:4;12768:5;12764:16;12742:52;;;12806:16;;;;;12579:248;-1:-1;;12579:248;12834:223;12964:87;12984:66;13044:5;12984:66;;;12964:87;;13765:328;;13925:67;13989:2;13984:3;13925:67;;;14025:30;14005:51;;14084:2;14075:12;;13911:182;-1:-1;;13911:182;14102:331;;14262:67;14326:2;14321:3;14262:67;;;14362:33;14342:54;;14424:2;14415:12;;14248:185;-1:-1;;14248:185;14442:380;;14602:67;14666:2;14661:3;14602:67;;;14702:34;14682:55;;-1:-1;;;14766:2;14757:12;;14750:35;14813:2;14804:12;;14588:234;-1:-1;;14588:234;14831:387;;14991:67;15055:2;15050:3;14991:67;;;15091:34;15071:55;;-1:-1;;;15155:2;15146:12;;15139:42;15209:2;15200:12;;14977:241;-1:-1;;14977:241;15227:375;;15387:67;15451:2;15446:3;15387:67;;;15487:34;15467:55;;-1:-1;;;15551:2;15542:12;;15535:30;15593:2;15584:12;;15373:229;-1:-1;;15373:229;15611:328;;15771:67;15835:2;15830:3;15771:67;;;15871:30;15851:51;;15930:2;15921:12;;15757:182;-1:-1;;15757:182;15948:373;;16108:67;16172:2;16167:3;16108:67;;;16208:34;16188:55;;-1:-1;;;16272:2;16263:12;;16256:28;16312:2;16303:12;;16094:227;-1:-1;;16094:227;16330:325;;16490:67;16554:2;16549:3;16490:67;;;16590:27;16570:48;;16646:2;16637:12;;16476:179;-1:-1;;16476:179;16664:381;;16824:67;16888:2;16883:3;16824:67;;;16924:34;16904:55;;-1:-1;;;16988:2;16979:12;;16972:36;17036:2;17027:12;;16810:235;-1:-1;;16810:235;17054:393;;17214:67;17278:2;17273:3;17214:67;;;17314:34;17294:55;;17383:26;17378:2;17369:12;;17362:48;17438:2;17429:12;;17200:247;-1:-1;;17200:247;17456:379;;17616:67;17680:2;17675:3;17616:67;;;17716:34;17696:55;;-1:-1;;;17780:2;17771:12;;17764:34;17826:2;17817:12;;17602:233;-1:-1;;17602:233;17844:378;;18004:67;18068:2;18063:3;18004:67;;;18104:34;18084:55;;-1:-1;;;18168:2;18159:12;;18152:33;18213:2;18204:12;;17990:232;-1:-1;;17990:232;18231:370;;18391:67;18455:2;18450:3;18391:67;;;18491:34;18471:55;;-1:-1;;;18555:2;18546:12;;18539:25;18592:2;18583:12;;18377:224;-1:-1;;18377:224;18610:332;;18770:67;18834:2;18829:3;18770:67;;;18870:34;18850:55;;18933:2;18924:12;;18756:186;-1:-1;;18756:186;18951:381;;19111:67;19175:2;19170:3;19111:67;;;19211:34;19191:55;;-1:-1;;;19275:2;19266:12;;19259:36;19323:2;19314:12;;19097:235;-1:-1;;19097:235;19341:381;;19501:67;19565:2;19560:3;19501:67;;;19601:34;19581:55;;-1:-1;;;19665:2;19656:12;;19649:36;19713:2;19704:12;;19487:235;-1:-1;;19487:235;19731:332;;19891:67;19955:2;19950:3;19891:67;;;19991:34;19971:55;;20054:2;20045:12;;19877:186;-1:-1;;19877:186;20072:371;;20232:67;20296:2;20291:3;20232:67;;;20332:34;20312:55;;-1:-1;;;20396:2;20387:12;;20380:26;20434:2;20425:12;;20218:225;-1:-1;;20218:225;20452:378;;20612:67;20676:2;20671:3;20612:67;;;20712:34;20692:55;;-1:-1;;;20776:2;20767:12;;20760:33;20821:2;20812:12;;20598:232;-1:-1;;20598:232;20839:384;;20999:67;21063:2;21058:3;20999:67;;;21099:34;21079:55;;-1:-1;;;21163:2;21154:12;;21147:39;21214:2;21205:12;;20985:238;-1:-1;;20985:238;21232:370;;21392:67;21456:2;21451:3;21392:67;;;21492:34;21472:55;;-1:-1;;;21556:2;21547:12;;21540:25;21593:2;21584:12;;21378:224;-1:-1;;21378:224;21611:386;;21771:67;21835:2;21830:3;21771:67;;;21871:34;21851:55;;-1:-1;;;21935:2;21926:12;;21919:41;21988:2;21979:12;;21757:240;-1:-1;;21757:240;22006:381;;22166:67;22230:2;22225:3;22166:67;;;22266:34;22246:55;;-1:-1;;;22330:2;22321:12;;22314:36;22378:2;22369:12;;22152:235;-1:-1;;22152:235;22396:374;;22556:67;22620:2;22615:3;22556:67;;;22656:34;22636:55;;-1:-1;;;22720:2;22711:12;;22704:29;22761:2;22752:12;;22542:228;-1:-1;;22542:228;22779:327;;22939:67;23003:2;22998:3;22939:67;;;23039:29;23019:50;;23097:2;23088:12;;22925:181;-1:-1;;22925:181;23115:385;;23275:67;23339:2;23334:3;23275:67;;;23375:34;23355:55;;-1:-1;;;23439:2;23430:12;;23423:40;23491:2;23482:12;;23261:239;-1:-1;;23261:239;23509:326;;23669:67;23733:2;23728:3;23669:67;;;23769:28;23749:49;;23826:2;23817:12;;23655:180;-1:-1;;23655:180;24073:152;24174:45;24194:24;24212:5;24194:24;;;24174:45;;24232:107;24311:22;24327:5;24311:22;;24346:262;;24490:93;24579:3;24570:6;24490:93;;24615:441;;24791:104;24891:3;24882:6;24791:104;;;24917:2;24912:3;24908:12;24901:19;;24931:75;25002:3;24993:6;24931:75;;;-1:-1;25028:2;25019:12;;24779:277;-1:-1;;24779:277;25063:213;25181:2;25166:18;;25195:71;25170:9;25239:6;25195:71;;25283:663;25519:3;25504:19;;25534:87;25508:9;25594:6;25534:87;;;25632:72;25700:2;25689:9;25685:18;25676:6;25632:72;;;25715;25783:2;25772:9;25768:18;25759:6;25715:72;;;25835:9;25829:4;25825:20;25820:2;25809:9;25805:18;25798:48;25860:76;25931:4;25922:6;25860:76;;;25852:84;25490:456;-1:-1;;;;;;25490:456;25953:356;26115:2;26100:18;;26129:87;26104:9;26189:6;26129:87;;;26227:72;26295:2;26284:9;26280:18;26271:6;26227:72;;26316:393;26500:2;26514:47;;;26485:18;;26575:124;26485:18;26685:6;26575:124;;26716:361;26884:2;26898:47;;;26869:18;;26959:108;26869:18;27053:6;26959:108;;27084:201;27196:2;27181:18;;27210:65;27185:9;27248:6;27210:65;;27292:539;27490:3;27475:19;;27505:71;27479:9;27549:6;27505:71;;;27587:68;27651:2;27640:9;27636:18;27627:6;27587:68;;;27666:72;27734:2;27723:9;27719:18;27710:6;27666:72;;;27749;27817:2;27806:9;27802:18;27793:6;27749:72;;;27461:370;;;;;;;;27838:293;27972:2;27986:47;;;27957:18;;28047:74;27957:18;28107:6;28047:74;;28446:407;28637:2;28651:47;;;28622:18;;28712:131;28622:18;28712:131;;28860:407;29051:2;29065:47;;;29036:18;;29126:131;29036:18;29126:131;;29274:407;29465:2;29479:47;;;29450:18;;29540:131;29450:18;29540:131;;29688:407;29879:2;29893:47;;;29864:18;;29954:131;29864:18;29954:131;;30102:407;30293:2;30307:47;;;30278:18;;30368:131;30278:18;30368:131;;30516:407;30707:2;30721:47;;;30692:18;;30782:131;30692:18;30782:131;;30930:407;31121:2;31135:47;;;31106:18;;31196:131;31106:18;31196:131;;31344:407;31535:2;31549:47;;;31520:18;;31610:131;31520:18;31610:131;;31758:407;31949:2;31963:47;;;31934:18;;32024:131;31934:18;32024:131;;32172:407;32363:2;32377:47;;;32348:18;;32438:131;32348:18;32438:131;;32586:407;32777:2;32791:47;;;32762:18;;32852:131;32762:18;32852:131;;33000:407;33191:2;33205:47;;;33176:18;;33266:131;33176:18;33266:131;;33414:407;33605:2;33619:47;;;33590:18;;33680:131;33590:18;33680:131;;33828:407;34019:2;34033:47;;;34004:18;;34094:131;34004:18;34094:131;;34242:407;34433:2;34447:47;;;34418:18;;34508:131;34418:18;34508:131;;34656:407;34847:2;34861:47;;;34832:18;;34922:131;34832:18;34922:131;;35070:407;35261:2;35275:47;;;35246:18;;35336:131;35246:18;35336:131;;35484:407;35675:2;35689:47;;;35660:18;;35750:131;35660:18;35750:131;;35898:407;36089:2;36103:47;;;36074:18;;36164:131;36074:18;36164:131;;36312:407;36503:2;36517:47;;;36488:18;;36578:131;36488:18;36578:131;;36726:407;36917:2;36931:47;;;36902:18;;36992:131;36902:18;36992:131;;37140:407;37331:2;37345:47;;;37316:18;;37406:131;37316:18;37406:131;;37554:407;37745:2;37759:47;;;37730:18;;37820:131;37730:18;37820:131;;37968:407;38159:2;38173:47;;;38144:18;;38234:131;38144:18;38234:131;;38382:407;38573:2;38587:47;;;38558:18;;38648:131;38558:18;38648:131;;38796:407;38987:2;39001:47;;;38972:18;;39062:131;38972:18;39062:131;;39210:407;39401:2;39415:47;;;39386:18;;39476:131;39386:18;39476:131;;39624:213;39742:2;39727:18;;39756:71;39731:9;39800:6;39756:71;;39844:731;40118:2;40103:18;;40132:71;40107:9;40176:6;40132:71;;;40251:9;40245:4;40241:20;40236:2;40225:9;40221:18;40214:48;40276:108;40379:4;40370:6;40276:108;;;40268:116;;40432:9;40426:4;40422:20;40417:2;40406:9;40402:18;40395:48;40457:108;40560:4;40551:6;40457:108;;40582:256;40644:2;40638:9;40670:17;;;40745:18;40730:34;;40766:22;;;40727:62;40724:2;;;40802:1;40799;40792:12;40724:2;40818;40811:22;40622:216;;-1:-1;40622:216;40845:321;;41021:18;41013:6;41010:30;41007:2;;;41053:1;41050;41043:12;41007:2;-1:-1;41088:4;41076:17;;;41141:15;;40944:222;41173:321;;41316:18;41308:6;41305:30;41302:2;;;41348:1;41345;41338:12;41302:2;-1:-1;41479:4;41415;41392:17;;;;-1:-1;;41388:33;41469:15;;41239:255;41830:151;41954:4;41945:14;;41902:79;42312:137;42415:12;;42386:63;43488:178;43606:19;;;43655:4;43646:14;;43599:67;44228:144;44363:3;44341:31;-1:-1;44341:31;44552:91;;44614:24;44632:5;44614:24;;44756:85;44822:13;44815:21;;44798:43;44927:144;-1:-1;;;;;;44988:78;;44971:100;45078:121;-1:-1;;;;;45140:54;;45123:76;45285:81;45356:4;45345:16;;45328:38;45373:179;;45481:66;45541:5;45481:66;;45704:145;45785:6;45780:3;45775;45762:30;-1:-1;45841:1;45823:16;;45816:27;45755:94;45858:268;45923:1;45930:101;45944:6;45941:1;45938:13;45930:101;;;46011:11;;;46005:18;45992:11;;;45985:39;45966:2;45959:10;45930:101;;;46046:6;46043:1;46040:13;46037:2;;;-1:-1;;46111:1;46093:16;;46086:27;45907:219;46134:95;;46198:26;46218:5;46236:89;46300:20;46314:5;46300:20;;46413:97;46501:2;46481:14;-1:-1;;46477:28;;46461:49;46518:94;46592:2;46588:14;;46560:52;46620:117;46689:24;46707:5;46689:24;;;46682:5;46679:35;46669:2;;46728:1;46725;46718:12;46884:111;46950:21;46965:5;46950:21;;47002:117;47071:24;47089:5;47071:24;;47126:115;47194:23;47211:5;47194:23;;47372:113;47439:22;47455:5;47439:22;
Swarm Source
bzzr://cbdb29bb11bc4baf42a2f6229355125f1baa73cc291341c017423c96123797b5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.