Overview
TokenID
8
Transfers
-
7 ( 600.00%)
Market
Onchain Market Cap
-
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
Booty
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
contract Booty is ERC1155, Ownable {
uint256 public constant NUM_CRATES = 3;
uint256 public constant NUM_ARTIFACT = 15;
uint256 public constant RARITY_PRECISION = 10000; // Decimal precision of rarity table = 100 / RARITY_PRECISION
bool public saleEnabled = false;
bool public craftingEnabled = false;
uint256[] public artifactIDs;
struct Crate {
uint256 price;
uint256 numMinted;
uint256 maxSupply;
uint256 maxMint;
uint256 minToucan;
uint256[] rarity;
}
struct Ingredient {
uint256 artifactID;
uint256 quantity;
}
Crate[NUM_CRATES] public crates;
address immutable toucans;
mapping(address => mapping(uint256 => uint256)) public activated;
mapping(uint256 => Ingredient[]) public recipes;
modifier canBuy() {
require(saleEnabled, "Sale is disabled");
_;
}
modifier canCraft() {
require(craftingEnabled, "Crafting is disabled");
_;
}
event BuyCrate(address buyer, uint256[] tiers, uint256[] amounts);
event OpenCrate(address opener, uint256[] tiers, uint256[] amounts);
event ActivateArtifact(address activator, uint256[] ids, uint256[] amounts);
event CraftArtifact(address crafter, uint256[] ids, uint256[] amounts);
constructor(string memory _uri, address _toucans, uint256[NUM_CRATES] memory cratePrice, uint256[NUM_CRATES] memory initialMints, uint256[NUM_CRATES] memory maxSupply, uint256[NUM_CRATES] memory maxMint, uint256[NUM_CRATES] memory minToucan) ERC1155(_uri) {
toucans = _toucans;
for (uint tier = 0; tier < NUM_CRATES; tier++) {
crates[tier] = Crate(cratePrice[tier], initialMints[tier], maxSupply[tier], maxMint[tier], minToucan[tier], new uint256[](NUM_ARTIFACT));
_mint(msg.sender, tier, initialMints[tier], ""); // Future giveaways and promotions
}
for(uint i = 0; i < NUM_ARTIFACT; i++){
artifactIDs.push(i + NUM_CRATES);
}
}
function crateSupply() public view returns (uint256[NUM_CRATES] memory supplies){
for(uint i = 0; i < NUM_CRATES; i++)
supplies[i] = crates[i].maxSupply - crates[i].numMinted;
}
function buyCrate(uint256[] memory tiers, uint256[] memory amounts) public payable canBuy {
uint256 paymentOwed = 0;
require(tiers.length == amounts.length, "Tiers and amounts length must match");
for (uint i = 0; i < tiers.length; i++) {
require(amounts[i] <= crates[tiers[i]].maxMint, "Mint amount exceeds limit");
require(crates[tiers[i]].numMinted + amounts[i] <= crates[tiers[i]].maxSupply, "Mint amount would exceed max supply");
require(IToucans(toucans).balanceOf(msg.sender) >= crates[tiers[i]].minToucan, "Not enough toucans in wallet");
paymentOwed += amounts[i] * crates[tiers[i]].price;
crates[tiers[i]].numMinted += amounts[i];
}
require(msg.value == paymentOwed, "Invalid ETH payment sent");
_mintBatch(msg.sender, tiers, amounts, "");
emit BuyCrate(msg.sender, tiers, amounts);
}
function openCrate(uint256[] memory tiers, uint256[] memory amounts) public {
require(msg.sender == tx.origin, "Cannot open via smart contract");
require(tiers.length == amounts.length, "Tiers and amounts length must match");
_burnBatch(msg.sender, tiers, amounts);
for(uint i = 0; i < tiers.length; i++){
_mintBatch(msg.sender, artifactIDs, revealArtifacts(tiers[i], amounts[i]), "");
}
emit OpenCrate(msg.sender, tiers, amounts);
}
function activateArtifact(uint256[] memory ids, uint256[] memory amounts) public {
require(ids.length == amounts.length, "IDs and amounts length must match");
for(uint i = 0; i < ids.length; i++){
require(artifactIDs[0] <= ids[i], "Invalid artifact ID");
activated[msg.sender][ids[i]] += amounts[i];
}
_burnBatch(msg.sender, ids, amounts);
emit ActivateArtifact(msg.sender, ids, amounts);
}
function craftArtifact(uint256[] memory ids, uint256[] memory amounts) public canCraft {
require(ids.length == amounts.length, "Must be equal number of artifacts and amounts");
Ingredient[] memory recipe;
for(uint i = 0; i < ids.length; i++){
recipe = recipes[ids[i]];
require(recipe.length > 0, "Invalid crafting recipe");
for(uint j = 0; j < recipe.length; j++){
_burn(msg.sender, recipe[j].artifactID, recipe[j].quantity * amounts[i]);
}
_mint(msg.sender, ids[i], amounts[i], "");
}
emit CraftArtifact(msg.sender, ids, amounts);
}
function setSale(bool _saleEnabled) external onlyOwner {
require(!craftingEnabled, "Cannot start sale while activations are enabled");
saleEnabled = _saleEnabled;
}
function setCrafting(bool _craftingEnabled) external onlyOwner {
craftingEnabled = _craftingEnabled;
}
function setCrateRarity(uint256 tier, uint256[NUM_ARTIFACT] memory rarity) external onlyOwner {
crates[tier].rarity = rarity;
}
function setRecipe(uint256 result, uint256[] memory ids, uint256[] memory amounts) external onlyOwner {
require(ids.length == amounts.length, "Must be equal number of artifacts and amounts");
Ingredient[] storage recipe = recipes[result];
while(recipe.length > 0) recipe.pop();
for(uint i = 0; i < ids.length; i++){
recipe.push(Ingredient(ids[i], amounts[i]));
}
}
function retrieveFunds() external onlyOwner {
(bool sent, bytes memory data) = owner().call{value: address(this).balance}("");
require(sent, "Failed to send Ether");
}
function revealArtifacts(uint256 tier, uint256 amount) private view returns (uint256[] memory artifactAmounts) {
artifactAmounts = new uint256[](NUM_ARTIFACT);
uint256 seed;
for(uint i = 0; i < amount; i++){
seed = uint256(keccak256(
abi.encodePacked(msg.sender, tier, i, block.number, block.timestamp, blockhash(block.number))
)) % RARITY_PRECISION;
for(uint j = 0; j < crates[tier].rarity.length; j++){
if(seed <= crates[tier].rarity[j]){
artifactAmounts[j]++;
break;
}
}
}
}
function uri(uint256 _id) public view override returns (string memory) {
return string(abi.encodePacked(super.uri(_id), Strings.toString(_id)));
}
}
interface IToucans {
function balanceOf(address) external returns (uint256);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol)
pragma solidity ^0.8.0;
import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./extensions/IERC1155MetadataURI.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/introspection/ERC165.sol";
/**
* @dev Implementation of the basic standard multi-token.
* See https://eips.ethereum.org/EIPS/eip-1155
* Originally based on code by Enjin: https://github.com/enjin/erc-1155
*
* _Available since v3.1._
*/
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
using Address for address;
// Mapping from token ID to account balances
mapping(uint256 => mapping(address => uint256)) private _balances;
// Mapping from account to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
// Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
string private _uri;
/**
* @dev See {_setURI}.
*/
constructor(string memory uri_) {
_setURI(uri_);
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC1155).interfaceId ||
interfaceId == type(IERC1155MetadataURI).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC1155MetadataURI-uri}.
*
* This implementation returns the same URI for *all* token types. It relies
* on the token type ID substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* Clients calling this function must replace the `\{id\}` substring with the
* actual token type ID.
*/
function uri(uint256) public view virtual override returns (string memory) {
return _uri;
}
/**
* @dev See {IERC1155-balanceOf}.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
require(account != address(0), "ERC1155: address zero is not a valid owner");
return _balances[id][account];
}
/**
* @dev See {IERC1155-balanceOfBatch}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
public
view
virtual
override
returns (uint256[] memory)
{
require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");
uint256[] memory batchBalances = new uint256[](accounts.length);
for (uint256 i = 0; i < accounts.length; ++i) {
batchBalances[i] = balanceOf(accounts[i], ids[i]);
}
return batchBalances;
}
/**
* @dev See {IERC1155-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC1155-isApprovedForAll}.
*/
function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
return _operatorApprovals[account][operator];
}
/**
* @dev See {IERC1155-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) public virtual override {
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not token owner nor approved"
);
_safeTransferFrom(from, to, id, amount, data);
}
/**
* @dev See {IERC1155-safeBatchTransferFrom}.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) public virtual override {
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not token owner nor approved"
);
_safeBatchTransferFrom(from, to, ids, amounts, data);
}
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function _safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: transfer to the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, from, to, ids, amounts, data);
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
unchecked {
_balances[id][from] = fromBalance - amount;
}
_balances[id][to] += amount;
emit TransferSingle(operator, from, to, id, amount);
_afterTokenTransfer(operator, from, to, ids, amounts, data);
_doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function _safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
require(to != address(0), "ERC1155: transfer to the zero address");
address operator = _msgSender();
_beforeTokenTransfer(operator, from, to, ids, amounts, data);
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
unchecked {
_balances[id][from] = fromBalance - amount;
}
_balances[id][to] += amount;
}
emit TransferBatch(operator, from, to, ids, amounts);
_afterTokenTransfer(operator, from, to, ids, amounts, data);
_doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
}
/**
* @dev Sets a new URI for all token types, by relying on the token type ID
* substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* By this mechanism, any occurrence of the `\{id\}` substring in either the
* URI or any of the amounts in the JSON file at said URI will be replaced by
* clients with the token type ID.
*
* For example, the `https://token-cdn-domain/\{id\}.json` URI would be
* interpreted by clients as
* `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
* for token type ID 0x4cce0.
*
* See {uri}.
*
* Because these URIs cannot be meaningfully represented by the {URI} event,
* this function emits no events.
*/
function _setURI(string memory newuri) internal virtual {
_uri = newuri;
}
/**
* @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function _mint(
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
_balances[id][to] += amount;
emit TransferSingle(operator, address(0), to, id, amount);
_afterTokenTransfer(operator, address(0), to, ids, amounts, data);
_doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function _mintBatch(
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
for (uint256 i = 0; i < ids.length; i++) {
_balances[ids[i]][to] += amounts[i];
}
emit TransferBatch(operator, address(0), to, ids, amounts);
_afterTokenTransfer(operator, address(0), to, ids, amounts, data);
_doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
}
/**
* @dev Destroys `amount` tokens of token type `id` from `from`
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `from` must have at least `amount` tokens of token type `id`.
*/
function _burn(
address from,
uint256 id,
uint256 amount
) internal virtual {
require(from != address(0), "ERC1155: burn from the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
unchecked {
_balances[id][from] = fromBalance - amount;
}
emit TransferSingle(operator, from, address(0), id, amount);
_afterTokenTransfer(operator, from, address(0), ids, amounts, "");
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
*/
function _burnBatch(
address from,
uint256[] memory ids,
uint256[] memory amounts
) internal virtual {
require(from != address(0), "ERC1155: burn from the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");
for (uint256 i = 0; i < ids.length; i++) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
unchecked {
_balances[id][from] = fromBalance - amount;
}
}
emit TransferBatch(operator, from, address(0), ids, amounts);
_afterTokenTransfer(operator, from, address(0), ids, amounts, "");
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC1155: setting approval status for self");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning, as well as batched variants.
*
* The same hook is called on both single and batched variants. For single
* transfers, the length of the `ids` and `amounts` arrays will be 1.
*
* Calling conditions (for each `id` and `amount` pair):
*
* - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* of token type `id` will be transferred to `to`.
* - When `from` is zero, `amount` tokens of token type `id` will be minted
* for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
* will be burned.
* - `from` and `to` are never both zero.
* - `ids` and `amounts` have the same, non-zero length.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {}
/**
* @dev Hook that is called after any token transfer. This includes minting
* and burning, as well as batched variants.
*
* The same hook is called on both single and batched variants. For single
* transfers, the length of the `id` and `amount` arrays will be 1.
*
* Calling conditions (for each `id` and `amount` pair):
*
* - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* of token type `id` will be transferred to `to`.
* - When `from` is zero, `amount` tokens of token type `id` will be minted
* for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
* will be burned.
* - `from` and `to` are never both zero.
* - `ids` and `amounts` have the same, non-zero length.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {}
function _doSafeTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) private {
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
if (response != IERC1155Receiver.onERC1155Received.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non ERC1155Receiver implementer");
}
}
}
function _doSafeBatchTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) private {
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
bytes4 response
) {
if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non ERC1155Receiver implementer");
}
}
}
function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
uint256[] memory array = new uint256[](1);
array[0] = element;
return array;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
external
view
returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev _Available since v3.1._
*/
interface IERC1155Receiver is IERC165 {
/**
* @dev Handles the receipt of a single ERC1155 token type. This function is
* called at the end of a `safeTransferFrom` after the balance has been updated.
*
* NOTE: To accept the transfer, this must return
* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
* (i.e. 0xf23a6e61, or its own function selector).
*
* @param operator The address which initiated the transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param id The ID of the token being transferred
* @param value The amount of tokens being transferred
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
* @dev Handles the receipt of a multiple ERC1155 token types. This function
* is called at the end of a `safeBatchTransferFrom` after the balances have
* been updated.
*
* NOTE: To accept the transfer(s), this must return
* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
* (i.e. 0xbc197c81, or its own function selector).
*
* @param operator The address which initiated the batch transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param ids An array containing ids of each token being transferred (order and length must match values array)
* @param values An array containing amounts of each token being transferred (order and length must match ids array)
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)
pragma solidity ^0.8.0;
import "../IERC1155.sol";
/**
* @dev Interface of the optional ERC1155MetadataExtension interface, as defined
* in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
*
* _Available since v3.1._
*/
interface IERC1155MetadataURI is IERC1155 {
/**
* @dev Returns the URI for token type `id`.
*
* If the `\{id\}` substring is present in the URI, it must be replaced by
* clients with the actual token type ID.
*/
function uri(uint256 id) external view returns (string memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"address","name":"_toucans","type":"address"},{"internalType":"uint256[3]","name":"cratePrice","type":"uint256[3]"},{"internalType":"uint256[3]","name":"initialMints","type":"uint256[3]"},{"internalType":"uint256[3]","name":"maxSupply","type":"uint256[3]"},{"internalType":"uint256[3]","name":"maxMint","type":"uint256[3]"},{"internalType":"uint256[3]","name":"minToucan","type":"uint256[3]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"activator","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"ActivateArtifact","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tiers","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"BuyCrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"crafter","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"CraftArtifact","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"opener","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tiers","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"OpenCrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"NUM_ARTIFACT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUM_CRATES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RARITY_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"activateArtifact","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"activated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"artifactIDs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tiers","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"buyCrate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"craftArtifact","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"craftingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crateSupply","outputs":[{"internalType":"uint256[3]","name":"supplies","type":"uint256[3]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"crates","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"numMinted","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"maxMint","type":"uint256"},{"internalType":"uint256","name":"minToucan","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tiers","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"openCrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"recipes","outputs":[{"internalType":"uint256","name":"artifactID","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retrieveFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_craftingEnabled","type":"bool"}],"name":"setCrafting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"},{"internalType":"uint256[15]","name":"rarity","type":"uint256[15]"}],"name":"setCrateRarity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"result","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"setRecipe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_saleEnabled","type":"bool"}],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60a06040526000600360146101000a81548160ff0219169083151502179055506000600360156101000a81548160ff0219169083151502179055503480156200004757600080fd5b5060405162006cc138038062006cc183398181016040528101906200006d919062000ca0565b866200007f816200030860201b60201c565b50620000a0620000946200032460201b60201c565b6200032c60201b60201c565b8573ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060005b60038110156200029f576040518060c0016040528087836003811062000102576200010162000d76565b5b6020020151815260200186836003811062000122576200012162000d76565b5b6020020151815260200185836003811062000142576200014162000d76565b5b6020020151815260200184836003811062000162576200016162000d76565b5b6020020151815260200183836003811062000182576200018162000d76565b5b60200201518152602001600f67ffffffffffffffff811115620001aa57620001a9620009c9565b5b604051908082528060200260200182016040528015620001d95781602001602082028036833780820191505090505b5081525060058260038110620001f457620001f362000d76565b5b60060201600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050190805190602001906200024892919062000898565b5090505062000289338287846003811062000268576200026762000d76565b5b602002015160405180602001604052806000815250620003f260201b60201c565b8080620002969062000dd4565b915050620000d7565b5060005b600f811015620002fa576004600382620002be919062000e22565b90806001815401808255809150506001900390600052602060002001600090919091909150558080620002f19062000dd4565b915050620002a3565b5050505050505050620013a0565b806002908051906020019062000320929190620008ea565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141562000465576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200045c9062000f06565b60405180910390fd5b6000620004776200032460201b60201c565b905060006200048c85620005da60201b60201c565b90506000620004a185620005da60201b60201c565b9050620004ba836000898585896200065b60201b60201c565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200051b919062000e22565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516200059b92919062000f39565b60405180910390a4620005ba836000898585896200066360201b60201c565b620005d1836000898989896200066b60201b60201c565b50505050505050565b60606000600167ffffffffffffffff811115620005fc57620005fb620009c9565b5b6040519080825280602002602001820160405280156200062b5781602001602082028036833780820191505090505b509050828160008151811062000646576200064562000d76565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b620006978473ffffffffffffffffffffffffffffffffffffffff166200087560201b62001c341760201c565b156200086d578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401620006e095949392919062000fd4565b602060405180830381600087803b158015620006fb57600080fd5b505af19250505080156200072f57506040513d601f19601f820116820180604052508101906200072c919062001095565b60015b620007e1576200073e620010d4565b806308c379a01415620007a2575062000756620010f9565b80620007635750620007a4565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007999190620011e7565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007d89062001281565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146200086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008629062001319565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054828255906000526020600020908101928215620008d7579160200282015b82811115620008d6578251825591602001919060010190620008b9565b5b509050620008e691906200097b565b5090565b828054620008f8906200136a565b90600052602060002090601f0160209004810192826200091c576000855562000968565b82601f106200093757805160ff191683800117855562000968565b8280016001018555821562000968579182015b82811115620009675782518255916020019190600101906200094a565b5b5090506200097791906200097b565b5090565b5b80821115620009965760008160009055506001016200097c565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000a0382620009b8565b810181811067ffffffffffffffff8211171562000a255762000a24620009c9565b5b80604052505050565b600062000a3a6200099a565b905062000a488282620009f8565b919050565b600067ffffffffffffffff82111562000a6b5762000a6a620009c9565b5b62000a7682620009b8565b9050602081019050919050565b60005b8381101562000aa357808201518184015260208101905062000a86565b8381111562000ab3576000848401525b50505050565b600062000ad062000aca8462000a4d565b62000a2e565b90508281526020810184848401111562000aef5762000aee620009b3565b5b62000afc84828562000a83565b509392505050565b600082601f83011262000b1c5762000b1b620009ae565b5b815162000b2e84826020860162000ab9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b648262000b37565b9050919050565b62000b768162000b57565b811462000b8257600080fd5b50565b60008151905062000b968162000b6b565b92915050565b600067ffffffffffffffff82111562000bba5762000bb9620009c9565b5b602082029050919050565b600080fd5b6000819050919050565b62000bdf8162000bca565b811462000beb57600080fd5b50565b60008151905062000bff8162000bd4565b92915050565b600062000c1c62000c168462000b9c565b62000a2e565b9050806020840283018581111562000c395762000c3862000bc5565b5b835b8181101562000c66578062000c51888262000bee565b84526020840193505060208101905062000c3b565b5050509392505050565b600082601f83011262000c885762000c87620009ae565b5b600362000c9784828562000c05565b91505092915050565b6000806000806000806000610220888a03121562000cc35762000cc2620009a4565b5b600088015167ffffffffffffffff81111562000ce45762000ce3620009a9565b5b62000cf28a828b0162000b04565b975050602062000d058a828b0162000b85565b965050604062000d188a828b0162000c70565b95505060a062000d2b8a828b0162000c70565b94505061010062000d3f8a828b0162000c70565b93505061016062000d538a828b0162000c70565b9250506101c062000d678a828b0162000c70565b91505092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000de18262000bca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000e175762000e1662000da5565b5b600182019050919050565b600062000e2f8262000bca565b915062000e3c8362000bca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000e745762000e7362000da5565b5b828201905092915050565b600082825260208201905092915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600062000eee60218362000e7f565b915062000efb8262000e90565b604082019050919050565b6000602082019050818103600083015262000f218162000edf565b9050919050565b62000f338162000bca565b82525050565b600060408201905062000f50600083018562000f28565b62000f5f602083018462000f28565b9392505050565b62000f718162000b57565b82525050565b600081519050919050565b600082825260208201905092915050565b600062000fa08262000f77565b62000fac818562000f82565b935062000fbe81856020860162000a83565b62000fc981620009b8565b840191505092915050565b600060a08201905062000feb600083018862000f66565b62000ffa602083018762000f66565b62001009604083018662000f28565b62001018606083018562000f28565b81810360808301526200102c818462000f93565b90509695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6200106f8162001038565b81146200107b57600080fd5b50565b6000815190506200108f8162001064565b92915050565b600060208284031215620010ae57620010ad620009a4565b5b6000620010be848285016200107e565b91505092915050565b60008160e01c9050919050565b600060033d1115620010f65760046000803e620010f3600051620010c7565b90505b90565b600060443d10156200110b5762001198565b620011156200099a565b60043d036004823e80513d602482011167ffffffffffffffff821117156200113f57505062001198565b808201805167ffffffffffffffff8111156200115f575050505062001198565b80602083010160043d0385018111156200117e57505050505062001198565b6200118f82602001850186620009f8565b82955050505050505b90565b600081519050919050565b6000620011b3826200119b565b620011bf818562000e7f565b9350620011d181856020860162000a83565b620011dc81620009b8565b840191505092915050565b60006020820190508181036000830152620012038184620011a6565b905092915050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006200126960348362000e7f565b915062001276826200120b565b604082019050919050565b600060208201905081810360008301526200129c816200125a565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006200130160288362000e7f565b91506200130e82620012a3565b604082019050919050565b600060208201905081810360008301526200133481620012f2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200138357607f821691505b602082108114156200139a57620013996200133b565b5b50919050565b608051615905620013bc60003960006115bd01526159056000f3fe6080604052600436106101cc5760003560e01c806371b9b646116100f7578063d407cac011610095578063e94b3f1811610064578063e94b3f181461067d578063e985e9c5146106a6578063f242432a146106e3578063f2fde38b1461070c576101cc565b8063d407cac0146105d3578063dc884bdc146105fc578063e30c1e7c14610627578063e6bee5b314610652576101cc565b80638da5cb5b116100d15780638da5cb5b1461053a57806395c5a1dd14610565578063a22cb46514610581578063af422e15146105aa576101cc565b806371b9b646146104bb5780637adfdaca146104e65780638151111414610511576101cc565b806322b7a71d1161016f57806353ff77761161013e57806353ff7776146104255780635a0692771461045057806361b20d8c1461048d578063715018a6146104a4576101cc565b806322b7a71d146103585780632eb2c2d6146103815780632fe1bcbf146103aa5780634e1273f4146103e8576101cc565b80630fdc1985116101ab5780630fdc1985146102885780631d2e5a3a146102c557806320e8edbc146102ee578063214a25c11461032f576101cc565b8062fdd58e146101d157806301ffc9a71461020e5780630e89341c1461024b575b600080fd5b3480156101dd57600080fd5b506101f860048036038101906101f39190613716565b610735565b6040516102059190613765565b60405180910390f35b34801561021a57600080fd5b50610235600480360381019061023091906137d8565b6107fe565b6040516102429190613820565b60405180910390f35b34801561025757600080fd5b50610272600480360381019061026d919061383b565b6108e0565b60405161027f9190613901565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190613716565b61091b565b6040516102bc9190613765565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e7919061394f565b610940565b005b3480156102fa57600080fd5b506103156004803603810190610310919061383b565b6109b5565b60405161032695949392919061397c565b60405180910390f35b34801561033b57600080fd5b5061035660048036038101906103519190613b17565b6109f1565b005b34801561036457600080fd5b5061037f600480360381019061037a9190613b8f565b610c9e565b005b34801561038d57600080fd5b506103a860048036038101906103a39190613ccf565b610dfd565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190613d9e565b610e9e565b6040516103df929190613dde565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190613eca565b610edf565b60405161041c9190614000565b60405180910390f35b34801561043157600080fd5b5061043a610ff8565b60405161044791906140a6565b60405180910390f35b34801561045c57600080fd5b506104776004803603810190610472919061383b565b611081565b6040516104849190613765565b60405180910390f35b34801561049957600080fd5b506104a26110a5565b005b3480156104b057600080fd5b506104b9611166565b005b3480156104c757600080fd5b506104d061117a565b6040516104dd9190613820565b60405180910390f35b3480156104f257600080fd5b506104fb61118d565b6040516105089190613765565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190613b17565b611192565b005b34801561054657600080fd5b5061054f611356565b60405161055c91906140d0565b60405180910390f35b61057f600480360381019061057a9190613b17565b611380565b005b34801561058d57600080fd5b506105a860048036038101906105a391906140eb565b611826565b005b3480156105b657600080fd5b506105d160048036038101906105cc919061394f565b61183c565b005b3480156105df57600080fd5b506105fa60048036038101906105f591906141dc565b611861565b005b34801561060857600080fd5b50610611611898565b60405161061e9190613765565b60405180910390f35b34801561063357600080fd5b5061063c61189e565b6040516106499190613820565b60405180910390f35b34801561065e57600080fd5b506106676118b1565b6040516106749190613765565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190613b17565b6118b6565b005b3480156106b257600080fd5b506106cd60048036038101906106c8919061421d565b611a7b565b6040516106da9190613820565b60405180910390f35b3480156106ef57600080fd5b5061070a6004803603810190610705919061425d565b611b0f565b005b34801561071857600080fd5b50610733600480360381019061072e91906142f4565b611bb0565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079d90614393565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c957507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108d957506108d882611c57565b5b9050919050565b60606108eb82611cc1565b6108f483611d55565b6040516020016109059291906143ef565b6040516020818303038152906040529050919050565b6017602052816000526040600020602052806000526040600020600091509150505481565b610948611eb6565b600360159054906101000a900460ff1615610998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098f90614485565b60405180910390fd5b80600360146101000a81548160ff02191690831515021790555050565b600581600381106109c557600080fd5b600602016000915090508060000154908060010154908060020154908060030154908060040154905085565b600360159054906101000a900460ff16610a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a37906144f1565b60405180910390fd5b8051825114610a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7b90614583565b60405180910390fd5b606060005b8351811015610c5d5760186000858381518110610aa957610aa86145a3565b5b60200260200101518152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610b2557838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610adf565b5050505091506000825111610b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b669061461e565b60405180910390fd5b60005b8251811015610bfa57610be733848381518110610b9257610b916145a3565b5b602002602001015160000151868581518110610bb157610bb06145a3565b5b6020026020010151868581518110610bcc57610bcb6145a3565b5b602002602001015160200151610be2919061466d565b611f34565b8080610bf2906146c7565b915050610b72565b50610c4a33858381518110610c1257610c116145a3565b5b6020026020010151858481518110610c2d57610c2c6145a3565b5b60200260200101516040518060200160405280600081525061217b565b8080610c55906146c7565b915050610a89565b507f2236cc8019d54ed7a0a794c2504c30933a99d311eb731e04ffafc22191da2777338484604051610c9193929190614710565b60405180910390a1505050565b610ca6611eb6565b8051825114610cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce190614583565b60405180910390fd5b60006018600085815260200190815260200160002090505b600081805490501115610d4e5780805480610d2057610d1f614755565b5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055610d02565b60005b8351811015610df657816040518060400160405280868481518110610d7957610d786145a3565b5b60200260200101518152602001858481518110610d9957610d986145a3565b5b60200260200101518152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508080610dee906146c7565b915050610d51565b5050505050565b610e0561232c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610e4b5750610e4a85610e4561232c565b611a7b565b5b610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e81906147f6565b60405180910390fd5b610e978585858585612334565b5050505050565b60186020528160005260406000208181548110610eba57600080fd5b9060005260206000209060020201600091509150508060000154908060010154905082565b60608151835114610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c90614888565b60405180910390fd5b6000835167ffffffffffffffff811115610f4257610f416139d4565b5b604051908082528060200260200182016040528015610f705781602001602082028036833780820191505090505b50905060005b8451811015610fed57610fbd858281518110610f9557610f946145a3565b5b6020026020010151858381518110610fb057610faf6145a3565b5b6020026020010151610735565b828281518110610fd057610fcf6145a3565b5b60200260200101818152505080610fe6906146c7565b9050610f76565b508091505092915050565b6110006135e2565b60005b600381101561107d57600581600381106110205761101f6145a3565b5b60060201600101546005826003811061103c5761103b6145a3565b5b600602016002015461104e91906148a8565b828260038110611061576110606145a3565b5b6020020181815250508080611075906146c7565b915050611003565b5090565b6004818154811061109157600080fd5b906000526020600020016000915090505481565b6110ad611eb6565b6000806110b8611356565b73ffffffffffffffffffffffffffffffffffffffff16476040516110db9061490d565b60006040518083038185875af1925050503d8060008114611118576040519150601f19603f3d011682016040523d82523d6000602084013e61111d565b606091505b509150915081611162576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111599061496e565b60405180910390fd5b5050565b61116e611eb6565b6111786000612656565b565b600360149054906101000a900460ff1681565b600f81565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f7906149da565b60405180910390fd5b8051825114611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90614a6c565b60405180910390fd5b61124f33838361271c565b60005b8251811015611316576113033360048054806020026020016040519081016040528092919081815260200182805480156112ab57602002820191906000526020600020905b815481526020019060010190808311611297575b50505050506112ee8685815181106112c6576112c56145a3565b5b60200260200101518686815181106112e1576112e06145a3565b5b60200260200101516129eb565b60405180602001604052806000815250612b54565b808061130e906146c7565b915050611252565b507fdf972fc64b15d34dcf96ffdd7a269d47d0ab86c1595f6c7c774aa5461284ac6833838360405161134a93929190614710565b60405180910390a15050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600360149054906101000a900460ff166113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c690614ad8565b60405180910390fd5b60008151835114611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90614a6c565b60405180910390fd5b60005b8351811015611788576005848281518110611436576114356145a3565b5b60200260200101516003811061144f5761144e6145a3565b5b600602016003015483828151811061146a576114696145a3565b5b602002602001015111156114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90614b44565b60405180910390fd5b60058482815181106114c8576114c76145a3565b5b6020026020010151600381106114e1576114e06145a3565b5b60060201600201548382815181106114fc576114fb6145a3565b5b60200260200101516005868481518110611519576115186145a3565b5b602002602001015160038110611532576115316145a3565b5b60060201600101546115449190614b64565b1115611585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157c90614c2c565b60405180910390fd5b600584828151811061159a576115996145a3565b5b6020026020010151600381106115b3576115b26145a3565b5b60060201600401547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161161491906140d0565b602060405180830381600087803b15801561162e57600080fd5b505af1158015611642573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116669190614c61565b10156116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e90614cda565b60405180910390fd5b60058482815181106116bc576116bb6145a3565b5b6020026020010151600381106116d5576116d46145a3565b5b60060201600001548382815181106116f0576116ef6145a3565b5b6020026020010151611702919061466d565b8261170d9190614b64565b9150828181518110611722576117216145a3565b5b6020026020010151600585838151811061173f5761173e6145a3565b5b602002602001015160038110611758576117576145a3565b5b60060201600101600082825461176e9190614b64565b925050819055508080611780906146c7565b915050611418565b508034146117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c290614d46565b60405180910390fd5b6117e633848460405180602001604052806000815250612b54565b7f6ff68eab6367f351d5a136ead5dd775de84f2ab8b4a0356ae8b966be68773e8033848460405161181993929190614710565b60405180910390a1505050565b61183861183161232c565b8383612d81565b5050565b611844611eb6565b80600360156101000a81548160ff02191690831515021790555050565b611869611eb6565b806005836003811061187e5761187d6145a3565b5b6006020160050190600f611893929190613604565b505050565b61271081565b600360159054906101000a900460ff1681565b600381565b80518251146118fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f190614dd8565b60405180910390fd5b60005b8251811015611a3057828181518110611919576119186145a3565b5b60200260200101516004600081548110611936576119356145a3565b5b90600052602060002001541115611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990614e44565b60405180910390fd5b818181518110611995576119946145a3565b5b6020026020010151601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008584815181106119f1576119f06145a3565b5b602002602001015181526020019081526020016000206000828254611a169190614b64565b925050819055508080611a28906146c7565b9150506118fd565b50611a3c33838361271c565b7fd88ef64cd81e2b66bcc841152a19e55e1e627c4c02ce6dc7aa9978a86b13b1c1338383604051611a6f93929190614710565b60405180910390a15050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b1761232c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611b5d5750611b5c85611b5761232c565b611a7b565b5b611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b93906147f6565b60405180910390fd5b611ba98585858585612eee565b5050505050565b611bb8611eb6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f90614ed6565b60405180910390fd5b611c3181612656565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060028054611cd090614f25565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfc90614f25565b8015611d495780601f10611d1e57610100808354040283529160200191611d49565b820191906000526020600020905b815481529060010190602001808311611d2c57829003601f168201915b50505050509050919050565b60606000821415611d9d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611eb1565b600082905060005b60008214611dcf578080611db8906146c7565b915050600a82611dc89190614f86565b9150611da5565b60008167ffffffffffffffff811115611deb57611dea6139d4565b5b6040519080825280601f01601f191660200182016040528015611e1d5781602001600182028036833780820191505090505b5090505b60008514611eaa57600182611e3691906148a8565b9150600a85611e459190614fb7565b6030611e519190614b64565b60f81b818381518110611e6757611e666145a3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ea39190614f86565b9450611e21565b8093505050505b919050565b611ebe61232c565b73ffffffffffffffffffffffffffffffffffffffff16611edc611356565b73ffffffffffffffffffffffffffffffffffffffff1614611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2990615034565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b906150c6565b60405180910390fd5b6000611fae61232c565b90506000611fbb8461318a565b90506000611fc88461318a565b9050611fe883876000858560405180602001604052806000815250613204565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508481101561207f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207690615158565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161214c929190613dde565b60405180910390a46121728488600086866040518060200160405280600081525061320c565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e2906151ea565b60405180910390fd5b60006121f561232c565b905060006122028561318a565b9050600061220f8561318a565b905061222083600089858589613204565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461227f9190614b64565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516122fd929190613dde565b60405180910390a46123148360008985858961320c565b61232383600089898989613214565b50505050505050565b600033905090565b8151835114612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236f9061527c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123df9061530e565b60405180910390fd5b60006123f261232c565b9050612402818787878787613204565b60005b84518110156125b3576000858281518110612423576124226145a3565b5b602002602001015190506000858381518110612442576124416145a3565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156124e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124da906153a0565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125989190614b64565b92505081905550505050806125ac906146c7565b9050612405565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161262a9291906153c0565b60405180910390a461264081878787878761320c565b61264e8187878787876133fb565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561278c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612783906150c6565b60405180910390fd5b80518251146127d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c79061527c565b60405180910390fd5b60006127da61232c565b90506127fa81856000868660405180602001604052806000815250613204565b60005b835181101561294757600084828151811061281b5761281a6145a3565b5b60200260200101519050600084838151811061283a576128396145a3565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156128db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d290615158565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050808061293f906146c7565b9150506127fd565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516129bf9291906153c0565b60405180910390a46129e58185600086866040518060200160405280600081525061320c565b50505050565b6060600f67ffffffffffffffff811115612a0857612a076139d4565b5b604051908082528060200260200182016040528015612a365781602001602082028036833780820191505090505b509050600080600090505b83811015612b4c5761271033868343424340604051602001612a689695949392919061548b565b6040516020818303038152906040528051906020012060001c612a8b9190614fb7565b915060005b60058660038110612aa457612aa36145a3565b5b6006020160050180549050811015612b385760058660038110612aca57612ac96145a3565b5b600602016005018181548110612ae357612ae26145a3565b5b90600052602060002001548311612b2557838181518110612b0757612b066145a3565b5b602002602001018051809190612b1c906146c7565b81525050612b38565b8080612b30906146c7565b915050612a90565b508080612b44906146c7565b915050612a41565b505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbb906151ea565b60405180910390fd5b8151835114612c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bff9061527c565b60405180910390fd5b6000612c1261232c565b9050612c2381600087878787613204565b60005b8451811015612cdc57838181518110612c4257612c416145a3565b5b6020026020010151600080878481518110612c6057612c5f6145a3565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cc29190614b64565b925050819055508080612cd4906146c7565b915050612c26565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612d549291906153c0565b60405180910390a4612d6b8160008787878761320c565b612d7a816000878787876133fb565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de79061556d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ee19190613820565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f559061530e565b60405180910390fd5b6000612f6861232c565b90506000612f758561318a565b90506000612f828561318a565b9050612f92838989858589613204565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015613029576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613020906153a0565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130de9190614b64565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161315b929190613dde565b60405180910390a4613171848a8a86868a61320c565b61317f848a8a8a8a8a613214565b505050505050505050565b60606000600167ffffffffffffffff8111156131a9576131a86139d4565b5b6040519080825280602002602001820160405280156131d75781602001602082028036833780820191505090505b50905082816000815181106131ef576131ee6145a3565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b6132338473ffffffffffffffffffffffffffffffffffffffff16611c34565b156133f3578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016132799594939291906155e2565b602060405180830381600087803b15801561329357600080fd5b505af19250505080156132c457506040513d601f19601f820116820180604052508101906132c19190615651565b60015b61336a576132d061568b565b806308c379a0141561332d57506132e56156ad565b806132f0575061332f565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133249190613901565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613361906157b5565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146133f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e890615847565b60405180910390fd5b505b505050505050565b61341a8473ffffffffffffffffffffffffffffffffffffffff16611c34565b156135da578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613460959493929190615867565b602060405180830381600087803b15801561347a57600080fd5b505af19250505080156134ab57506040513d601f19601f820116820180604052508101906134a89190615651565b60015b613551576134b761568b565b806308c379a0141561351457506134cc6156ad565b806134d75750613516565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350b9190613901565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613548906157b5565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146135d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135cf90615847565b60405180910390fd5b505b505050505050565b6040518060600160405280600390602082028036833780820191505090505090565b828054828255906000526020600020908101928215613640579160200282015b8281111561363f578251825591602001919060010190613624565b5b50905061364d9190613651565b5090565b5b8082111561366a576000816000905550600101613652565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136ad82613682565b9050919050565b6136bd816136a2565b81146136c857600080fd5b50565b6000813590506136da816136b4565b92915050565b6000819050919050565b6136f3816136e0565b81146136fe57600080fd5b50565b600081359050613710816136ea565b92915050565b6000806040838503121561372d5761372c613678565b5b600061373b858286016136cb565b925050602061374c85828601613701565b9150509250929050565b61375f816136e0565b82525050565b600060208201905061377a6000830184613756565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137b581613780565b81146137c057600080fd5b50565b6000813590506137d2816137ac565b92915050565b6000602082840312156137ee576137ed613678565b5b60006137fc848285016137c3565b91505092915050565b60008115159050919050565b61381a81613805565b82525050565b60006020820190506138356000830184613811565b92915050565b60006020828403121561385157613850613678565b5b600061385f84828501613701565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138a2578082015181840152602081019050613887565b838111156138b1576000848401525b50505050565b6000601f19601f8301169050919050565b60006138d382613868565b6138dd8185613873565b93506138ed818560208601613884565b6138f6816138b7565b840191505092915050565b6000602082019050818103600083015261391b81846138c8565b905092915050565b61392c81613805565b811461393757600080fd5b50565b60008135905061394981613923565b92915050565b60006020828403121561396557613964613678565b5b60006139738482850161393a565b91505092915050565b600060a0820190506139916000830188613756565b61399e6020830187613756565b6139ab6040830186613756565b6139b86060830185613756565b6139c56080830184613756565b9695505050505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a0c826138b7565b810181811067ffffffffffffffff82111715613a2b57613a2a6139d4565b5b80604052505050565b6000613a3e61366e565b9050613a4a8282613a03565b919050565b600067ffffffffffffffff821115613a6a57613a696139d4565b5b602082029050602081019050919050565b600080fd5b6000613a93613a8e84613a4f565b613a34565b90508083825260208201905060208402830185811115613ab657613ab5613a7b565b5b835b81811015613adf5780613acb8882613701565b845260208401935050602081019050613ab8565b5050509392505050565b600082601f830112613afe57613afd6139cf565b5b8135613b0e848260208601613a80565b91505092915050565b60008060408385031215613b2e57613b2d613678565b5b600083013567ffffffffffffffff811115613b4c57613b4b61367d565b5b613b5885828601613ae9565b925050602083013567ffffffffffffffff811115613b7957613b7861367d565b5b613b8585828601613ae9565b9150509250929050565b600080600060608486031215613ba857613ba7613678565b5b6000613bb686828701613701565b935050602084013567ffffffffffffffff811115613bd757613bd661367d565b5b613be386828701613ae9565b925050604084013567ffffffffffffffff811115613c0457613c0361367d565b5b613c1086828701613ae9565b9150509250925092565b600080fd5b600067ffffffffffffffff821115613c3a57613c396139d4565b5b613c43826138b7565b9050602081019050919050565b82818337600083830152505050565b6000613c72613c6d84613c1f565b613a34565b905082815260208101848484011115613c8e57613c8d613c1a565b5b613c99848285613c50565b509392505050565b600082601f830112613cb657613cb56139cf565b5b8135613cc6848260208601613c5f565b91505092915050565b600080600080600060a08688031215613ceb57613cea613678565b5b6000613cf9888289016136cb565b9550506020613d0a888289016136cb565b945050604086013567ffffffffffffffff811115613d2b57613d2a61367d565b5b613d3788828901613ae9565b935050606086013567ffffffffffffffff811115613d5857613d5761367d565b5b613d6488828901613ae9565b925050608086013567ffffffffffffffff811115613d8557613d8461367d565b5b613d9188828901613ca1565b9150509295509295909350565b60008060408385031215613db557613db4613678565b5b6000613dc385828601613701565b9250506020613dd485828601613701565b9150509250929050565b6000604082019050613df36000830185613756565b613e006020830184613756565b9392505050565b600067ffffffffffffffff821115613e2257613e216139d4565b5b602082029050602081019050919050565b6000613e46613e4184613e07565b613a34565b90508083825260208201905060208402830185811115613e6957613e68613a7b565b5b835b81811015613e925780613e7e88826136cb565b845260208401935050602081019050613e6b565b5050509392505050565b600082601f830112613eb157613eb06139cf565b5b8135613ec1848260208601613e33565b91505092915050565b60008060408385031215613ee157613ee0613678565b5b600083013567ffffffffffffffff811115613eff57613efe61367d565b5b613f0b85828601613e9c565b925050602083013567ffffffffffffffff811115613f2c57613f2b61367d565b5b613f3885828601613ae9565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f77816136e0565b82525050565b6000613f898383613f6e565b60208301905092915050565b6000602082019050919050565b6000613fad82613f42565b613fb78185613f4d565b9350613fc283613f5e565b8060005b83811015613ff3578151613fda8882613f7d565b9750613fe583613f95565b925050600181019050613fc6565b5085935050505092915050565b6000602082019050818103600083015261401a8184613fa2565b905092915050565b600060039050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b61405881614022565b614062818461402d565b925061406d82614038565b8060005b8381101561409e5781516140858782613f7d565b965061409083614042565b925050600181019050614071565b505050505050565b60006060820190506140bb600083018461404f565b92915050565b6140ca816136a2565b82525050565b60006020820190506140e560008301846140c1565b92915050565b6000806040838503121561410257614101613678565b5b6000614110858286016136cb565b92505060206141218582860161393a565b9150509250929050565b600067ffffffffffffffff821115614146576141456139d4565b5b602082029050919050565b600061416461415f8461412b565b613a34565b9050806020840283018581111561417e5761417d613a7b565b5b835b818110156141a757806141938882613701565b845260208401935050602081019050614180565b5050509392505050565b600082601f8301126141c6576141c56139cf565b5b600f6141d3848285614151565b91505092915050565b60008061020083850312156141f4576141f3613678565b5b600061420285828601613701565b9250506020614213858286016141b1565b9150509250929050565b6000806040838503121561423457614233613678565b5b6000614242858286016136cb565b9250506020614253858286016136cb565b9150509250929050565b600080600080600060a0868803121561427957614278613678565b5b6000614287888289016136cb565b9550506020614298888289016136cb565b94505060406142a988828901613701565b93505060606142ba88828901613701565b925050608086013567ffffffffffffffff8111156142db576142da61367d565b5b6142e788828901613ca1565b9150509295509295909350565b60006020828403121561430a57614309613678565b5b6000614318848285016136cb565b91505092915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b600061437d602a83613873565b915061438882614321565b604082019050919050565b600060208201905081810360008301526143ac81614370565b9050919050565b600081905092915050565b60006143c982613868565b6143d381856143b3565b93506143e3818560208601613884565b80840191505092915050565b60006143fb82856143be565b915061440782846143be565b91508190509392505050565b7f43616e6e6f742073746172742073616c65207768696c6520616374697661746960008201527f6f6e732061726520656e61626c65640000000000000000000000000000000000602082015250565b600061446f602f83613873565b915061447a82614413565b604082019050919050565b6000602082019050818103600083015261449e81614462565b9050919050565b7f4372616674696e672069732064697361626c6564000000000000000000000000600082015250565b60006144db601483613873565b91506144e6826144a5565b602082019050919050565b6000602082019050818103600083015261450a816144ce565b9050919050565b7f4d75737420626520657175616c206e756d626572206f6620617274696661637460008201527f7320616e6420616d6f756e747300000000000000000000000000000000000000602082015250565b600061456d602d83613873565b915061457882614511565b604082019050919050565b6000602082019050818103600083015261459c81614560565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c6964206372616674696e6720726563697065000000000000000000600082015250565b6000614608601783613873565b9150614613826145d2565b602082019050919050565b60006020820190508181036000830152614637816145fb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614678826136e0565b9150614683836136e0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146bc576146bb61463e565b5b828202905092915050565b60006146d2826136e0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147055761470461463e565b5b600182019050919050565b600060608201905061472560008301866140c1565b81810360208301526147378185613fa2565b9050818103604083015261474b8184613fa2565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b60006147e0602f83613873565b91506147eb82614784565b604082019050919050565b6000602082019050818103600083015261480f816147d3565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614872602983613873565b915061487d82614816565b604082019050919050565b600060208201905081810360008301526148a181614865565b9050919050565b60006148b3826136e0565b91506148be836136e0565b9250828210156148d1576148d061463e565b5b828203905092915050565b600081905092915050565b50565b60006148f76000836148dc565b9150614902826148e7565b600082019050919050565b6000614918826148ea565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b6000614958601483613873565b915061496382614922565b602082019050919050565b600060208201905081810360008301526149878161494b565b9050919050565b7f43616e6e6f74206f70656e2076696120736d61727420636f6e74726163740000600082015250565b60006149c4601e83613873565b91506149cf8261498e565b602082019050919050565b600060208201905081810360008301526149f3816149b7565b9050919050565b7f546965727320616e6420616d6f756e7473206c656e677468206d757374206d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b6000614a56602383613873565b9150614a61826149fa565b604082019050919050565b60006020820190508181036000830152614a8581614a49565b9050919050565b7f53616c652069732064697361626c656400000000000000000000000000000000600082015250565b6000614ac2601083613873565b9150614acd82614a8c565b602082019050919050565b60006020820190508181036000830152614af181614ab5565b9050919050565b7f4d696e7420616d6f756e742065786365656473206c696d697400000000000000600082015250565b6000614b2e601983613873565b9150614b3982614af8565b602082019050919050565b60006020820190508181036000830152614b5d81614b21565b9050919050565b6000614b6f826136e0565b9150614b7a836136e0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614baf57614bae61463e565b5b828201905092915050565b7f4d696e7420616d6f756e7420776f756c6420657863656564206d61782073757060008201527f706c790000000000000000000000000000000000000000000000000000000000602082015250565b6000614c16602383613873565b9150614c2182614bba565b604082019050919050565b60006020820190508181036000830152614c4581614c09565b9050919050565b600081519050614c5b816136ea565b92915050565b600060208284031215614c7757614c76613678565b5b6000614c8584828501614c4c565b91505092915050565b7f4e6f7420656e6f75676820746f7563616e7320696e2077616c6c657400000000600082015250565b6000614cc4601c83613873565b9150614ccf82614c8e565b602082019050919050565b60006020820190508181036000830152614cf381614cb7565b9050919050565b7f496e76616c696420455448207061796d656e742073656e740000000000000000600082015250565b6000614d30601883613873565b9150614d3b82614cfa565b602082019050919050565b60006020820190508181036000830152614d5f81614d23565b9050919050565b7f49447320616e6420616d6f756e7473206c656e677468206d757374206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000614dc2602183613873565b9150614dcd82614d66565b604082019050919050565b60006020820190508181036000830152614df181614db5565b9050919050565b7f496e76616c696420617274696661637420494400000000000000000000000000600082015250565b6000614e2e601383613873565b9150614e3982614df8565b602082019050919050565b60006020820190508181036000830152614e5d81614e21565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ec0602683613873565b9150614ecb82614e64565b604082019050919050565b60006020820190508181036000830152614eef81614eb3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f3d57607f821691505b60208210811415614f5157614f50614ef6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f91826136e0565b9150614f9c836136e0565b925082614fac57614fab614f57565b5b828204905092915050565b6000614fc2826136e0565b9150614fcd836136e0565b925082614fdd57614fdc614f57565b5b828206905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061501e602083613873565b915061502982614fe8565b602082019050919050565b6000602082019050818103600083015261504d81615011565b9050919050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006150b0602383613873565b91506150bb82615054565b604082019050919050565b600060208201905081810360008301526150df816150a3565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000615142602483613873565b915061514d826150e6565b604082019050919050565b6000602082019050818103600083015261517181615135565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006151d4602183613873565b91506151df82615178565b604082019050919050565b60006020820190508181036000830152615203816151c7565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000615266602883613873565b91506152718261520a565b604082019050919050565b6000602082019050818103600083015261529581615259565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006152f8602583613873565b91506153038261529c565b604082019050919050565b60006020820190508181036000830152615327816152eb565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b600061538a602a83613873565b91506153958261532e565b604082019050919050565b600060208201905081810360008301526153b98161537d565b9050919050565b600060408201905081810360008301526153da8185613fa2565b905081810360208301526153ee8184613fa2565b90509392505050565b60008160601b9050919050565b600061540f826153f7565b9050919050565b600061542182615404565b9050919050565b615439615434826136a2565b615416565b82525050565b6000819050919050565b61545a615455826136e0565b61543f565b82525050565b6000819050919050565b6000819050919050565b61548561548082615460565b61546a565b82525050565b60006154978289615428565b6014820191506154a78288615449565b6020820191506154b78287615449565b6020820191506154c78286615449565b6020820191506154d78285615449565b6020820191506154e78284615474565b602082019150819050979650505050505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615557602983613873565b9150615562826154fb565b604082019050919050565b600060208201905081810360008301526155868161554a565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006155b48261558d565b6155be8185615598565b93506155ce818560208601613884565b6155d7816138b7565b840191505092915050565b600060a0820190506155f760008301886140c1565b61560460208301876140c1565b6156116040830186613756565b61561e6060830185613756565b818103608083015261563081846155a9565b90509695505050505050565b60008151905061564b816137ac565b92915050565b60006020828403121561566757615666613678565b5b60006156758482850161563c565b91505092915050565b60008160e01c9050919050565b600060033d11156156aa5760046000803e6156a760005161567e565b90505b90565b600060443d10156156bd57615740565b6156c561366e565b60043d036004823e80513d602482011167ffffffffffffffff821117156156ed575050615740565b808201805167ffffffffffffffff81111561570b5750505050615740565b80602083010160043d038501811115615728575050505050615740565b61573782602001850186613a03565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600061579f603483613873565b91506157aa82615743565b604082019050919050565b600060208201905081810360008301526157ce81615792565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615831602883613873565b915061583c826157d5565b604082019050919050565b6000602082019050818103600083015261586081615824565b9050919050565b600060a08201905061587c60008301886140c1565b61588960208301876140c1565b818103604083015261589b8186613fa2565b905081810360608301526158af8185613fa2565b905081810360808301526158c381846155a9565b9050969550505050505056fea2646970667358221220c8532b95f0619d57f842dc55d8f73a7b99bb8b4b67a1297e79bad9559aa50a5464736f6c634300080900330000000000000000000000000000000000000000000000000000000000000220000000000000000000000000642ffab2752df3bce97083709f36080fb1482c8000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000038d7ea4c680000000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000004e20000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000002368747470733a2f2f7368656c6c70726f746f636f6c2e696f2f6170692f626f6f74792f0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101cc5760003560e01c806371b9b646116100f7578063d407cac011610095578063e94b3f1811610064578063e94b3f181461067d578063e985e9c5146106a6578063f242432a146106e3578063f2fde38b1461070c576101cc565b8063d407cac0146105d3578063dc884bdc146105fc578063e30c1e7c14610627578063e6bee5b314610652576101cc565b80638da5cb5b116100d15780638da5cb5b1461053a57806395c5a1dd14610565578063a22cb46514610581578063af422e15146105aa576101cc565b806371b9b646146104bb5780637adfdaca146104e65780638151111414610511576101cc565b806322b7a71d1161016f57806353ff77761161013e57806353ff7776146104255780635a0692771461045057806361b20d8c1461048d578063715018a6146104a4576101cc565b806322b7a71d146103585780632eb2c2d6146103815780632fe1bcbf146103aa5780634e1273f4146103e8576101cc565b80630fdc1985116101ab5780630fdc1985146102885780631d2e5a3a146102c557806320e8edbc146102ee578063214a25c11461032f576101cc565b8062fdd58e146101d157806301ffc9a71461020e5780630e89341c1461024b575b600080fd5b3480156101dd57600080fd5b506101f860048036038101906101f39190613716565b610735565b6040516102059190613765565b60405180910390f35b34801561021a57600080fd5b50610235600480360381019061023091906137d8565b6107fe565b6040516102429190613820565b60405180910390f35b34801561025757600080fd5b50610272600480360381019061026d919061383b565b6108e0565b60405161027f9190613901565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190613716565b61091b565b6040516102bc9190613765565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e7919061394f565b610940565b005b3480156102fa57600080fd5b506103156004803603810190610310919061383b565b6109b5565b60405161032695949392919061397c565b60405180910390f35b34801561033b57600080fd5b5061035660048036038101906103519190613b17565b6109f1565b005b34801561036457600080fd5b5061037f600480360381019061037a9190613b8f565b610c9e565b005b34801561038d57600080fd5b506103a860048036038101906103a39190613ccf565b610dfd565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190613d9e565b610e9e565b6040516103df929190613dde565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190613eca565b610edf565b60405161041c9190614000565b60405180910390f35b34801561043157600080fd5b5061043a610ff8565b60405161044791906140a6565b60405180910390f35b34801561045c57600080fd5b506104776004803603810190610472919061383b565b611081565b6040516104849190613765565b60405180910390f35b34801561049957600080fd5b506104a26110a5565b005b3480156104b057600080fd5b506104b9611166565b005b3480156104c757600080fd5b506104d061117a565b6040516104dd9190613820565b60405180910390f35b3480156104f257600080fd5b506104fb61118d565b6040516105089190613765565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190613b17565b611192565b005b34801561054657600080fd5b5061054f611356565b60405161055c91906140d0565b60405180910390f35b61057f600480360381019061057a9190613b17565b611380565b005b34801561058d57600080fd5b506105a860048036038101906105a391906140eb565b611826565b005b3480156105b657600080fd5b506105d160048036038101906105cc919061394f565b61183c565b005b3480156105df57600080fd5b506105fa60048036038101906105f591906141dc565b611861565b005b34801561060857600080fd5b50610611611898565b60405161061e9190613765565b60405180910390f35b34801561063357600080fd5b5061063c61189e565b6040516106499190613820565b60405180910390f35b34801561065e57600080fd5b506106676118b1565b6040516106749190613765565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190613b17565b6118b6565b005b3480156106b257600080fd5b506106cd60048036038101906106c8919061421d565b611a7b565b6040516106da9190613820565b60405180910390f35b3480156106ef57600080fd5b5061070a6004803603810190610705919061425d565b611b0f565b005b34801561071857600080fd5b50610733600480360381019061072e91906142f4565b611bb0565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079d90614393565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c957507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108d957506108d882611c57565b5b9050919050565b60606108eb82611cc1565b6108f483611d55565b6040516020016109059291906143ef565b6040516020818303038152906040529050919050565b6017602052816000526040600020602052806000526040600020600091509150505481565b610948611eb6565b600360159054906101000a900460ff1615610998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098f90614485565b60405180910390fd5b80600360146101000a81548160ff02191690831515021790555050565b600581600381106109c557600080fd5b600602016000915090508060000154908060010154908060020154908060030154908060040154905085565b600360159054906101000a900460ff16610a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a37906144f1565b60405180910390fd5b8051825114610a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7b90614583565b60405180910390fd5b606060005b8351811015610c5d5760186000858381518110610aa957610aa86145a3565b5b60200260200101518152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610b2557838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610adf565b5050505091506000825111610b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b669061461e565b60405180910390fd5b60005b8251811015610bfa57610be733848381518110610b9257610b916145a3565b5b602002602001015160000151868581518110610bb157610bb06145a3565b5b6020026020010151868581518110610bcc57610bcb6145a3565b5b602002602001015160200151610be2919061466d565b611f34565b8080610bf2906146c7565b915050610b72565b50610c4a33858381518110610c1257610c116145a3565b5b6020026020010151858481518110610c2d57610c2c6145a3565b5b60200260200101516040518060200160405280600081525061217b565b8080610c55906146c7565b915050610a89565b507f2236cc8019d54ed7a0a794c2504c30933a99d311eb731e04ffafc22191da2777338484604051610c9193929190614710565b60405180910390a1505050565b610ca6611eb6565b8051825114610cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce190614583565b60405180910390fd5b60006018600085815260200190815260200160002090505b600081805490501115610d4e5780805480610d2057610d1f614755565b5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055610d02565b60005b8351811015610df657816040518060400160405280868481518110610d7957610d786145a3565b5b60200260200101518152602001858481518110610d9957610d986145a3565b5b60200260200101518152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508080610dee906146c7565b915050610d51565b5050505050565b610e0561232c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610e4b5750610e4a85610e4561232c565b611a7b565b5b610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e81906147f6565b60405180910390fd5b610e978585858585612334565b5050505050565b60186020528160005260406000208181548110610eba57600080fd5b9060005260206000209060020201600091509150508060000154908060010154905082565b60608151835114610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c90614888565b60405180910390fd5b6000835167ffffffffffffffff811115610f4257610f416139d4565b5b604051908082528060200260200182016040528015610f705781602001602082028036833780820191505090505b50905060005b8451811015610fed57610fbd858281518110610f9557610f946145a3565b5b6020026020010151858381518110610fb057610faf6145a3565b5b6020026020010151610735565b828281518110610fd057610fcf6145a3565b5b60200260200101818152505080610fe6906146c7565b9050610f76565b508091505092915050565b6110006135e2565b60005b600381101561107d57600581600381106110205761101f6145a3565b5b60060201600101546005826003811061103c5761103b6145a3565b5b600602016002015461104e91906148a8565b828260038110611061576110606145a3565b5b6020020181815250508080611075906146c7565b915050611003565b5090565b6004818154811061109157600080fd5b906000526020600020016000915090505481565b6110ad611eb6565b6000806110b8611356565b73ffffffffffffffffffffffffffffffffffffffff16476040516110db9061490d565b60006040518083038185875af1925050503d8060008114611118576040519150601f19603f3d011682016040523d82523d6000602084013e61111d565b606091505b509150915081611162576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111599061496e565b60405180910390fd5b5050565b61116e611eb6565b6111786000612656565b565b600360149054906101000a900460ff1681565b600f81565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f7906149da565b60405180910390fd5b8051825114611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90614a6c565b60405180910390fd5b61124f33838361271c565b60005b8251811015611316576113033360048054806020026020016040519081016040528092919081815260200182805480156112ab57602002820191906000526020600020905b815481526020019060010190808311611297575b50505050506112ee8685815181106112c6576112c56145a3565b5b60200260200101518686815181106112e1576112e06145a3565b5b60200260200101516129eb565b60405180602001604052806000815250612b54565b808061130e906146c7565b915050611252565b507fdf972fc64b15d34dcf96ffdd7a269d47d0ab86c1595f6c7c774aa5461284ac6833838360405161134a93929190614710565b60405180910390a15050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600360149054906101000a900460ff166113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c690614ad8565b60405180910390fd5b60008151835114611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90614a6c565b60405180910390fd5b60005b8351811015611788576005848281518110611436576114356145a3565b5b60200260200101516003811061144f5761144e6145a3565b5b600602016003015483828151811061146a576114696145a3565b5b602002602001015111156114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90614b44565b60405180910390fd5b60058482815181106114c8576114c76145a3565b5b6020026020010151600381106114e1576114e06145a3565b5b60060201600201548382815181106114fc576114fb6145a3565b5b60200260200101516005868481518110611519576115186145a3565b5b602002602001015160038110611532576115316145a3565b5b60060201600101546115449190614b64565b1115611585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157c90614c2c565b60405180910390fd5b600584828151811061159a576115996145a3565b5b6020026020010151600381106115b3576115b26145a3565b5b60060201600401547f000000000000000000000000642ffab2752df3bce97083709f36080fb1482c8073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161161491906140d0565b602060405180830381600087803b15801561162e57600080fd5b505af1158015611642573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116669190614c61565b10156116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e90614cda565b60405180910390fd5b60058482815181106116bc576116bb6145a3565b5b6020026020010151600381106116d5576116d46145a3565b5b60060201600001548382815181106116f0576116ef6145a3565b5b6020026020010151611702919061466d565b8261170d9190614b64565b9150828181518110611722576117216145a3565b5b6020026020010151600585838151811061173f5761173e6145a3565b5b602002602001015160038110611758576117576145a3565b5b60060201600101600082825461176e9190614b64565b925050819055508080611780906146c7565b915050611418565b508034146117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c290614d46565b60405180910390fd5b6117e633848460405180602001604052806000815250612b54565b7f6ff68eab6367f351d5a136ead5dd775de84f2ab8b4a0356ae8b966be68773e8033848460405161181993929190614710565b60405180910390a1505050565b61183861183161232c565b8383612d81565b5050565b611844611eb6565b80600360156101000a81548160ff02191690831515021790555050565b611869611eb6565b806005836003811061187e5761187d6145a3565b5b6006020160050190600f611893929190613604565b505050565b61271081565b600360159054906101000a900460ff1681565b600381565b80518251146118fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f190614dd8565b60405180910390fd5b60005b8251811015611a3057828181518110611919576119186145a3565b5b60200260200101516004600081548110611936576119356145a3565b5b90600052602060002001541115611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990614e44565b60405180910390fd5b818181518110611995576119946145a3565b5b6020026020010151601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008584815181106119f1576119f06145a3565b5b602002602001015181526020019081526020016000206000828254611a169190614b64565b925050819055508080611a28906146c7565b9150506118fd565b50611a3c33838361271c565b7fd88ef64cd81e2b66bcc841152a19e55e1e627c4c02ce6dc7aa9978a86b13b1c1338383604051611a6f93929190614710565b60405180910390a15050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b1761232c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611b5d5750611b5c85611b5761232c565b611a7b565b5b611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b93906147f6565b60405180910390fd5b611ba98585858585612eee565b5050505050565b611bb8611eb6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f90614ed6565b60405180910390fd5b611c3181612656565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060028054611cd090614f25565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfc90614f25565b8015611d495780601f10611d1e57610100808354040283529160200191611d49565b820191906000526020600020905b815481529060010190602001808311611d2c57829003601f168201915b50505050509050919050565b60606000821415611d9d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611eb1565b600082905060005b60008214611dcf578080611db8906146c7565b915050600a82611dc89190614f86565b9150611da5565b60008167ffffffffffffffff811115611deb57611dea6139d4565b5b6040519080825280601f01601f191660200182016040528015611e1d5781602001600182028036833780820191505090505b5090505b60008514611eaa57600182611e3691906148a8565b9150600a85611e459190614fb7565b6030611e519190614b64565b60f81b818381518110611e6757611e666145a3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ea39190614f86565b9450611e21565b8093505050505b919050565b611ebe61232c565b73ffffffffffffffffffffffffffffffffffffffff16611edc611356565b73ffffffffffffffffffffffffffffffffffffffff1614611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2990615034565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b906150c6565b60405180910390fd5b6000611fae61232c565b90506000611fbb8461318a565b90506000611fc88461318a565b9050611fe883876000858560405180602001604052806000815250613204565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508481101561207f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207690615158565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161214c929190613dde565b60405180910390a46121728488600086866040518060200160405280600081525061320c565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e2906151ea565b60405180910390fd5b60006121f561232c565b905060006122028561318a565b9050600061220f8561318a565b905061222083600089858589613204565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461227f9190614b64565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516122fd929190613dde565b60405180910390a46123148360008985858961320c565b61232383600089898989613214565b50505050505050565b600033905090565b8151835114612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236f9061527c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123df9061530e565b60405180910390fd5b60006123f261232c565b9050612402818787878787613204565b60005b84518110156125b3576000858281518110612423576124226145a3565b5b602002602001015190506000858381518110612442576124416145a3565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156124e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124da906153a0565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125989190614b64565b92505081905550505050806125ac906146c7565b9050612405565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161262a9291906153c0565b60405180910390a461264081878787878761320c565b61264e8187878787876133fb565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561278c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612783906150c6565b60405180910390fd5b80518251146127d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c79061527c565b60405180910390fd5b60006127da61232c565b90506127fa81856000868660405180602001604052806000815250613204565b60005b835181101561294757600084828151811061281b5761281a6145a3565b5b60200260200101519050600084838151811061283a576128396145a3565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156128db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d290615158565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050808061293f906146c7565b9150506127fd565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516129bf9291906153c0565b60405180910390a46129e58185600086866040518060200160405280600081525061320c565b50505050565b6060600f67ffffffffffffffff811115612a0857612a076139d4565b5b604051908082528060200260200182016040528015612a365781602001602082028036833780820191505090505b509050600080600090505b83811015612b4c5761271033868343424340604051602001612a689695949392919061548b565b6040516020818303038152906040528051906020012060001c612a8b9190614fb7565b915060005b60058660038110612aa457612aa36145a3565b5b6006020160050180549050811015612b385760058660038110612aca57612ac96145a3565b5b600602016005018181548110612ae357612ae26145a3565b5b90600052602060002001548311612b2557838181518110612b0757612b066145a3565b5b602002602001018051809190612b1c906146c7565b81525050612b38565b8080612b30906146c7565b915050612a90565b508080612b44906146c7565b915050612a41565b505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbb906151ea565b60405180910390fd5b8151835114612c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bff9061527c565b60405180910390fd5b6000612c1261232c565b9050612c2381600087878787613204565b60005b8451811015612cdc57838181518110612c4257612c416145a3565b5b6020026020010151600080878481518110612c6057612c5f6145a3565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cc29190614b64565b925050819055508080612cd4906146c7565b915050612c26565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612d549291906153c0565b60405180910390a4612d6b8160008787878761320c565b612d7a816000878787876133fb565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de79061556d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ee19190613820565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f559061530e565b60405180910390fd5b6000612f6861232c565b90506000612f758561318a565b90506000612f828561318a565b9050612f92838989858589613204565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015613029576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613020906153a0565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130de9190614b64565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161315b929190613dde565b60405180910390a4613171848a8a86868a61320c565b61317f848a8a8a8a8a613214565b505050505050505050565b60606000600167ffffffffffffffff8111156131a9576131a86139d4565b5b6040519080825280602002602001820160405280156131d75781602001602082028036833780820191505090505b50905082816000815181106131ef576131ee6145a3565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b6132338473ffffffffffffffffffffffffffffffffffffffff16611c34565b156133f3578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016132799594939291906155e2565b602060405180830381600087803b15801561329357600080fd5b505af19250505080156132c457506040513d601f19601f820116820180604052508101906132c19190615651565b60015b61336a576132d061568b565b806308c379a0141561332d57506132e56156ad565b806132f0575061332f565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133249190613901565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613361906157b5565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146133f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e890615847565b60405180910390fd5b505b505050505050565b61341a8473ffffffffffffffffffffffffffffffffffffffff16611c34565b156135da578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613460959493929190615867565b602060405180830381600087803b15801561347a57600080fd5b505af19250505080156134ab57506040513d601f19601f820116820180604052508101906134a89190615651565b60015b613551576134b761568b565b806308c379a0141561351457506134cc6156ad565b806134d75750613516565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350b9190613901565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613548906157b5565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146135d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135cf90615847565b60405180910390fd5b505b505050505050565b6040518060600160405280600390602082028036833780820191505090505090565b828054828255906000526020600020908101928215613640579160200282015b8281111561363f578251825591602001919060010190613624565b5b50905061364d9190613651565b5090565b5b8082111561366a576000816000905550600101613652565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136ad82613682565b9050919050565b6136bd816136a2565b81146136c857600080fd5b50565b6000813590506136da816136b4565b92915050565b6000819050919050565b6136f3816136e0565b81146136fe57600080fd5b50565b600081359050613710816136ea565b92915050565b6000806040838503121561372d5761372c613678565b5b600061373b858286016136cb565b925050602061374c85828601613701565b9150509250929050565b61375f816136e0565b82525050565b600060208201905061377a6000830184613756565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137b581613780565b81146137c057600080fd5b50565b6000813590506137d2816137ac565b92915050565b6000602082840312156137ee576137ed613678565b5b60006137fc848285016137c3565b91505092915050565b60008115159050919050565b61381a81613805565b82525050565b60006020820190506138356000830184613811565b92915050565b60006020828403121561385157613850613678565b5b600061385f84828501613701565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138a2578082015181840152602081019050613887565b838111156138b1576000848401525b50505050565b6000601f19601f8301169050919050565b60006138d382613868565b6138dd8185613873565b93506138ed818560208601613884565b6138f6816138b7565b840191505092915050565b6000602082019050818103600083015261391b81846138c8565b905092915050565b61392c81613805565b811461393757600080fd5b50565b60008135905061394981613923565b92915050565b60006020828403121561396557613964613678565b5b60006139738482850161393a565b91505092915050565b600060a0820190506139916000830188613756565b61399e6020830187613756565b6139ab6040830186613756565b6139b86060830185613756565b6139c56080830184613756565b9695505050505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a0c826138b7565b810181811067ffffffffffffffff82111715613a2b57613a2a6139d4565b5b80604052505050565b6000613a3e61366e565b9050613a4a8282613a03565b919050565b600067ffffffffffffffff821115613a6a57613a696139d4565b5b602082029050602081019050919050565b600080fd5b6000613a93613a8e84613a4f565b613a34565b90508083825260208201905060208402830185811115613ab657613ab5613a7b565b5b835b81811015613adf5780613acb8882613701565b845260208401935050602081019050613ab8565b5050509392505050565b600082601f830112613afe57613afd6139cf565b5b8135613b0e848260208601613a80565b91505092915050565b60008060408385031215613b2e57613b2d613678565b5b600083013567ffffffffffffffff811115613b4c57613b4b61367d565b5b613b5885828601613ae9565b925050602083013567ffffffffffffffff811115613b7957613b7861367d565b5b613b8585828601613ae9565b9150509250929050565b600080600060608486031215613ba857613ba7613678565b5b6000613bb686828701613701565b935050602084013567ffffffffffffffff811115613bd757613bd661367d565b5b613be386828701613ae9565b925050604084013567ffffffffffffffff811115613c0457613c0361367d565b5b613c1086828701613ae9565b9150509250925092565b600080fd5b600067ffffffffffffffff821115613c3a57613c396139d4565b5b613c43826138b7565b9050602081019050919050565b82818337600083830152505050565b6000613c72613c6d84613c1f565b613a34565b905082815260208101848484011115613c8e57613c8d613c1a565b5b613c99848285613c50565b509392505050565b600082601f830112613cb657613cb56139cf565b5b8135613cc6848260208601613c5f565b91505092915050565b600080600080600060a08688031215613ceb57613cea613678565b5b6000613cf9888289016136cb565b9550506020613d0a888289016136cb565b945050604086013567ffffffffffffffff811115613d2b57613d2a61367d565b5b613d3788828901613ae9565b935050606086013567ffffffffffffffff811115613d5857613d5761367d565b5b613d6488828901613ae9565b925050608086013567ffffffffffffffff811115613d8557613d8461367d565b5b613d9188828901613ca1565b9150509295509295909350565b60008060408385031215613db557613db4613678565b5b6000613dc385828601613701565b9250506020613dd485828601613701565b9150509250929050565b6000604082019050613df36000830185613756565b613e006020830184613756565b9392505050565b600067ffffffffffffffff821115613e2257613e216139d4565b5b602082029050602081019050919050565b6000613e46613e4184613e07565b613a34565b90508083825260208201905060208402830185811115613e6957613e68613a7b565b5b835b81811015613e925780613e7e88826136cb565b845260208401935050602081019050613e6b565b5050509392505050565b600082601f830112613eb157613eb06139cf565b5b8135613ec1848260208601613e33565b91505092915050565b60008060408385031215613ee157613ee0613678565b5b600083013567ffffffffffffffff811115613eff57613efe61367d565b5b613f0b85828601613e9c565b925050602083013567ffffffffffffffff811115613f2c57613f2b61367d565b5b613f3885828601613ae9565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f77816136e0565b82525050565b6000613f898383613f6e565b60208301905092915050565b6000602082019050919050565b6000613fad82613f42565b613fb78185613f4d565b9350613fc283613f5e565b8060005b83811015613ff3578151613fda8882613f7d565b9750613fe583613f95565b925050600181019050613fc6565b5085935050505092915050565b6000602082019050818103600083015261401a8184613fa2565b905092915050565b600060039050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b61405881614022565b614062818461402d565b925061406d82614038565b8060005b8381101561409e5781516140858782613f7d565b965061409083614042565b925050600181019050614071565b505050505050565b60006060820190506140bb600083018461404f565b92915050565b6140ca816136a2565b82525050565b60006020820190506140e560008301846140c1565b92915050565b6000806040838503121561410257614101613678565b5b6000614110858286016136cb565b92505060206141218582860161393a565b9150509250929050565b600067ffffffffffffffff821115614146576141456139d4565b5b602082029050919050565b600061416461415f8461412b565b613a34565b9050806020840283018581111561417e5761417d613a7b565b5b835b818110156141a757806141938882613701565b845260208401935050602081019050614180565b5050509392505050565b600082601f8301126141c6576141c56139cf565b5b600f6141d3848285614151565b91505092915050565b60008061020083850312156141f4576141f3613678565b5b600061420285828601613701565b9250506020614213858286016141b1565b9150509250929050565b6000806040838503121561423457614233613678565b5b6000614242858286016136cb565b9250506020614253858286016136cb565b9150509250929050565b600080600080600060a0868803121561427957614278613678565b5b6000614287888289016136cb565b9550506020614298888289016136cb565b94505060406142a988828901613701565b93505060606142ba88828901613701565b925050608086013567ffffffffffffffff8111156142db576142da61367d565b5b6142e788828901613ca1565b9150509295509295909350565b60006020828403121561430a57614309613678565b5b6000614318848285016136cb565b91505092915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b600061437d602a83613873565b915061438882614321565b604082019050919050565b600060208201905081810360008301526143ac81614370565b9050919050565b600081905092915050565b60006143c982613868565b6143d381856143b3565b93506143e3818560208601613884565b80840191505092915050565b60006143fb82856143be565b915061440782846143be565b91508190509392505050565b7f43616e6e6f742073746172742073616c65207768696c6520616374697661746960008201527f6f6e732061726520656e61626c65640000000000000000000000000000000000602082015250565b600061446f602f83613873565b915061447a82614413565b604082019050919050565b6000602082019050818103600083015261449e81614462565b9050919050565b7f4372616674696e672069732064697361626c6564000000000000000000000000600082015250565b60006144db601483613873565b91506144e6826144a5565b602082019050919050565b6000602082019050818103600083015261450a816144ce565b9050919050565b7f4d75737420626520657175616c206e756d626572206f6620617274696661637460008201527f7320616e6420616d6f756e747300000000000000000000000000000000000000602082015250565b600061456d602d83613873565b915061457882614511565b604082019050919050565b6000602082019050818103600083015261459c81614560565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c6964206372616674696e6720726563697065000000000000000000600082015250565b6000614608601783613873565b9150614613826145d2565b602082019050919050565b60006020820190508181036000830152614637816145fb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614678826136e0565b9150614683836136e0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146bc576146bb61463e565b5b828202905092915050565b60006146d2826136e0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147055761470461463e565b5b600182019050919050565b600060608201905061472560008301866140c1565b81810360208301526147378185613fa2565b9050818103604083015261474b8184613fa2565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b60006147e0602f83613873565b91506147eb82614784565b604082019050919050565b6000602082019050818103600083015261480f816147d3565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614872602983613873565b915061487d82614816565b604082019050919050565b600060208201905081810360008301526148a181614865565b9050919050565b60006148b3826136e0565b91506148be836136e0565b9250828210156148d1576148d061463e565b5b828203905092915050565b600081905092915050565b50565b60006148f76000836148dc565b9150614902826148e7565b600082019050919050565b6000614918826148ea565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b6000614958601483613873565b915061496382614922565b602082019050919050565b600060208201905081810360008301526149878161494b565b9050919050565b7f43616e6e6f74206f70656e2076696120736d61727420636f6e74726163740000600082015250565b60006149c4601e83613873565b91506149cf8261498e565b602082019050919050565b600060208201905081810360008301526149f3816149b7565b9050919050565b7f546965727320616e6420616d6f756e7473206c656e677468206d757374206d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b6000614a56602383613873565b9150614a61826149fa565b604082019050919050565b60006020820190508181036000830152614a8581614a49565b9050919050565b7f53616c652069732064697361626c656400000000000000000000000000000000600082015250565b6000614ac2601083613873565b9150614acd82614a8c565b602082019050919050565b60006020820190508181036000830152614af181614ab5565b9050919050565b7f4d696e7420616d6f756e742065786365656473206c696d697400000000000000600082015250565b6000614b2e601983613873565b9150614b3982614af8565b602082019050919050565b60006020820190508181036000830152614b5d81614b21565b9050919050565b6000614b6f826136e0565b9150614b7a836136e0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614baf57614bae61463e565b5b828201905092915050565b7f4d696e7420616d6f756e7420776f756c6420657863656564206d61782073757060008201527f706c790000000000000000000000000000000000000000000000000000000000602082015250565b6000614c16602383613873565b9150614c2182614bba565b604082019050919050565b60006020820190508181036000830152614c4581614c09565b9050919050565b600081519050614c5b816136ea565b92915050565b600060208284031215614c7757614c76613678565b5b6000614c8584828501614c4c565b91505092915050565b7f4e6f7420656e6f75676820746f7563616e7320696e2077616c6c657400000000600082015250565b6000614cc4601c83613873565b9150614ccf82614c8e565b602082019050919050565b60006020820190508181036000830152614cf381614cb7565b9050919050565b7f496e76616c696420455448207061796d656e742073656e740000000000000000600082015250565b6000614d30601883613873565b9150614d3b82614cfa565b602082019050919050565b60006020820190508181036000830152614d5f81614d23565b9050919050565b7f49447320616e6420616d6f756e7473206c656e677468206d757374206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000614dc2602183613873565b9150614dcd82614d66565b604082019050919050565b60006020820190508181036000830152614df181614db5565b9050919050565b7f496e76616c696420617274696661637420494400000000000000000000000000600082015250565b6000614e2e601383613873565b9150614e3982614df8565b602082019050919050565b60006020820190508181036000830152614e5d81614e21565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ec0602683613873565b9150614ecb82614e64565b604082019050919050565b60006020820190508181036000830152614eef81614eb3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f3d57607f821691505b60208210811415614f5157614f50614ef6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f91826136e0565b9150614f9c836136e0565b925082614fac57614fab614f57565b5b828204905092915050565b6000614fc2826136e0565b9150614fcd836136e0565b925082614fdd57614fdc614f57565b5b828206905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061501e602083613873565b915061502982614fe8565b602082019050919050565b6000602082019050818103600083015261504d81615011565b9050919050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006150b0602383613873565b91506150bb82615054565b604082019050919050565b600060208201905081810360008301526150df816150a3565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000615142602483613873565b915061514d826150e6565b604082019050919050565b6000602082019050818103600083015261517181615135565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006151d4602183613873565b91506151df82615178565b604082019050919050565b60006020820190508181036000830152615203816151c7565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000615266602883613873565b91506152718261520a565b604082019050919050565b6000602082019050818103600083015261529581615259565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006152f8602583613873565b91506153038261529c565b604082019050919050565b60006020820190508181036000830152615327816152eb565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b600061538a602a83613873565b91506153958261532e565b604082019050919050565b600060208201905081810360008301526153b98161537d565b9050919050565b600060408201905081810360008301526153da8185613fa2565b905081810360208301526153ee8184613fa2565b90509392505050565b60008160601b9050919050565b600061540f826153f7565b9050919050565b600061542182615404565b9050919050565b615439615434826136a2565b615416565b82525050565b6000819050919050565b61545a615455826136e0565b61543f565b82525050565b6000819050919050565b6000819050919050565b61548561548082615460565b61546a565b82525050565b60006154978289615428565b6014820191506154a78288615449565b6020820191506154b78287615449565b6020820191506154c78286615449565b6020820191506154d78285615449565b6020820191506154e78284615474565b602082019150819050979650505050505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615557602983613873565b9150615562826154fb565b604082019050919050565b600060208201905081810360008301526155868161554a565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006155b48261558d565b6155be8185615598565b93506155ce818560208601613884565b6155d7816138b7565b840191505092915050565b600060a0820190506155f760008301886140c1565b61560460208301876140c1565b6156116040830186613756565b61561e6060830185613756565b818103608083015261563081846155a9565b90509695505050505050565b60008151905061564b816137ac565b92915050565b60006020828403121561566757615666613678565b5b60006156758482850161563c565b91505092915050565b60008160e01c9050919050565b600060033d11156156aa5760046000803e6156a760005161567e565b90505b90565b600060443d10156156bd57615740565b6156c561366e565b60043d036004823e80513d602482011167ffffffffffffffff821117156156ed575050615740565b808201805167ffffffffffffffff81111561570b5750505050615740565b80602083010160043d038501811115615728575050505050615740565b61573782602001850186613a03565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600061579f603483613873565b91506157aa82615743565b604082019050919050565b600060208201905081810360008301526157ce81615792565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615831602883613873565b915061583c826157d5565b604082019050919050565b6000602082019050818103600083015261586081615824565b9050919050565b600060a08201905061587c60008301886140c1565b61588960208301876140c1565b818103604083015261589b8186613fa2565b905081810360608301526158af8185613fa2565b905081810360808301526158c381846155a9565b9050969550505050505056fea2646970667358221220c8532b95f0619d57f842dc55d8f73a7b99bb8b4b67a1297e79bad9559aa50a5464736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000220000000000000000000000000642ffab2752df3bce97083709f36080fb1482c8000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000038d7ea4c680000000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000004e20000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000002368747470733a2f2f7368656c6c70726f746f636f6c2e696f2f6170692f626f6f74792f0000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _uri (string): https://shellprotocol.io/api/booty/
Arg [1] : _toucans (address): 0x642FfAb2752Df3BCE97083709F36080fb1482c80
Arg [2] : cratePrice (uint256[3]): 1000000000000000,1000000000000000,1000000000000000
Arg [3] : initialMints (uint256[3]): 50,30,20
Arg [4] : maxSupply (uint256[3]): 20000,10000,5000
Arg [5] : maxMint (uint256[3]): 20,10,5
Arg [6] : minToucan (uint256[3]): 0,1,3
-----Encoded View---------------
20 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [1] : 000000000000000000000000642ffab2752df3bce97083709f36080fb1482c80
Arg [2] : 00000000000000000000000000000000000000000000000000038d7ea4c68000
Arg [3] : 00000000000000000000000000000000000000000000000000038d7ea4c68000
Arg [4] : 00000000000000000000000000000000000000000000000000038d7ea4c68000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [6] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [8] : 0000000000000000000000000000000000000000000000000000000000004e20
Arg [9] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [10] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [12] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [18] : 68747470733a2f2f7368656c6c70726f746f636f6c2e696f2f6170692f626f6f
Arg [19] : 74792f0000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.