Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- CharityNFT
- Optimization enabled
- true
- Compiler version
- v0.8.12+commit.f00d7308
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2024-09-26T15:25:09.625516Z
Contract source code
// SPDX-License-Identifier: GPL pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } } abstract contract Ownable is Context { address internal _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. constructor() { _transferOwnership(_msgSender()); } */ /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract MinterRole is Ownable { mapping (address => bool) public minter_role; function setMinterRole(address _who, bool _status) public onlyOwner { minter_role[_who] = _status; } modifier onlyMinter { require(minter_role[msg.sender], "Minter role required"); _; } } library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * > It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } interface ICallistoNFT { event NewBid (uint256 indexed tokenID, uint256 indexed bidAmount, bytes bidData); event TokenTrade (uint256 indexed tokenID, address indexed new_owner, address indexed previous_owner, uint256 priceInWEI); event Transfer (address indexed from, address indexed to, uint256 indexed tokenId); event TransferData (bytes data); struct Properties { // In this example properties of the given NFT are stored // in a dynamically sized array of strings // properties can be re-defined for any specific info // that a particular NFT is intended to store. /* Properties could look like this: bytes property1; bytes property2; address property3; */ string[] properties; } function name() external view returns (string memory); function symbol() external view returns (string memory); function standard() external view returns (string memory); function balanceOf(address _who) external view returns (uint256); function ownerOf(uint256 _tokenId) external view returns (address); function transfer(address _to, uint256 _tokenId, bytes calldata _data) external returns (bool); function silentTransfer(address _to, uint256 _tokenId) external returns (bool); function priceOf(uint256 _tokenId) external view returns (uint256); function bidOf(uint256 _tokenId) external view returns (uint256 price, address payable bidder, uint256 timestamp); function getTokenProperties(uint256 _tokenId) external view returns (Properties memory); function setBid(uint256 _tokenId, bytes calldata _data) payable external; // bid amount is defined by msg.value function setPrice(uint256 _tokenId, uint256 _amountInWEI, bytes calldata _data) external; function withdrawBid(uint256 _tokenId) external returns (bool); function getUserContent(uint256 _tokenId) external view returns (string memory _content); function setUserContent(uint256 _tokenId, string calldata _content) external returns (bool); } abstract contract NFTReceiver { function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external virtual returns(bytes4); } // ExtendedNFT is a version of the CallistoNFT standard token // that implements a set of function for NFT content management contract ExtendedNFT is ICallistoNFT, ReentrancyGuard { using Address for address; mapping (uint256 => Properties) private _tokenProperties; uint256 public bidLock = 1 days; // Time required for a bid to become withdrawable. struct Bid { address payable bidder; uint256 amountInWEI; uint256 timestamp; } mapping (uint256 => uint256) private _asks; // tokenID => price of this token (in WEI) mapping (uint256 => Bid) private _bids; // tokenID => price of this token (in WEI) uint256 public next_mint_id; // Token name string internal _name; // Token symbol string internal _symbol; // Mapping from token ID to owner address mapping(uint256 => address) internal _owners; // Mapping owner address to token count mapping(address => uint256) internal _balances; // Reward is always paid based on BID modifier checkTrade(uint256 _tokenId, bytes calldata _data) { _; (uint256 _bid, address payable _bidder,) = bidOf(_tokenId); if(priceOf(_tokenId) > 0 && priceOf(_tokenId) <= _bid) { emit TokenTrade(_tokenId, _bidder, ownerOf(_tokenId), _bid); payable(ownerOf(_tokenId)).transfer(_bid); //bytes calldata _empty; delete _bids[_tokenId]; delete _asks[_tokenId]; _transfer(ownerOf(_tokenId), _bidder, _tokenId, _data); } } function standard() public view virtual override returns (string memory) { return "CallistoNFT"; } function mint() internal returns (uint256 _mintedId) { _safeMint(msg.sender, next_mint_id); _mintedId = next_mint_id; next_mint_id++; _configureNFT(_mintedId); } function priceOf(uint256 _tokenId) public view virtual override returns (uint256) { address owner = _owners[_tokenId]; require(owner != address(0), "NFT: owner query for nonexistent token"); return _asks[_tokenId]; } function bidOf(uint256 _tokenId) public view virtual override returns (uint256 price, address payable bidder, uint256 timestamp) { address owner = _owners[_tokenId]; require(owner != address(0), "NFT: owner query for nonexistent token"); return (_bids[_tokenId].amountInWEI, _bids[_tokenId].bidder, _bids[_tokenId].timestamp); } function getTokenProperties(uint256 _tokenId) public view virtual override returns (Properties memory) { return _tokenProperties[_tokenId]; } function getTokenProperty(uint256 _tokenId, uint256 _propertyId) public view virtual returns (string memory) { return _tokenProperties[_tokenId].properties[_propertyId]; } function getUserContent(uint256 _tokenId) public view virtual override returns (string memory _content) { return (_tokenProperties[_tokenId].properties[0]); } function setUserContent(uint256 _tokenId, string calldata _content) public virtual override returns (bool success) { require(msg.sender == ownerOf(_tokenId), "NFT: only owner can change NFT content"); _tokenProperties[_tokenId].properties[0] = _content; return true; } function _addPropertyWithContent(uint256 _tokenId, string calldata _content) internal { // Check permission criteria _tokenProperties[_tokenId].properties.push(_content); } function _modifyProperty(uint256 _tokenId, uint256 _propertyId, string calldata _content) internal { _tokenProperties[_tokenId].properties[_propertyId] = _content; } function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "NFT: balance query for the zero address"); return _balances[owner]; } function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "NFT: owner query for nonexistent token"); return owner; } /* Price == 0, "NFT not on sale" Price > 0, "NFT on sale" */ function setPrice(uint256 _tokenId, uint256 _amountInWEI, bytes calldata _data) checkTrade(_tokenId, _data) public virtual override nonReentrant { require(ownerOf(_tokenId) == msg.sender, "Setting asks is only allowed for owned NFTs!"); _asks[_tokenId] = _amountInWEI; } function setBid(uint256 _tokenId, bytes calldata _data) payable checkTrade(_tokenId, _data) public virtual override nonReentrant { (uint256 _previousBid, address payable _previousBidder, ) = bidOf(_tokenId); require(msg.value > _previousBid, "New bid must exceed the existing one"); uint256 _bid; // Return previous bid if the current one exceeds it. if(_previousBid != 0) { _previousBidder.transfer(_previousBid); } // Refund overpaid amount. if (priceOf(_tokenId) < msg.value) { _bid = priceOf(_tokenId); } else { _bid = msg.value; } _bids[_tokenId].amountInWEI = _bid; _bids[_tokenId].bidder = payable(msg.sender); _bids[_tokenId].timestamp = block.timestamp; emit NewBid(_tokenId, _bid, _data); // Send back overpaid amount. // WARNING: Creates possibility for reentrancy. if (priceOf(_tokenId) < msg.value) { payable(msg.sender).transfer(msg.value - priceOf(_tokenId)); } } function withdrawBid(uint256 _tokenId) public virtual override nonReentrant returns (bool) { (uint256 _bid, address payable _bidder, uint256 _timestamp) = bidOf(_tokenId); require(msg.sender == _bidder, "Can not withdraw someone elses bid"); require(block.timestamp > _timestamp + bidLock, "Bid is time-locked"); _bidder.transfer(_bid); delete _bids[_tokenId]; return true; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function transfer(address _to, uint256 _tokenId, bytes calldata _data) public override returns (bool) { _transfer(msg.sender, _to, _tokenId, _data); emit TransferData(_data); return true; } function silentTransfer(address _to, uint256 _tokenId) public override returns (bool) { require(ExtendedNFT.ownerOf(_tokenId) == msg.sender, "NFT: transfer of token that is not own"); require(_to != address(0), "NFT: transfer to the zero address"); _asks[_tokenId] = 0; // Zero out price on transfer // When a user transfers the NFT to another user // it does not automatically mean that the new owner // would like to sell this NFT at a price // specified by the previous owner. // However bids persist regardless of token transfers // because we assume that the bidder still wants to buy the NFT // no matter from whom. _beforeTokenTransfer(msg.sender, _to, _tokenId); _balances[msg.sender] -= 1; _balances[_to] += 1; _owners[_tokenId] = _to; emit Transfer(msg.sender, _to, _tokenId); return true; } function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } function _safeMint( address to, uint256 tokenId ) internal virtual { _mint(to, tokenId); } function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "NFT: mint to the zero address"); require(!_exists(tokenId), "NFT: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } function _burn(uint256 tokenId) internal virtual { address owner = ExtendedNFT.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } function _transfer( address from, address to, uint256 tokenId, bytes calldata data ) internal virtual { require(ExtendedNFT.ownerOf(tokenId) == from, "NFT: transfer of token that is not own"); require(to != address(0), "NFT: transfer to the zero address"); _asks[tokenId] = 0; // Zero out price on transfer // When a user transfers the NFT to another user // it does not automatically mean that the new owner // would like to sell this NFT at a price // specified by the previous owner. // However bids persist regardless of token transfers // because we assume that the bidder still wants to buy the NFT // no matter from whom. _beforeTokenTransfer(from, to, tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; if(to.isContract()) { NFTReceiver(to).onERC721Received(msg.sender, from, tokenId, data); } emit Transfer(from, to, tokenId); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} function _configureNFT(uint256 _tokenId) internal { if(_tokenProperties[_tokenId].properties.length == 0) { _tokenProperties[_tokenId].properties.push(""); } } } interface IClassifiedNFT is ICallistoNFT { function setClassForTokenID(uint256 _tokenID, uint256 _tokenClass) external; function addNewTokenClass(string memory _property) external; function addTokenClassProperties(uint256 _propertiesCount, uint256 classId) external; function modifyClassProperty(uint256 _classID, uint256 _propertyID, string memory _content) external; function getClassProperty(uint256 _classID, uint256 _propertyID) external view returns (string memory); function addClassProperty(uint256 _classID) external; function getClassProperties(uint256 _classID) external view returns (string[] memory); function getClassForTokenID(uint256 _tokenID) external view returns (uint256); function getClassPropertiesForTokenID(uint256 _tokenID) external view returns (string[] memory); function getClassPropertyForTokenID(uint256 _tokenID, uint256 _propertyID) external view returns (string memory); function mintWithClass(uint256 classId) external returns (uint256 _newTokenID); function appendClassProperty(uint256 _classID, uint256 _propertyID, string memory _content) external; } abstract contract ClassifiedNFT is MinterRole, ExtendedNFT, IClassifiedNFT { mapping (uint256 => string[]) public class_properties; mapping (uint256 => uint256) public token_classes; uint256 public nextClassIndex = 0; modifier onlyExistingClasses(uint256 classId) { require(classId < nextClassIndex, "Queried class does not exist"); _; } function setClassForTokenID(uint256 _tokenID, uint256 _tokenClass) public onlyOwner override { token_classes[_tokenID] = _tokenClass; } function addNewTokenClass(string memory _property) public onlyOwner override { class_properties[nextClassIndex].push(_property); nextClassIndex++; } function addTokenClassProperties(uint256 _propertiesCount, uint256 classId) public onlyOwner override { for (uint i = 0; i < _propertiesCount; i++) { class_properties[classId].push(""); } } function modifyClassProperty(uint256 _classID, uint256 _propertyID, string memory _content) public onlyOwner onlyExistingClasses(_classID) override { class_properties[_classID][_propertyID] = _content; } function getClassProperty(uint256 _classID, uint256 _propertyID) public view onlyExistingClasses(_classID) override returns (string memory) { return class_properties[_classID][_propertyID]; } function addClassProperty(uint256 _classID) public onlyOwner onlyExistingClasses(_classID) override { class_properties[_classID].push(""); } function addClassPropertyWithContent(uint256 _classID, string memory _content) public onlyOwner onlyExistingClasses(_classID) { class_properties[_classID].push(_content); } function getClassProperties(uint256 _classID) public view onlyExistingClasses(_classID) override returns (string[] memory) { return class_properties[_classID]; } function getClassForTokenID(uint256 _tokenID) public view onlyExistingClasses(token_classes[_tokenID]) override returns (uint256) { return token_classes[_tokenID]; } function getClassPropertiesForTokenID(uint256 _tokenID) public view onlyExistingClasses(token_classes[_tokenID]) override returns (string[] memory) { return class_properties[token_classes[_tokenID]]; } function getClassPropertyForTokenID(uint256 _tokenID, uint256 _propertyID) public view onlyExistingClasses(token_classes[_tokenID]) override returns (string memory) { return class_properties[token_classes[_tokenID]][_propertyID]; } function mintWithClass(uint256 classId) public onlyExistingClasses(classId) onlyMinter override returns (uint256 _newTokenID) { //_mint(to, tokenId); _newTokenID = mint(); token_classes[_newTokenID] = classId; } function appendClassProperty(uint256 _classID, uint256 _propertyID, string memory _content) public onlyOwner onlyExistingClasses(_classID) override{} } contract CharityNFT is ExtendedNFT, ClassifiedNFT { function initialize(string memory name_, string memory symbol_) external { require(_owner == address(0), "Already initialized"); _owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); bidLock = 1 days; _name = name_; _symbol = symbol_; } function addPropertyWithContent(uint256 _tokenId, string calldata _content) public onlyMinter { _addPropertyWithContent( _tokenId, _content); } } contract ActivatedByOwner is Ownable { bool public active = true; function setActive(bool _active) public onlyOwner { active = _active; } modifier onlyActive { require(active, "This contract is deactivated by owner"); _; } } contract NFTMulticlassPermissiveAuction is ActivatedByOwner { event AuctionCreated(uint256 indexed tokenClassAuctionID, uint256 timestamp); event TokenSold(uint256 indexed tokenID, uint256 indexed tokenClassID, address indexed buyer); event NFTContractSet(address indexed newNFTContract, address indexed oldNFTContract); event RevenueWithdrawal(uint256 amount); address public nft_contract; struct NFTAuctionClass { uint256 amount_sold; uint256 start_timestamp; uint256 priceInWei; } mapping (uint256 => NFTAuctionClass) public auctions; // Mapping from classID (at NFT contract) to set of variables // defining the auction for this token class. address payable public revenue = payable(0x01000B5fE61411C466b70631d7fF070187179Bbf); // This address has the rights to withdraw funds from the auction. constructor() { _owner = msg.sender; } function createNFTAuction( uint256 _classID, uint256 _start_timestamp, uint256 _priceInWei ) public onlyOwner { auctions[_classID].amount_sold = 0; auctions[_classID].start_timestamp = _start_timestamp; auctions[_classID].priceInWei = _priceInWei; emit AuctionCreated(_classID, block.timestamp); } function setRevenueAddress(address payable _revenue_address) public onlyOwner { revenue = _revenue_address; } function setNFTContract(address _nftContract) public onlyOwner { emit NFTContractSet(_nftContract, nft_contract); nft_contract = _nftContract; } receive() external payable {} function buyNFT(uint _classID) public payable onlyActive { require(msg.value >= auctions[_classID].priceInWei, "Insufficient funds"); uint256 _mintedId = ClassifiedNFT(nft_contract).mintWithClass(_classID); auctions[_classID].amount_sold++; configureNFT(_mintedId); ClassifiedNFT(nft_contract).transfer(msg.sender, _mintedId, ""); emit TokenSold(_mintedId, _classID, msg.sender); } function configureNFT(uint256 _tokenId) internal { CharityNFT(nft_contract).addPropertyWithContent(_tokenId, string(abi.encodePacked("Donated: ", toString(msg.value / 1e18), " CLO at ", toString(block.timestamp)))); } function withdrawRevenue() public { require(msg.sender == revenue, "This action requires revenue permission"); emit RevenueWithdrawal(address(this).balance); revenue.transfer(address(this).balance); } function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol#L15-L35 if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } }
Contract ABI
[{"type":"event","name":"NewBid","inputs":[{"type":"uint256","name":"tokenID","internalType":"uint256","indexed":true},{"type":"uint256","name":"bidAmount","internalType":"uint256","indexed":true},{"type":"bytes","name":"bidData","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"TokenTrade","inputs":[{"type":"uint256","name":"tokenID","internalType":"uint256","indexed":true},{"type":"address","name":"new_owner","internalType":"address","indexed":true},{"type":"address","name":"previous_owner","internalType":"address","indexed":true},{"type":"uint256","name":"priceInWEI","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"TransferData","inputs":[{"type":"bytes","name":"data","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addClassProperty","inputs":[{"type":"uint256","name":"_classID","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addClassPropertyWithContent","inputs":[{"type":"uint256","name":"_classID","internalType":"uint256"},{"type":"string","name":"_content","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addNewTokenClass","inputs":[{"type":"string","name":"_property","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addPropertyWithContent","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"},{"type":"string","name":"_content","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addTokenClassProperties","inputs":[{"type":"uint256","name":"_propertiesCount","internalType":"uint256"},{"type":"uint256","name":"classId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"appendClassProperty","inputs":[{"type":"uint256","name":"_classID","internalType":"uint256"},{"type":"uint256","name":"_propertyID","internalType":"uint256"},{"type":"string","name":"_content","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"bidLock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"price","internalType":"uint256"},{"type":"address","name":"bidder","internalType":"address payable"},{"type":"uint256","name":"timestamp","internalType":"uint256"}],"name":"bidOf","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"class_properties","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getClassForTokenID","inputs":[{"type":"uint256","name":"_tokenID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string[]","name":"","internalType":"string[]"}],"name":"getClassProperties","inputs":[{"type":"uint256","name":"_classID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string[]","name":"","internalType":"string[]"}],"name":"getClassPropertiesForTokenID","inputs":[{"type":"uint256","name":"_tokenID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getClassProperty","inputs":[{"type":"uint256","name":"_classID","internalType":"uint256"},{"type":"uint256","name":"_propertyID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getClassPropertyForTokenID","inputs":[{"type":"uint256","name":"_tokenID","internalType":"uint256"},{"type":"uint256","name":"_propertyID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct ICallistoNFT.Properties","components":[{"type":"string[]","name":"properties","internalType":"string[]"}]}],"name":"getTokenProperties","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getTokenProperty","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"},{"type":"uint256","name":"_propertyId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"_content","internalType":"string"}],"name":"getUserContent","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"string","name":"name_","internalType":"string"},{"type":"string","name":"symbol_","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"_newTokenID","internalType":"uint256"}],"name":"mintWithClass","inputs":[{"type":"uint256","name":"classId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"minter_role","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"modifyClassProperty","inputs":[{"type":"uint256","name":"_classID","internalType":"uint256"},{"type":"uint256","name":"_propertyID","internalType":"uint256"},{"type":"string","name":"_content","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nextClassIndex","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"next_mint_id","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ownerOf","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"priceOf","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"setBid","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setClassForTokenID","inputs":[{"type":"uint256","name":"_tokenID","internalType":"uint256"},{"type":"uint256","name":"_tokenClass","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinterRole","inputs":[{"type":"address","name":"_who","internalType":"address"},{"type":"bool","name":"_status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPrice","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"},{"type":"uint256","name":"_amountInWEI","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"setUserContent","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"},{"type":"string","name":"_content","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"silentTransfer","inputs":[{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"standard","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"token_classes","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_tokenId","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"withdrawBid","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"}]}]
Contract Creation Code
0x6080604052620151806004556000600e5534801561001c57600080fd5b506001600255612b8c806100316000396000f3fe60806040526004361061023b5760003560e01c8063649ccc141161012e5780639de4792e116100ab578063c98e0c3c1161006f578063c98e0c3c14610723578063cb177b1e14610743578063e29fb03614610763578063e647005914610779578063f2fde38b1461079957600080fd5b80639de4792e14610676578063b9186d7d14610696578063be45fd62146106b6578063be671058146106d6578063c1940f1b146106f657600080fd5b80637eebe86e116100f25780637eebe86e146105ed57806380483a6a1461060d5780638da5cb5b1461062d578063911006951461064b57806395d89b411461066157600080fd5b8063649ccc141461053757806369a137121461057a57806370a082311461059a57806373baa651146105ba5780637ab56e52146105cd57600080fd5b80633e0bb783116101bc5780634edea111116101805780634edea1111461044e578063510910bb1461047b578063543dc7fa146104ab5780635a3b7e42146104cb5780636352211e146104ff57600080fd5b80633e0bb783146103a15780634774d93f146103c15780634bb2ddd4146103e15780634c1720a41461040e5780634cd88b761461042e57600080fd5b8063290e008c11610203578063290e008c146103015780632a6d3f44146103215780633054d9cb146103415780633c65b3eb146103615780633d8073f11461038157600080fd5b806302ff368a1461024057806306fdde03146102765780630eaaf4c81461028b5780631d734c8f146102bb5780631f38e654146102df575b600080fd5b34801561024c57600080fd5b5061026061025b36600461239a565b6107b9565b60405161026d9190612400565b60405180910390f35b34801561028257600080fd5b50610260610873565b34801561029757600080fd5b506102ab6102a636600461239a565b610905565b604051901515815260200161026d565b3480156102c757600080fd5b506102d1600e5481565b60405190815260200161026d565b3480156102eb57600080fd5b506102ff6102fa36600461241a565b610a6b565b005b34801561030d57600080fd5b506102ff61031c366004612485565b610aa7565b34801561032d57600080fd5b506102ab61033c366004612485565b610b0d565b34801561034d57600080fd5b506102ff61035c366004612574565b610bca565b34801561036d57600080fd5b506102d161037c36600461239a565b610c5d565b34801561038d57600080fd5b506102ff61039c3660046125c4565b610cf8565b3480156103ad57600080fd5b506102606103bc36600461241a565b610ecc565b3480156103cd57600080fd5b506102ff6103dc366004612574565b610f85565b3480156103ed57600080fd5b506104016103fc36600461239a565b610fd7565b60405161026d9190612617565b34801561041a57600080fd5b5061026061042936600461241a565b6110f7565b34801561043a57600080fd5b506102ff610449366004612679565b6111d7565b34801561045a57600080fd5b5061046e61046936600461239a565b611293565b60405161026d91906126dd565b34801561048757600080fd5b506102ab610496366004612758565b60016020526000908152604090205460ff1681565b3480156104b757600080fd5b506102d16104c636600461239a565b611388565b3480156104d757600080fd5b5060408051808201909152600b81526a10d85b1b1a5cdd1bd3919560aa1b6020820152610260565b34801561050b57600080fd5b5061051f61051a36600461239a565b6113cc565b6040516001600160a01b03909116815260200161026d565b34801561054357600080fd5b5061055761055236600461239a565b611407565b604080519384526001600160a01b0390921660208401529082015260600161026d565b34801561058657600080fd5b506102ff610595366004612773565b61146f565b3480156105a657600080fd5b506102d16105b5366004612758565b6114ed565b6102ff6105c8366004612485565b611571565b3480156105d957600080fd5b506102606105e836600461241a565b611844565b3480156105f957600080fd5b506102ff6106083660046127b0565b611903565b34801561061957600080fd5b506102ff61062836600461239a565b61197b565b34801561063957600080fd5b506000546001600160a01b031661051f565b34801561065757600080fd5b506102d160045481565b34801561066d57600080fd5b506102606119ff565b34801561068257600080fd5b5061026061069136600461241a565b611a0e565b3480156106a257600080fd5b506102d16106b136600461239a565b611a6f565b3480156106c257600080fd5b506102ab6106d13660046127ed565b611ab8565b3480156106e257600080fd5b506102ff6106f136600461241a565b611b0b565b34801561070257600080fd5b506102d161071136600461239a565b600d6020526000908152604090205481565b34801561072f57600080fd5b506102ab61073e36600461282f565b611b8b565b34801561074f57600080fd5b506102ff61075e366004612859565b611ca3565b34801561076f57600080fd5b506102d160075481565b34801561078557600080fd5b5061040161079436600461239a565b611cf8565b3480156107a557600080fd5b506102ff6107b4366004612758565b611df1565b60008181526003602052604081208054606092906107d9576107d9612895565b9060005260206000200180546107ee906128ab565b80601f016020809104026020016040519081016040528092919081815260200182805461081a906128ab565b80156108675780601f1061083c57610100808354040283529160200191610867565b820191906000526020600020905b81548152906001019060200180831161084a57829003601f168201915b50505050509050919050565b606060088054610882906128ab565b80601f01602080910402602001604051908101604052809291908181526020018280546108ae906128ab565b80156108fb5780601f106108d0576101008083540402835291602001916108fb565b820191906000526020600020905b8154815290600101906020018083116108de57829003601f168201915b5050505050905090565b60006002805414156109325760405162461bcd60e51b8152600401610929906128e0565b60405180910390fd5b600280556000808061094385611407565b91945092509050336001600160a01b038316146109ad5760405162461bcd60e51b815260206004820152602260248201527f43616e206e6f7420776974686472617720736f6d656f6e6520656c73657320626044820152611a5960f21b6064820152608401610929565b6004546109ba908261292d565b42116109fd5760405162461bcd60e51b8152602060048201526012602482015271109a59081a5cc81d1a5b594b5b1bd8dad95960721b6044820152606401610929565b6040516001600160a01b0383169084156108fc029085906000818181858888f19350505050158015610a33573d6000803e3d6000fd5b5050506000928352505060066020526040812080546001600160a01b0319168155600180820183905560029182019290925581905590565b6000546001600160a01b03163314610a955760405162461bcd60e51b815260040161092990612945565b6000918252600d602052604090912055565b3360009081526001602052604090205460ff16610afd5760405162461bcd60e51b8152602060048201526014602482015273135a5b9d195c881c9bdb19481c995c5d5a5c995960621b6044820152606401610929565b610b08838383611e8c565b505050565b6000610b18846113cc565b6001600160a01b0316336001600160a01b031614610b875760405162461bcd60e51b815260206004820152602660248201527f4e46543a206f6e6c79206f776e65722063616e206368616e6765204e465420636044820152651bdb9d195b9d60d21b6064820152608401610929565b600084815260036020526040812080548592859291610ba857610ba8612895565b906000526020600020019190610bbf92919061228d565b506001949350505050565b6000546001600160a01b03163314610bf45760405162461bcd60e51b815260040161092990612945565b82600e548110610c165760405162461bcd60e51b81526004016109299061297a565b6000848152600c60205260409020805483919085908110610c3957610c39612895565b906000526020600020019080519060200190610c56929190612311565b5050505050565b600081600e548110610c815760405162461bcd60e51b81526004016109299061297a565b3360009081526001602052604090205460ff16610cd75760405162461bcd60e51b8152602060048201526014602482015273135a5b9d195c881c9bdb19481c995c5d5a5c995960621b6044820152606401610929565b610cdf611eb5565b6000818152600d60205260409020939093555090919050565b838282600280541415610d1d5760405162461bcd60e51b8152600401610929906128e0565b6002805533610d2b886113cc565b6001600160a01b031614610d965760405162461bcd60e51b815260206004820152602c60248201527f53657474696e672061736b73206973206f6e6c7920616c6c6f77656420666f7260448201526b206f776e6564204e4654732160a01b6064820152608401610929565b6000878152600560205260408120879055600160025580610db685611407565b50915091506000610dc686611a6f565b118015610ddb575081610dd886611a6f565b11155b15610ec157610de9856113cc565b6001600160a01b0316816001600160a01b0316867fc9b9afd9684b23c6b22a41016c08e8954ac118220c0a52f00b8774c46580e9a385604051610e2e91815260200190565b60405180910390a4610e3f856113cc565b6001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015610e77573d6000803e3d6000fd5b50600085815260066020908152604080832080546001600160a01b0319168155600181018490556002018390556005909152812055610ec1610eb8866113cc565b82878787611ee7565b505050505050505050565b600c6020528160005260406000208181548110610ee857600080fd5b90600052602060002001600091509150508054610f04906128ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610f30906128ab565b8015610f7d5780601f10610f5257610100808354040283529160200191610f7d565b820191906000526020600020905b815481529060010190602001808311610f6057829003601f168201915b505050505081565b6000546001600160a01b03163314610faf5760405162461bcd60e51b815260040161092990612945565b82600e548110610fd15760405162461bcd60e51b81526004016109299061297a565b50505050565b6000818152600d6020526040902054600e5460609190811061100b5760405162461bcd60e51b81526004016109299061297a565b6000838152600d60209081526040808320548352600c825280832080548251818502810185019093528083529193909284015b828210156110ea57838290600052602060002001805461105d906128ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611089906128ab565b80156110d65780601f106110ab576101008083540402835291602001916110d6565b820191906000526020600020905b8154815290600101906020018083116110b957829003601f168201915b50505050508152602001906001019061103e565b5050505091505b50919050565b606082600e54811061111b5760405162461bcd60e51b81526004016109299061297a565b6000848152600c6020526040902080548490811061113b5761113b612895565b906000526020600020018054611150906128ab565b80601f016020809104026020016040519081016040528092919081815260200182805461117c906128ab565b80156111c95780601f1061119e576101008083540402835291602001916111c9565b820191906000526020600020905b8154815290600101906020018083116111ac57829003601f168201915b505050505091505092915050565b6000546001600160a01b0316156112265760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610929565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a362015180600455815161127f906008906020850190612311565b508051610b08906009906020840190612311565b604080516020808201835260608252600084815260038252838120845181548085028201870187529381018481529495909491938593859285015b8282101561137a5783829060005260206000200180546112ed906128ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611319906128ab565b80156113665780601f1061133b57610100808354040283529160200191611366565b820191906000526020600020905b81548152906001019060200180831161134957829003601f168201915b5050505050815260200190600101906112ce565b505050915250909392505050565b6000818152600d6020526040812054600e5481106113b85760405162461bcd60e51b81526004016109299061297a565b50506000908152600d602052604090205490565b6000818152600a60205260408120546001600160a01b0316806114015760405162461bcd60e51b8152600401610929906129b1565b92915050565b6000818152600a6020526040812054819081906001600160a01b0316806114405760405162461bcd60e51b8152600401610929906129b1565b5050506000918252506006602052604090206001810154815460029092015490926001600160a01b0390921691565b6000546001600160a01b031633146114995760405162461bcd60e51b815260040161092990612945565b81600e5481106114bb5760405162461bcd60e51b81526004016109299061297a565b6000838152600c6020908152604082208054600181018255908352918190208451610fd1939190910191850190612311565b60006001600160a01b0382166115555760405162461bcd60e51b815260206004820152602760248201527f4e46543a2062616c616e636520717565727920666f7220746865207a65726f206044820152666164647265737360c81b6064820152608401610929565b506001600160a01b03166000908152600b602052604090205490565b8282826002805414156115965760405162461bcd60e51b8152600401610929906128e0565b600280556000806115a688611407565b50915091508134116116065760405162461bcd60e51b8152602060048201526024808201527f4e657720626964206d7573742065786365656420746865206578697374696e67604482015263206f6e6560e01b6064820152608401610929565b60008215611646576040516001600160a01b0383169084156108fc029085906000818181858888f19350505050158015611644573d6000803e3d6000fd5b505b346116508a611a6f565b10156116665761165f89611a6f565b9050611669565b50345b600089815260066020526040908190206001810183905580546001600160a01b03191633178155426002909101555181908a907f223d0d5db4846341da7a5cc902b1a7c597e63b6c73b1c6267dc931d290c7affb906116cb908c908c90612a20565b60405180910390a3346116dd8a611a6f565b101561172457336108fc6116f08b611a6f565b6116fa9034612a34565b6040518115909202916000818181858888f19350505050158015611722573d6000803e3d6000fd5b505b505060016002555060008061173885611407565b5091509150600061174886611a6f565b11801561175d57508161175a86611a6f565b11155b1561183a5761176b856113cc565b6001600160a01b0316816001600160a01b0316867fc9b9afd9684b23c6b22a41016c08e8954ac118220c0a52f00b8774c46580e9a3856040516117b091815260200190565b60405180910390a46117c1856113cc565b6001600160a01b03166108fc839081150290604051600060405180830381858888f193505050501580156117f9573d6000803e3d6000fd5b50600085815260066020908152604080832080546001600160a01b031916815560018101849055600201839055600590915281205561183a610eb8866113cc565b5050505050505050565b60008281526003602052604090208054606091908390811061186857611868612895565b90600052602060002001805461187d906128ab565b80601f01602080910402602001604051908101604052809291908181526020018280546118a9906128ab565b80156118f65780601f106118cb576101008083540402835291602001916118f6565b820191906000526020600020905b8154815290600101906020018083116118d957829003601f168201915b5050505050905092915050565b6000546001600160a01b0316331461192d5760405162461bcd60e51b815260040161092990612945565b600e546000908152600c6020908152604082208054600181018255908352918190208351611962939190910191840190612311565b50600e805490600061197383612a4b565b919050555050565b6000546001600160a01b031633146119a55760405162461bcd60e51b815260040161092990612945565b80600e5481106119c75760405162461bcd60e51b81526004016109299061297a565b6000828152600c60209081526040808320805460018101825590845282842082519384019283905292849052610b0893920191612311565b606060098054610882906128ab565b6000828152600d6020526040902054600e54606091908110611a425760405162461bcd60e51b81526004016109299061297a565b6000848152600d60209081526040808320548352600c909152902080548490811061113b5761113b612895565b6000818152600a60205260408120546001600160a01b031680611aa45760405162461bcd60e51b8152600401610929906129b1565b505060009081526005602052604090205490565b6000611ac73386868686611ee7565b7f3ba9136826ac751de05d770d8d34fa4440ada49a5fb0e9aa1678aece66dad9768383604051611af8929190612a20565b60405180910390a1506001949350505050565b6000546001600160a01b03163314611b355760405162461bcd60e51b815260040161092990612945565b60005b82811015610b08576000828152600c60209081526040808320805460018101825590845282842082519384019283905292849052611b7893920191612311565b5080611b8381612a4b565b915050611b38565b600033611b97836113cc565b6001600160a01b031614611bbd5760405162461bcd60e51b815260040161092990612a66565b6001600160a01b038316611be35760405162461bcd60e51b815260040161092990612aac565b600082815260056020526040812055336000908152600b60205260408120805460019290611c12908490612a34565b90915550506001600160a01b0383166000908152600b60205260408120805460019290611c4090849061292d565b90915550506000828152600a602052604080822080546001600160a01b0319166001600160a01b0387169081179091559051849233917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a450600192915050565b6000546001600160a01b03163314611ccd5760405162461bcd60e51b815260040161092990612945565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b606081600e548110611d1c5760405162461bcd60e51b81526004016109299061297a565b6000838152600c6020908152604080832080548251818502810185019093528083529193909284015b828210156110ea578382906000526020600020018054611d64906128ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611d90906128ab565b8015611ddd5780601f10611db257610100808354040283529160200191611ddd565b820191906000526020600020905b815481529060010190602001808311611dc057829003601f168201915b505050505081526020019060010190611d45565b6000546001600160a01b03163314611e1b5760405162461bcd60e51b815260040161092990612945565b6001600160a01b038116611e805760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610929565b611e89816120a2565b50565b6000838152600360209081526040822080546001810182559083529120610fd19101838361228d565b6000611ec3336007546120f2565b50600780549081906000611ed683612a4b565b9190505550611ee481612100565b90565b846001600160a01b0316611efa846113cc565b6001600160a01b031614611f205760405162461bcd60e51b815260040161092990612a66565b6001600160a01b038416611f465760405162461bcd60e51b815260040161092990612aac565b6000838152600560205260408120556001600160a01b0385166000908152600b60205260408120805460019290611f7e908490612a34565b90915550506001600160a01b0384166000908152600b60205260408120805460019290611fac90849061292d565b90915550506000838152600a6020526040902080546001600160a01b0319166001600160a01b0386169081179091553b1561205a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120159033908990889088908890600401612aed565b6020604051808303816000875af1158015612034573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120589190612b2c565b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6120fc828261214b565b5050565b600081815260036020526040902054611e895760008181526003602090815260408083208054600181018255908452828420825193840192839052928490526120fc93920191612311565b6001600160a01b0382166121a15760405162461bcd60e51b815260206004820152601d60248201527f4e46543a206d696e7420746f20746865207a65726f20616464726573730000006044820152606401610929565b6000818152600a60205260409020546001600160a01b0316156122065760405162461bcd60e51b815260206004820152601960248201527f4e46543a20746f6b656e20616c7265616479206d696e746564000000000000006044820152606401610929565b6001600160a01b0382166000908152600b6020526040812080546001929061222f90849061292d565b90915550506000818152600a602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612299906128ab565b90600052602060002090601f0160209004810192826122bb5760008555612301565b82601f106122d45782800160ff19823516178555612301565b82800160010185558215612301579182015b828111156123015782358255916020019190600101906122e6565b5061230d929150612385565b5090565b82805461231d906128ab565b90600052602060002090601f01602090048101928261233f5760008555612301565b82601f1061235857805160ff1916838001178555612301565b82800160010185558215612301579182015b8281111561230157825182559160200191906001019061236a565b5b8082111561230d5760008155600101612386565b6000602082840312156123ac57600080fd5b5035919050565b6000815180845260005b818110156123d9576020818501810151868301820152016123bd565b818111156123eb576000602083870101525b50601f01601f19169290920160200192915050565b60208152600061241360208301846123b3565b9392505050565b6000806040838503121561242d57600080fd5b50508035926020909101359150565b60008083601f84011261244e57600080fd5b50813567ffffffffffffffff81111561246657600080fd5b60208301915083602082850101111561247e57600080fd5b9250929050565b60008060006040848603121561249a57600080fd5b83359250602084013567ffffffffffffffff8111156124b857600080fd5b6124c48682870161243c565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126124f857600080fd5b813567ffffffffffffffff80821115612513576125136124d1565b604051601f8301601f19908116603f0116810190828211818310171561253b5761253b6124d1565b8160405283815286602085880101111561255457600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561258957600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156125ae57600080fd5b6125ba868287016124e7565b9150509250925092565b600080600080606085870312156125da57600080fd5b8435935060208501359250604085013567ffffffffffffffff8111156125ff57600080fd5b61260b8782880161243c565b95989497509550505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561266c57603f1988860301845261265a8583516123b3565b9450928501929085019060010161263e565b5092979650505050505050565b6000806040838503121561268c57600080fd5b823567ffffffffffffffff808211156126a457600080fd5b6126b0868387016124e7565b935060208501359150808211156126c657600080fd5b506126d3858286016124e7565b9150509250929050565b60006020808352604083018451828386015281815180845260608701915060608160051b8801019350848301925060005b8181101561266c57605f1988860301835261272a8585516123b3565b9450928501929185019160010161270e565b80356001600160a01b038116811461275357600080fd5b919050565b60006020828403121561276a57600080fd5b6124138261273c565b6000806040838503121561278657600080fd5b82359150602083013567ffffffffffffffff8111156127a457600080fd5b6126d3858286016124e7565b6000602082840312156127c257600080fd5b813567ffffffffffffffff8111156127d957600080fd5b6127e5848285016124e7565b949350505050565b6000806000806060858703121561280357600080fd5b61280c8561273c565b935060208501359250604085013567ffffffffffffffff8111156125ff57600080fd5b6000806040838503121561284257600080fd5b61284b8361273c565b946020939093013593505050565b6000806040838503121561286c57600080fd5b6128758361273c565b91506020830135801515811461288a57600080fd5b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806128bf57607f821691505b602082108114156110f157634e487b7160e01b600052602260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561294057612940612917565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601c908201527f5175657269656420636c61737320646f6573206e6f7420657869737400000000604082015260600190565b60208082526026908201527f4e46543a206f776e657220717565727920666f72206e6f6e6578697374656e74604082015265103a37b5b2b760d11b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260006127e56020830184866129f7565b600082821015612a4657612a46612917565b500390565b6000600019821415612a5f57612a5f612917565b5060010190565b60208082526026908201527f4e46543a207472616e73666572206f6620746f6b656e2074686174206973206e60408201526537ba1037bbb760d11b606082015260800190565b60208082526021908201527f4e46543a207472616e7366657220746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6001600160a01b0386811682528516602082015260408101849052608060608201819052600090612b2190830184866129f7565b979650505050505050565b600060208284031215612b3e57600080fd5b81516001600160e01b03198116811461241357600080fdfea2646970667358221220736a4355de74a49db4a7ba36b6e8df78bd0b9697b3d09b181ff97c450e7db75664736f6c634300080c0033
Deployed ByteCode
0x60806040526004361061023b5760003560e01c8063649ccc141161012e5780639de4792e116100ab578063c98e0c3c1161006f578063c98e0c3c14610723578063cb177b1e14610743578063e29fb03614610763578063e647005914610779578063f2fde38b1461079957600080fd5b80639de4792e14610676578063b9186d7d14610696578063be45fd62146106b6578063be671058146106d6578063c1940f1b146106f657600080fd5b80637eebe86e116100f25780637eebe86e146105ed57806380483a6a1461060d5780638da5cb5b1461062d578063911006951461064b57806395d89b411461066157600080fd5b8063649ccc141461053757806369a137121461057a57806370a082311461059a57806373baa651146105ba5780637ab56e52146105cd57600080fd5b80633e0bb783116101bc5780634edea111116101805780634edea1111461044e578063510910bb1461047b578063543dc7fa146104ab5780635a3b7e42146104cb5780636352211e146104ff57600080fd5b80633e0bb783146103a15780634774d93f146103c15780634bb2ddd4146103e15780634c1720a41461040e5780634cd88b761461042e57600080fd5b8063290e008c11610203578063290e008c146103015780632a6d3f44146103215780633054d9cb146103415780633c65b3eb146103615780633d8073f11461038157600080fd5b806302ff368a1461024057806306fdde03146102765780630eaaf4c81461028b5780631d734c8f146102bb5780631f38e654146102df575b600080fd5b34801561024c57600080fd5b5061026061025b36600461239a565b6107b9565b60405161026d9190612400565b60405180910390f35b34801561028257600080fd5b50610260610873565b34801561029757600080fd5b506102ab6102a636600461239a565b610905565b604051901515815260200161026d565b3480156102c757600080fd5b506102d1600e5481565b60405190815260200161026d565b3480156102eb57600080fd5b506102ff6102fa36600461241a565b610a6b565b005b34801561030d57600080fd5b506102ff61031c366004612485565b610aa7565b34801561032d57600080fd5b506102ab61033c366004612485565b610b0d565b34801561034d57600080fd5b506102ff61035c366004612574565b610bca565b34801561036d57600080fd5b506102d161037c36600461239a565b610c5d565b34801561038d57600080fd5b506102ff61039c3660046125c4565b610cf8565b3480156103ad57600080fd5b506102606103bc36600461241a565b610ecc565b3480156103cd57600080fd5b506102ff6103dc366004612574565b610f85565b3480156103ed57600080fd5b506104016103fc36600461239a565b610fd7565b60405161026d9190612617565b34801561041a57600080fd5b5061026061042936600461241a565b6110f7565b34801561043a57600080fd5b506102ff610449366004612679565b6111d7565b34801561045a57600080fd5b5061046e61046936600461239a565b611293565b60405161026d91906126dd565b34801561048757600080fd5b506102ab610496366004612758565b60016020526000908152604090205460ff1681565b3480156104b757600080fd5b506102d16104c636600461239a565b611388565b3480156104d757600080fd5b5060408051808201909152600b81526a10d85b1b1a5cdd1bd3919560aa1b6020820152610260565b34801561050b57600080fd5b5061051f61051a36600461239a565b6113cc565b6040516001600160a01b03909116815260200161026d565b34801561054357600080fd5b5061055761055236600461239a565b611407565b604080519384526001600160a01b0390921660208401529082015260600161026d565b34801561058657600080fd5b506102ff610595366004612773565b61146f565b3480156105a657600080fd5b506102d16105b5366004612758565b6114ed565b6102ff6105c8366004612485565b611571565b3480156105d957600080fd5b506102606105e836600461241a565b611844565b3480156105f957600080fd5b506102ff6106083660046127b0565b611903565b34801561061957600080fd5b506102ff61062836600461239a565b61197b565b34801561063957600080fd5b506000546001600160a01b031661051f565b34801561065757600080fd5b506102d160045481565b34801561066d57600080fd5b506102606119ff565b34801561068257600080fd5b5061026061069136600461241a565b611a0e565b3480156106a257600080fd5b506102d16106b136600461239a565b611a6f565b3480156106c257600080fd5b506102ab6106d13660046127ed565b611ab8565b3480156106e257600080fd5b506102ff6106f136600461241a565b611b0b565b34801561070257600080fd5b506102d161071136600461239a565b600d6020526000908152604090205481565b34801561072f57600080fd5b506102ab61073e36600461282f565b611b8b565b34801561074f57600080fd5b506102ff61075e366004612859565b611ca3565b34801561076f57600080fd5b506102d160075481565b34801561078557600080fd5b5061040161079436600461239a565b611cf8565b3480156107a557600080fd5b506102ff6107b4366004612758565b611df1565b60008181526003602052604081208054606092906107d9576107d9612895565b9060005260206000200180546107ee906128ab565b80601f016020809104026020016040519081016040528092919081815260200182805461081a906128ab565b80156108675780601f1061083c57610100808354040283529160200191610867565b820191906000526020600020905b81548152906001019060200180831161084a57829003601f168201915b50505050509050919050565b606060088054610882906128ab565b80601f01602080910402602001604051908101604052809291908181526020018280546108ae906128ab565b80156108fb5780601f106108d0576101008083540402835291602001916108fb565b820191906000526020600020905b8154815290600101906020018083116108de57829003601f168201915b5050505050905090565b60006002805414156109325760405162461bcd60e51b8152600401610929906128e0565b60405180910390fd5b600280556000808061094385611407565b91945092509050336001600160a01b038316146109ad5760405162461bcd60e51b815260206004820152602260248201527f43616e206e6f7420776974686472617720736f6d656f6e6520656c73657320626044820152611a5960f21b6064820152608401610929565b6004546109ba908261292d565b42116109fd5760405162461bcd60e51b8152602060048201526012602482015271109a59081a5cc81d1a5b594b5b1bd8dad95960721b6044820152606401610929565b6040516001600160a01b0383169084156108fc029085906000818181858888f19350505050158015610a33573d6000803e3d6000fd5b5050506000928352505060066020526040812080546001600160a01b0319168155600180820183905560029182019290925581905590565b6000546001600160a01b03163314610a955760405162461bcd60e51b815260040161092990612945565b6000918252600d602052604090912055565b3360009081526001602052604090205460ff16610afd5760405162461bcd60e51b8152602060048201526014602482015273135a5b9d195c881c9bdb19481c995c5d5a5c995960621b6044820152606401610929565b610b08838383611e8c565b505050565b6000610b18846113cc565b6001600160a01b0316336001600160a01b031614610b875760405162461bcd60e51b815260206004820152602660248201527f4e46543a206f6e6c79206f776e65722063616e206368616e6765204e465420636044820152651bdb9d195b9d60d21b6064820152608401610929565b600084815260036020526040812080548592859291610ba857610ba8612895565b906000526020600020019190610bbf92919061228d565b506001949350505050565b6000546001600160a01b03163314610bf45760405162461bcd60e51b815260040161092990612945565b82600e548110610c165760405162461bcd60e51b81526004016109299061297a565b6000848152600c60205260409020805483919085908110610c3957610c39612895565b906000526020600020019080519060200190610c56929190612311565b5050505050565b600081600e548110610c815760405162461bcd60e51b81526004016109299061297a565b3360009081526001602052604090205460ff16610cd75760405162461bcd60e51b8152602060048201526014602482015273135a5b9d195c881c9bdb19481c995c5d5a5c995960621b6044820152606401610929565b610cdf611eb5565b6000818152600d60205260409020939093555090919050565b838282600280541415610d1d5760405162461bcd60e51b8152600401610929906128e0565b6002805533610d2b886113cc565b6001600160a01b031614610d965760405162461bcd60e51b815260206004820152602c60248201527f53657474696e672061736b73206973206f6e6c7920616c6c6f77656420666f7260448201526b206f776e6564204e4654732160a01b6064820152608401610929565b6000878152600560205260408120879055600160025580610db685611407565b50915091506000610dc686611a6f565b118015610ddb575081610dd886611a6f565b11155b15610ec157610de9856113cc565b6001600160a01b0316816001600160a01b0316867fc9b9afd9684b23c6b22a41016c08e8954ac118220c0a52f00b8774c46580e9a385604051610e2e91815260200190565b60405180910390a4610e3f856113cc565b6001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015610e77573d6000803e3d6000fd5b50600085815260066020908152604080832080546001600160a01b0319168155600181018490556002018390556005909152812055610ec1610eb8866113cc565b82878787611ee7565b505050505050505050565b600c6020528160005260406000208181548110610ee857600080fd5b90600052602060002001600091509150508054610f04906128ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610f30906128ab565b8015610f7d5780601f10610f5257610100808354040283529160200191610f7d565b820191906000526020600020905b815481529060010190602001808311610f6057829003601f168201915b505050505081565b6000546001600160a01b03163314610faf5760405162461bcd60e51b815260040161092990612945565b82600e548110610fd15760405162461bcd60e51b81526004016109299061297a565b50505050565b6000818152600d6020526040902054600e5460609190811061100b5760405162461bcd60e51b81526004016109299061297a565b6000838152600d60209081526040808320548352600c825280832080548251818502810185019093528083529193909284015b828210156110ea57838290600052602060002001805461105d906128ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611089906128ab565b80156110d65780601f106110ab576101008083540402835291602001916110d6565b820191906000526020600020905b8154815290600101906020018083116110b957829003601f168201915b50505050508152602001906001019061103e565b5050505091505b50919050565b606082600e54811061111b5760405162461bcd60e51b81526004016109299061297a565b6000848152600c6020526040902080548490811061113b5761113b612895565b906000526020600020018054611150906128ab565b80601f016020809104026020016040519081016040528092919081815260200182805461117c906128ab565b80156111c95780601f1061119e576101008083540402835291602001916111c9565b820191906000526020600020905b8154815290600101906020018083116111ac57829003601f168201915b505050505091505092915050565b6000546001600160a01b0316156112265760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610929565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a362015180600455815161127f906008906020850190612311565b508051610b08906009906020840190612311565b604080516020808201835260608252600084815260038252838120845181548085028201870187529381018481529495909491938593859285015b8282101561137a5783829060005260206000200180546112ed906128ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611319906128ab565b80156113665780601f1061133b57610100808354040283529160200191611366565b820191906000526020600020905b81548152906001019060200180831161134957829003601f168201915b5050505050815260200190600101906112ce565b505050915250909392505050565b6000818152600d6020526040812054600e5481106113b85760405162461bcd60e51b81526004016109299061297a565b50506000908152600d602052604090205490565b6000818152600a60205260408120546001600160a01b0316806114015760405162461bcd60e51b8152600401610929906129b1565b92915050565b6000818152600a6020526040812054819081906001600160a01b0316806114405760405162461bcd60e51b8152600401610929906129b1565b5050506000918252506006602052604090206001810154815460029092015490926001600160a01b0390921691565b6000546001600160a01b031633146114995760405162461bcd60e51b815260040161092990612945565b81600e5481106114bb5760405162461bcd60e51b81526004016109299061297a565b6000838152600c6020908152604082208054600181018255908352918190208451610fd1939190910191850190612311565b60006001600160a01b0382166115555760405162461bcd60e51b815260206004820152602760248201527f4e46543a2062616c616e636520717565727920666f7220746865207a65726f206044820152666164647265737360c81b6064820152608401610929565b506001600160a01b03166000908152600b602052604090205490565b8282826002805414156115965760405162461bcd60e51b8152600401610929906128e0565b600280556000806115a688611407565b50915091508134116116065760405162461bcd60e51b8152602060048201526024808201527f4e657720626964206d7573742065786365656420746865206578697374696e67604482015263206f6e6560e01b6064820152608401610929565b60008215611646576040516001600160a01b0383169084156108fc029085906000818181858888f19350505050158015611644573d6000803e3d6000fd5b505b346116508a611a6f565b10156116665761165f89611a6f565b9050611669565b50345b600089815260066020526040908190206001810183905580546001600160a01b03191633178155426002909101555181908a907f223d0d5db4846341da7a5cc902b1a7c597e63b6c73b1c6267dc931d290c7affb906116cb908c908c90612a20565b60405180910390a3346116dd8a611a6f565b101561172457336108fc6116f08b611a6f565b6116fa9034612a34565b6040518115909202916000818181858888f19350505050158015611722573d6000803e3d6000fd5b505b505060016002555060008061173885611407565b5091509150600061174886611a6f565b11801561175d57508161175a86611a6f565b11155b1561183a5761176b856113cc565b6001600160a01b0316816001600160a01b0316867fc9b9afd9684b23c6b22a41016c08e8954ac118220c0a52f00b8774c46580e9a3856040516117b091815260200190565b60405180910390a46117c1856113cc565b6001600160a01b03166108fc839081150290604051600060405180830381858888f193505050501580156117f9573d6000803e3d6000fd5b50600085815260066020908152604080832080546001600160a01b031916815560018101849055600201839055600590915281205561183a610eb8866113cc565b5050505050505050565b60008281526003602052604090208054606091908390811061186857611868612895565b90600052602060002001805461187d906128ab565b80601f01602080910402602001604051908101604052809291908181526020018280546118a9906128ab565b80156118f65780601f106118cb576101008083540402835291602001916118f6565b820191906000526020600020905b8154815290600101906020018083116118d957829003601f168201915b5050505050905092915050565b6000546001600160a01b0316331461192d5760405162461bcd60e51b815260040161092990612945565b600e546000908152600c6020908152604082208054600181018255908352918190208351611962939190910191840190612311565b50600e805490600061197383612a4b565b919050555050565b6000546001600160a01b031633146119a55760405162461bcd60e51b815260040161092990612945565b80600e5481106119c75760405162461bcd60e51b81526004016109299061297a565b6000828152600c60209081526040808320805460018101825590845282842082519384019283905292849052610b0893920191612311565b606060098054610882906128ab565b6000828152600d6020526040902054600e54606091908110611a425760405162461bcd60e51b81526004016109299061297a565b6000848152600d60209081526040808320548352600c909152902080548490811061113b5761113b612895565b6000818152600a60205260408120546001600160a01b031680611aa45760405162461bcd60e51b8152600401610929906129b1565b505060009081526005602052604090205490565b6000611ac73386868686611ee7565b7f3ba9136826ac751de05d770d8d34fa4440ada49a5fb0e9aa1678aece66dad9768383604051611af8929190612a20565b60405180910390a1506001949350505050565b6000546001600160a01b03163314611b355760405162461bcd60e51b815260040161092990612945565b60005b82811015610b08576000828152600c60209081526040808320805460018101825590845282842082519384019283905292849052611b7893920191612311565b5080611b8381612a4b565b915050611b38565b600033611b97836113cc565b6001600160a01b031614611bbd5760405162461bcd60e51b815260040161092990612a66565b6001600160a01b038316611be35760405162461bcd60e51b815260040161092990612aac565b600082815260056020526040812055336000908152600b60205260408120805460019290611c12908490612a34565b90915550506001600160a01b0383166000908152600b60205260408120805460019290611c4090849061292d565b90915550506000828152600a602052604080822080546001600160a01b0319166001600160a01b0387169081179091559051849233917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a450600192915050565b6000546001600160a01b03163314611ccd5760405162461bcd60e51b815260040161092990612945565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b606081600e548110611d1c5760405162461bcd60e51b81526004016109299061297a565b6000838152600c6020908152604080832080548251818502810185019093528083529193909284015b828210156110ea578382906000526020600020018054611d64906128ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611d90906128ab565b8015611ddd5780601f10611db257610100808354040283529160200191611ddd565b820191906000526020600020905b815481529060010190602001808311611dc057829003601f168201915b505050505081526020019060010190611d45565b6000546001600160a01b03163314611e1b5760405162461bcd60e51b815260040161092990612945565b6001600160a01b038116611e805760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610929565b611e89816120a2565b50565b6000838152600360209081526040822080546001810182559083529120610fd19101838361228d565b6000611ec3336007546120f2565b50600780549081906000611ed683612a4b565b9190505550611ee481612100565b90565b846001600160a01b0316611efa846113cc565b6001600160a01b031614611f205760405162461bcd60e51b815260040161092990612a66565b6001600160a01b038416611f465760405162461bcd60e51b815260040161092990612aac565b6000838152600560205260408120556001600160a01b0385166000908152600b60205260408120805460019290611f7e908490612a34565b90915550506001600160a01b0384166000908152600b60205260408120805460019290611fac90849061292d565b90915550506000838152600a6020526040902080546001600160a01b0319166001600160a01b0386169081179091553b1561205a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120159033908990889088908890600401612aed565b6020604051808303816000875af1158015612034573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120589190612b2c565b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6120fc828261214b565b5050565b600081815260036020526040902054611e895760008181526003602090815260408083208054600181018255908452828420825193840192839052928490526120fc93920191612311565b6001600160a01b0382166121a15760405162461bcd60e51b815260206004820152601d60248201527f4e46543a206d696e7420746f20746865207a65726f20616464726573730000006044820152606401610929565b6000818152600a60205260409020546001600160a01b0316156122065760405162461bcd60e51b815260206004820152601960248201527f4e46543a20746f6b656e20616c7265616479206d696e746564000000000000006044820152606401610929565b6001600160a01b0382166000908152600b6020526040812080546001929061222f90849061292d565b90915550506000818152600a602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612299906128ab565b90600052602060002090601f0160209004810192826122bb5760008555612301565b82601f106122d45782800160ff19823516178555612301565b82800160010185558215612301579182015b828111156123015782358255916020019190600101906122e6565b5061230d929150612385565b5090565b82805461231d906128ab565b90600052602060002090601f01602090048101928261233f5760008555612301565b82601f1061235857805160ff1916838001178555612301565b82800160010185558215612301579182015b8281111561230157825182559160200191906001019061236a565b5b8082111561230d5760008155600101612386565b6000602082840312156123ac57600080fd5b5035919050565b6000815180845260005b818110156123d9576020818501810151868301820152016123bd565b818111156123eb576000602083870101525b50601f01601f19169290920160200192915050565b60208152600061241360208301846123b3565b9392505050565b6000806040838503121561242d57600080fd5b50508035926020909101359150565b60008083601f84011261244e57600080fd5b50813567ffffffffffffffff81111561246657600080fd5b60208301915083602082850101111561247e57600080fd5b9250929050565b60008060006040848603121561249a57600080fd5b83359250602084013567ffffffffffffffff8111156124b857600080fd5b6124c48682870161243c565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126124f857600080fd5b813567ffffffffffffffff80821115612513576125136124d1565b604051601f8301601f19908116603f0116810190828211818310171561253b5761253b6124d1565b8160405283815286602085880101111561255457600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561258957600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156125ae57600080fd5b6125ba868287016124e7565b9150509250925092565b600080600080606085870312156125da57600080fd5b8435935060208501359250604085013567ffffffffffffffff8111156125ff57600080fd5b61260b8782880161243c565b95989497509550505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561266c57603f1988860301845261265a8583516123b3565b9450928501929085019060010161263e565b5092979650505050505050565b6000806040838503121561268c57600080fd5b823567ffffffffffffffff808211156126a457600080fd5b6126b0868387016124e7565b935060208501359150808211156126c657600080fd5b506126d3858286016124e7565b9150509250929050565b60006020808352604083018451828386015281815180845260608701915060608160051b8801019350848301925060005b8181101561266c57605f1988860301835261272a8585516123b3565b9450928501929185019160010161270e565b80356001600160a01b038116811461275357600080fd5b919050565b60006020828403121561276a57600080fd5b6124138261273c565b6000806040838503121561278657600080fd5b82359150602083013567ffffffffffffffff8111156127a457600080fd5b6126d3858286016124e7565b6000602082840312156127c257600080fd5b813567ffffffffffffffff8111156127d957600080fd5b6127e5848285016124e7565b949350505050565b6000806000806060858703121561280357600080fd5b61280c8561273c565b935060208501359250604085013567ffffffffffffffff8111156125ff57600080fd5b6000806040838503121561284257600080fd5b61284b8361273c565b946020939093013593505050565b6000806040838503121561286c57600080fd5b6128758361273c565b91506020830135801515811461288a57600080fd5b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806128bf57607f821691505b602082108114156110f157634e487b7160e01b600052602260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561294057612940612917565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601c908201527f5175657269656420636c61737320646f6573206e6f7420657869737400000000604082015260600190565b60208082526026908201527f4e46543a206f776e657220717565727920666f72206e6f6e6578697374656e74604082015265103a37b5b2b760d11b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260006127e56020830184866129f7565b600082821015612a4657612a46612917565b500390565b6000600019821415612a5f57612a5f612917565b5060010190565b60208082526026908201527f4e46543a207472616e73666572206f6620746f6b656e2074686174206973206e60408201526537ba1037bbb760d11b606082015260800190565b60208082526021908201527f4e46543a207472616e7366657220746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6001600160a01b0386811682528516602082015260408101849052608060608201819052600090612b2190830184866129f7565b979650505050505050565b600060208284031215612b3e57600080fd5b81516001600160e01b03198116811461241357600080fdfea2646970667358221220736a4355de74a49db4a7ba36b6e8df78bd0b9697b3d09b181ff97c450e7db75664736f6c634300080c0033