Beanz
Deploy on AlchemyContract Information
Explore the source code, ABI, and bytecode for the Beanz smart contract.
More Info
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import './MultisigOwnable.sol';
import 'erc721a/contracts/ERC721A.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/utils/Address.sol';
import '@chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol';
import '@chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol';
import '@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol';
error BeanCannotBeClaimed();
error ClaimWindowNotOpen();
error MismatchedTokenOwner();
error MaxSupplyReached();
error TokenAlreadyWon();
error AddressAlreadyWonOrOwner();
error RaffleWinnerIsContract();
error ChunkHasBeenAirdropped();
error AzukiNotOwnedLongEnough();
error InvalidChunk();
interface Azuki {
struct TokenOwnership {
address addr;
uint64 startTimestamp;
}
function getOwnershipData(uint256 tokenId)
external
view
returns (TokenOwnership memory);
}
contract Beanz is ERC721A, MultisigOwnable, VRFConsumerBaseV2 {
using Address for address;
event RaffleWinner(
uint256 winningTokenId,
address winningAddress,
uint256 newTokenId
);
uint256 public immutable maxSupply;
uint256 public constant BATCH_SIZE = 6;
uint256 public constant MIN_OWNERSHIP_TIME_FOR_CLAIM = 120;
struct ClaimWindow {
uint128 startTime;
uint128 endTime;
}
ClaimWindow public claimWindow;
Azuki public immutable azuki;
// Keys are azuki token ids
mapping(uint256 => bool) public azukiCanClaim;
// Keys are this collection's ids
mapping(uint256 => bool) public tokenHasWonRaffle;
mapping(address => bool) public winningAddresses;
mapping(uint256 => bool) processedChunksForAirdrop;
string private _baseTokenURI;
// Chainlink Settings
VRFCoordinatorV2Interface COORDINATOR;
LinkTokenInterface LINKTOKEN;
struct CLRequestConfig {
bytes32 keyHash;
uint64 subscriptionId;
uint16 requestConfirmations;
uint32 callbackGasLimit;
}
CLRequestConfig public clRequestConfig;
constructor(
address _azukiAddress,
uint256 _maxSupply,
address _vrfCoordinator,
address _linkToken,
string memory initialName,
string memory initialSymbol
) ERC721A('Beanz', 'BEANZ') VRFConsumerBaseV2(_vrfCoordinator) {
azuki = Azuki(_azukiAddress);
maxSupply = _maxSupply;
COORDINATOR = VRFCoordinatorV2Interface(_vrfCoordinator);
LINKTOKEN = LinkTokenInterface(_linkToken);
_nameOverride = initialName;
_symbolOverride = initialSymbol;
}
function airdrop(
address[] calldata receivers,
uint256[] calldata numAzukiTokens,
uint256 chunkNum
) external onlyRealOwner {
if (processedChunksForAirdrop[chunkNum] || balanceOf(receivers[0]) > 0) {
revert ChunkHasBeenAirdropped();
}
if (receivers.length != numAzukiTokens.length) {
revert InvalidChunk();
}
for (uint256 i; i < receivers.length; ++i) {
_mintWrapper(receivers[i], numAzukiTokens[i]);
}
processedChunksForAirdrop[chunkNum] = true;
}
// Used to claim unclaimed tokens after airdrop/claim phase
function devClaim(uint256 numAzukiTokens) external onlyRealOwner {
_mintWrapper(msg.sender, numAzukiTokens);
}
function claim(uint256[] calldata azukiTokenIds) external {
ClaimWindow memory window = claimWindow;
uint256 curTime = block.timestamp;
if (
curTime < uint256(window.startTime) || curTime > uint256(window.endTime)
) {
revert ClaimWindowNotOpen();
}
for (uint256 i; i < azukiTokenIds.length; ++i) {
uint256 azukiId = azukiTokenIds[i];
Azuki.TokenOwnership memory tokenOwnership = azuki.getOwnershipData(
azukiId
);
address tokenOwner = tokenOwnership.addr;
if (tokenOwner != msg.sender) revert MismatchedTokenOwner();
if (!azukiCanClaim[azukiId]) revert BeanCannotBeClaimed();
uint256 ownershipStart = uint256(tokenOwnership.startTimestamp);
// Prevent flash loans
if (block.timestamp - ownershipStart < MIN_OWNERSHIP_TIME_FOR_CLAIM) {
revert AzukiNotOwnedLongEnough();
}
azukiCanClaim[azukiId] = false;
}
_mintWrapper(msg.sender, azukiTokenIds.length);
}
function _mintWrapper(address to, uint256 numAzukiTokens) internal {
uint256 numToMint = numAzukiTokens * 2;
if (totalSupply() + numToMint > maxSupply) {
revert MaxSupplyReached();
}
uint256 numBatches = numToMint / BATCH_SIZE;
for (uint256 i; i < numBatches; ++i) {
_mint(to, BATCH_SIZE, '', true);
}
if (numToMint % BATCH_SIZE > 0) {
_mint(to, numToMint % BATCH_SIZE, '', true);
}
}
function requestRaffleWinner() external onlyRealOwner returns (uint256) {
if (totalSupply() + 1 > maxSupply) {
revert MaxSupplyReached();
}
CLRequestConfig memory rc = clRequestConfig;
uint256 requestId = COORDINATOR.requestRandomWords(
rc.keyHash,
rc.subscriptionId,
rc.requestConfirmations,
rc.callbackGasLimit,
uint32(1)
);
return requestId;
}
function fulfillRandomWords(
uint256, /* requestId */
uint256[] memory randomWords
) internal override {
// Use the random value from Chainlink
uint256 winningTokenId = randomWords[0] % _totalMinted();
if (tokenHasWonRaffle[winningTokenId]) {
revert TokenAlreadyWon();
}
address winningAddress = ownerOf(winningTokenId);
if (winningAddress == owner() || winningAddresses[winningAddress]) {
revert AddressAlreadyWonOrOwner();
} else if (winningAddress.isContract()) {
revert RaffleWinnerIsContract();
}
tokenHasWonRaffle[winningTokenId] = true;
winningAddresses[winningAddress] = true;
// Send new token to winner and mark their token/address as won
if (totalSupply() + 1 > maxSupply) {
revert MaxSupplyReached();
}
_mint(winningAddress, 1, '', false);
// The winner is the last index which needs to be marked as invalid for the raffle
uint256 newTokenId = _totalMinted() - 1;
tokenHasWonRaffle[newTokenId] = true;
emit RaffleWinner(winningTokenId, winningAddress, newTokenId);
}
function setClRequestConfig(
bytes32 _keyHash,
uint64 _subscriptionId,
uint16 _requestConfirmations,
uint32 _callbackGasLimit
) external onlyRealOwner {
clRequestConfig.keyHash = _keyHash;
clRequestConfig.subscriptionId = _subscriptionId;
clRequestConfig.requestConfirmations = _requestConfirmations;
clRequestConfig.callbackGasLimit = _callbackGasLimit;
}
function setClaimWindow(uint128 _startTime, uint128 _endTime)
external
onlyRealOwner
{
claimWindow.startTime = _startTime;
claimWindow.endTime = _endTime;
}
function setCanClaim(uint256[] calldata azukiIds) external onlyRealOwner {
for (uint256 i; i < azukiIds.length; ++i) {
azukiCanClaim[azukiIds[i]] = true;
}
}
function _baseURI() internal view virtual override returns (string memory) {
return _baseTokenURI;
}
function setBaseURI(string calldata baseURI) external onlyOwner {
_baseTokenURI = baseURI;
}
string private _nameOverride;
string private _symbolOverride;
function name() public view override returns (string memory) {
if (bytes(_nameOverride).length == 0) {
return ERC721A.name();
}
return _nameOverride;
}
function symbol() public view override returns (string memory) {
if (bytes(_symbolOverride).length == 0) {
return ERC721A.symbol();
}
return _symbolOverride;
}
function setNameAndSymbol(
string calldata _newName,
string calldata _newSymbol
) external onlyRealOwner {
_nameOverride = _newName;
_symbolOverride = _newSymbol;
}
}
[{"inputs":[{"internalType":"address","name":"_azukiAddress","type":"address"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"address","name":"_vrfCoordinator","type":"address"},{"internalType":"address","name":"_linkToken","type":"address"},{"internalType":"string","name":"initialName","type":"string"},{"internalType":"string","name":"initialSymbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressAlreadyWonOrOwner","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"AzukiNotOwnedLongEnough","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"BeanCannotBeClaimed","type":"error"},{"inputs":[],"name":"ChunkHasBeenAirdropped","type":"error"},{"inputs":[],"name":"ClaimWindowNotOpen","type":"error"},{"inputs":[],"name":"InvalidChunk","type":"error"},{"inputs":[],"name":"MaxSupplyReached","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MismatchedTokenOwner","type":"error"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"RaffleWinnerIsContract","type":"error"},{"inputs":[],"name":"TokenAlreadyWon","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"winningTokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"winningAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"newTokenId","type":"uint256"}],"name":"RaffleWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BATCH_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_OWNERSHIP_TIME_FOR_CLAIM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"numAzukiTokens","type":"uint256[]"},{"internalType":"uint256","name":"chunkNum","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"azuki","outputs":[{"internalType":"contract Azuki","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"azukiCanClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clRequestConfig","outputs":[{"internalType":"bytes32","name":"keyHash","type":"bytes32"},{"internalType":"uint64","name":"subscriptionId","type":"uint64"},{"internalType":"uint16","name":"requestConfirmations","type":"uint16"},{"internalType":"uint32","name":"callbackGasLimit","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"azukiTokenIds","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimWindow","outputs":[{"internalType":"uint128","name":"startTime","type":"uint128"},{"internalType":"uint128","name":"endTime","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numAzukiTokens","type":"uint256"}],"name":"devClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"realOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestRaffleWinner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"azukiIds","type":"uint256[]"}],"name":"setCanClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_keyHash","type":"bytes32"},{"internalType":"uint64","name":"_subscriptionId","type":"uint64"},{"internalType":"uint16","name":"_requestConfirmations","type":"uint16"},{"internalType":"uint32","name":"_callbackGasLimit","type":"uint32"}],"name":"setClRequestConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_startTime","type":"uint128"},{"internalType":"uint128","name":"_endTime","type":"uint128"}],"name":"setClaimWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newName","type":"string"},{"internalType":"string","name":"_newSymbol","type":"string"}],"name":"setNameAndSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenHasWonRaffle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferLowerOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRealOwner","type":"address"}],"name":"transferRealOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"winningAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
[{"inputs":[{"internalType":"address","name":"_azukiAddress","type":"address"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"address","name":"_vrfCoordinator","type":"address"},{"internalType":"address","name":"_linkToken","type":"address"},{"internalType":"string","name":"initialName","type":"string"},{"internalType":"string","name":"initialSymbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressAlreadyWonOrOwner","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"AzukiNotOwnedLongEnough","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"BeanCannotBeClaimed","type":"error"},{"inputs":[],"name":"ChunkHasBeenAirdropped","type":"error"},{"inputs":[],"name":"ClaimWindowNotOpen","type":"error"},{"inputs":[],"name":"InvalidChunk","type":"error"},{"inputs":[],"name":"MaxSupplyReached","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MismatchedTokenOwner","type":"error"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"RaffleWinnerIsContract","type":"error"},{"inputs":[],"name":"TokenAlreadyWon","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"winningTokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"winningAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"newTokenId","type":"uint256"}],"name":"RaffleWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BATCH_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_OWNERSHIP_TIME_FOR_CLAIM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"numAzukiTokens","type":"uint256[]"},{"internalType":"uint256","name":"chunkNum","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"azuki","outputs":[{"internalType":"contract Azuki","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"azukiCanClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clRequestConfig","outputs":[{"internalType":"bytes32","name":"keyHash","type":"bytes32"},{"internalType":"uint64","name":"subscriptionId","type":"uint64"},{"internalType":"uint16","name":"requestConfirmations","type":"uint16"},{"internalType":"uint32","name":"callbackGasLimit","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"azukiTokenIds","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimWindow","outputs":[{"internalType":"uint128","name":"startTime","type":"uint128"},{"internalType":"uint128","name":"endTime","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numAzukiTokens","type":"uint256"}],"name":"devClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"realOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestRaffleWinner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"azukiIds","type":"uint256[]"}],"name":"setCanClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_keyHash","type":"bytes32"},{"internalType":"uint64","name":"_subscriptionId","type":"uint64"},{"internalType":"uint16","name":"_requestConfirmations","type":"uint16"},{"internalType":"uint32","name":"_callbackGasLimit","type":"uint32"}],"name":"setClRequestConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_startTime","type":"uint128"},{"internalType":"uint128","name":"_endTime","type":"uint128"}],"name":"setClaimWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newName","type":"string"},{"internalType":"string","name":"_newSymbol","type":"string"}],"name":"setNameAndSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenHasWonRaffle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferLowerOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRealOwner","type":"address"}],"name":"transferRealOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"winningAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
60e06040523480156200001157600080fd5b5060405162002c2d38038062002c2d83398101604081905262000034916200030e565b83604051806040016040528060058152602001642132b0b73d60d91b815250604051806040016040528060058152602001642122a0a72d60d91b81525081600290805190602001906200008992919062000198565b5080516200009f90600390602084019062000198565b50506000805550620000b13362000146565b60098054336001600160a01b031991821617909155606091821b6001600160601b03199081166080529188901b90911660c05260a08690526010805482166001600160a01b03878116919091179091556011805490921690851617905581516200012390601490602085019062000198565b5080516200013990601590602084019062000198565b5050505050505062000409565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001a690620003b6565b90600052602060002090601f016020900481019282620001ca576000855562000215565b82601f10620001e557805160ff191683800117855562000215565b8280016001018555821562000215579182015b8281111562000215578251825591602001919060010190620001f8565b506200022392915062000227565b5090565b5b8082111562000223576000815560010162000228565b80516001600160a01b03811681146200025657600080fd5b919050565b600082601f8301126200026c578081fd5b81516001600160401b0380821115620002895762000289620003f3565b604051601f8301601f19908116603f01168101908282118183101715620002b457620002b4620003f3565b81604052838152602092508683858801011115620002d0578485fd5b8491505b83821015620002f35785820183015181830184015290820190620002d4565b838211156200030457848385830101525b9695505050505050565b60008060008060008060c0878903121562000327578182fd5b62000332876200023e565b95506020870151945062000349604088016200023e565b935062000359606088016200023e565b60808801519093506001600160401b038082111562000376578384fd5b620003848a838b016200025b565b935060a08901519150808211156200039a578283fd5b50620003a989828a016200025b565b9150509295509295509295565b600181811c90821680620003cb57607f821691505b60208210811415620003ed57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160c05160601c6127cb62000462600039600081816104b80152610da10152600081816105b5015281816108f3015281816115530152611854015260008181610a450152610a8701526127cb6000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c80635a4462151161013b5780638da5cb5b116100b8578063c5d37ae11161007c578063c5d37ae11461055f578063c87b56dd1461059d578063d5abeb01146105b0578063e985e9c5146105d7578063f2fde38b1461061357600080fd5b80638da5cb5b146104fd57806395d89b411461050e5780639fd6afe314610516578063a22cb46514610539578063b88d4fde1461054c57600080fd5b806370a08231116100ff57806370a0823114610485578063715018a614610498578063731186eb146104a0578063738ca607146104b357806381a4cd00146104da57600080fd5b80635a446215146104165780635c7d9251146104295780636352211e1461043c5780636819bec51461044f5780636ba4c1381461047257600080fd5b80631fe543e3116101c957806342842e0e1161018d57806342842e0e1461036a57806349faa4d41461037d5780634b9796291461038557806354f0168f1461039857806355f804b31461040357600080fd5b80631fe543e31461031657806323b872dd146103295780632cff67701461033c57806333d66b5b1461034f578063412583df1461036257600080fd5b806309af3f9a1161021057806309af3f9a146102bf578063172801ac146102d257806318160ddd146102e55780631c4f5150146102fb5780631df270f31461030357600080fd5b806301ffc9a71461024257806306fdde031461026a578063081812fc1461027f578063095ea7b3146102aa575b600080fd5b6102556102503660046122a9565b610626565b60405190151581526020015b60405180910390f35b610272610678565b6040516102619190612589565b61029261028d36600461240e565b61072c565b6040516001600160a01b039091168152602001610261565b6102bd6102b836600461216d565b610770565b005b6102bd6102cd366004611fec565b6107fe565b6102bd6102e0366004612249565b61083d565b600154600054035b604051908152602001610261565b6102ed6108c4565b600954610292906001600160a01b031681565b6102bd61032436600461243e565b610a3a565b6102bd610337366004612040565b610ac2565b6102bd61034a366004611fec565b610acd565b6102bd61035d366004612209565b610b19565b6102ed607881565b6102bd610378366004612040565b610bb1565b6102ed600681565b6102bd6103933660046123dc565b610bcc565b6012546013546103cb919067ffffffffffffffff811690600160401b810461ffff1690600160501b900463ffffffff1684565b6040805194855267ffffffffffffffff909316602085015261ffff9091169183019190915263ffffffff166060820152608001610261565b6102bd6104113660046122e1565b610c0f565b6102bd610424366004612315565b610c75565b6102bd61043736600461240e565b610cbf565b61029261044a36600461240e565b610cf3565b61025561045d366004611fec565b600d6020526000908152604090205460ff1681565b6102bd610480366004612209565b610d05565b6102ed610493366004611fec565b610f0d565b6102bd610f5c565b6102bd6104ae366004612198565b610fc2565b6102927f000000000000000000000000000000000000000000000000000000000000000081565b6102556104e836600461240e565b600b6020526000908152604090205460ff1681565b6008546001600160a01b0316610292565b61027261111d565b61025561052436600461240e565b600c6020526000908152604090205460ff1681565b6102bd61054736600461213c565b611149565b6102bd61055a366004612080565b6111df565b600a5461057d906001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610261565b6102726105ab36600461240e565b61122a565b6102ed7f000000000000000000000000000000000000000000000000000000000000000081565b6102556105e5366004612008565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6102bd610621366004611fec565b6112af565b60006001600160e01b031982166380ac58cd60e01b148061065757506001600160e01b03198216635b5e139f60e01b145b8061067257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060148054610687906126a8565b1515905061069c57610697611377565b905090565b601480546106a9906126a8565b80601f01602080910402602001604051908101604052809291908181526020018280546106d5906126a8565b80156107225780601f106106f757610100808354040283529160200191610722565b820191906000526020600020905b81548152906001019060200180831161070557829003601f168201915b5050505050905090565b600061073782611386565b610754576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061077b82610cf3565b9050806001600160a01b0316836001600160a01b031614156107b05760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906107d057506107ce81336105e5565b155b156107ee576040516367d9dca160e11b815260040160405180910390fd5b6107f98383836113b1565b505050565b6009546001600160a01b031633146108315760405162461bcd60e51b81526004016108289061259c565b60405180910390fd5b61083a816112af565b50565b6009546001600160a01b031633146108675760405162461bcd60e51b81526004016108289061259c565b6012939093556013805463ffffffff909416600160501b026dffffffff000000000000000000001961ffff909316600160401b0269ffffffffffffffffffff1990951667ffffffffffffffff909416939093179390931716179055565b6009546000906001600160a01b031633146108f15760405162461bcd60e51b81526004016108289061259c565b7f000000000000000000000000000000000000000000000000000000000000000061091f6001546000540390565b61092a90600161261a565b11156109495760405163d05cb60960e01b815260040160405180910390fd5b6040805160808101825260125480825260135467ffffffffffffffff811660208401819052600160401b820461ffff16848601819052600160501b90920463ffffffff166060850181905260105495516305d3b1d360e41b815260048101949094526024840191909152604483019190915260648201526001608482015290916000916001600160a01b0390911690635d3b1d309060a401602060405180830381600087803b1580156109fb57600080fd5b505af1158015610a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a339190612426565b9250505090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ab45760405163073e64fd60e21b81523360048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610828565b610abe828261140d565b5050565b6107f9838383611656565b6009546001600160a01b03163314610af75760405162461bcd60e51b81526004016108289061259c565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b03163314610b435760405162461bcd60e51b81526004016108289061259c565b60005b818110156107f9576001600b6000858585818110610b7457634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555080610baa906126e3565b9050610b46565b6107f9838383604051806020016040528060008152506111df565b6009546001600160a01b03163314610bf65760405162461bcd60e51b81526004016108289061259c565b6001600160801b03908116600160801b02911617600a55565b6008546001600160a01b03163314610c695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610828565b6107f9600f8383611ead565b6009546001600160a01b03163314610c9f5760405162461bcd60e51b81526004016108289061259c565b610cab60148585611ead565b50610cb860158383611ead565b5050505050565b6009546001600160a01b03163314610ce95760405162461bcd60e51b81526004016108289061259c565b61083a3382611843565b6000610cfe8261192b565b5192915050565b60408051808201909152600a546001600160801b03808216808452600160801b9092041660208301524290811080610d49575081602001516001600160801b031681115b15610d67576040516309ca1d3560e11b815260040160405180910390fd5b60005b83811015610efc576000858583818110610d9457634e487b7160e01b600052603260045260246000fd5b90506020020135905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639231ab2a836040518263ffffffff1660e01b8152600401610ded91815260200190565b604080518083038186803b158015610e0457600080fd5b505afa158015610e18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3c919061237e565b80519091506001600160a01b0381163314610e6a57604051631a48ea6960e21b815260040160405180910390fd5b6000838152600b602052604090205460ff16610e9957604051635366f67d60e11b815260040160405180910390fd5b602082015167ffffffffffffffff166078610eb48242612665565b1015610ed35760405163621e39d960e11b815260040160405180910390fd5b5050506000908152600b60205260409020805460ff19169055610ef5816126e3565b9050610d6a565b50610f073384611843565b50505050565b60006001600160a01b038216610f36576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610fb65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610828565b610fc06000611a47565b565b6009546001600160a01b03163314610fec5760405162461bcd60e51b81526004016108289061259c565b6000818152600e602052604090205460ff16806110415750600061103f8686600081811061102a57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906104939190611fec565b115b1561105f5760405163046a2bfb60e01b815260040160405180910390fd5b83821461107e576040516222e42d60e41b815260040160405180910390fd5b60005b848110156110fd576110ed8686838181106110ac57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110c19190611fec565b8585848181106110e157634e487b7160e01b600052603260045260246000fd5b90506020020135611843565b6110f6816126e3565b9050611081565b506000908152600e60205260409020805460ff1916600117905550505050565b60606015805461112c906126a8565b1515905061113c57610697611a99565b601580546106a9906126a8565b6001600160a01b0382163314156111735760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111ea848484611656565b6001600160a01b0383163b1515801561120c575061120a84848484611aa8565b155b15610f07576040516368d2bf6b60e11b815260040160405180910390fd5b606061123582611386565b61125257604051630a14c4b560e41b815260040160405180910390fd5b600061125c611ba0565b905080516000141561127d57604051806020016040528060008152506112a8565b8061128784611baf565b60405160200161129892919061251e565b6040516020818303038152906040525b9392505050565b6008546001600160a01b031633146113095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610828565b6001600160a01b03811661136e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610828565b61083a81611a47565b6060600280546106a9906126a8565b6000805482108015610672575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600080548260008151811061143257634e487b7160e01b600052603260045260246000fd5b602002602001015161144491906126fe565b6000818152600c602052604090205490915060ff16156114775760405163ae2122df60e01b815260040160405180910390fd5b600061148282610cf3565b90506114966008546001600160a01b031690565b6001600160a01b0316816001600160a01b031614806114cd57506001600160a01b0381166000908152600d602052604090205460ff165b156114eb576040516332c03f9760e21b815260040160405180910390fd5b6001600160a01b0381163b1561151457604051636b17d49b60e11b815260040160405180910390fd5b6000828152600c602090815260408083208054600160ff1991821681179092556001600160a01b0386168552600d9093529220805490911690911790557f000000000000000000000000000000000000000000000000000000000000000061157f6001546000540390565b61158a90600161261a565b11156115a95760405163d05cb60960e01b815260040160405180910390fd5b6115c6816001604051806020016040528060008152506000611ce1565b600060016115d360005490565b6115dd9190612665565b6000818152600c602052604090819020805460ff19166001179055519091507fb7f339c4a7aad4a1b47704005283a1a2cdec75bbd915bf5522652e90e98055f490611647908590859085909283526001600160a01b03919091166020830152604082015260600190565b60405180910390a15050505050565b60006116618261192b565b9050836001600160a01b031681600001516001600160a01b0316146116985760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806116b657506116b685336105e5565b806116d15750336116c68461072c565b6001600160a01b0316145b9050806116f157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661171857604051633a954ecd60e21b815260040160405180910390fd5b611724600084876113b1565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166117fa5760005482146117fa578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610cb8565b6000611850826002612646565b90507f0000000000000000000000000000000000000000000000000000000000000000816118816001546000540390565b61188b919061261a565b11156118aa5760405163d05cb60960e01b815260040160405180910390fd5b60006118b7600683612632565b905060005b818110156118f1576118e1856006604051806020016040528060008152506001611ce1565b6118ea816126e3565b90506118bc565b5060006118ff6006846126fe565b1115610f0757610f07846119146006856126fe565b604051806020016040528060008152506001611ce1565b604080516060810182526000808252602082018190529181019190915281600054811015611a2e57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290611a2c5780516001600160a01b0316156119c2579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611a27579392505050565b6119c2565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600380546106a9906126a8565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611add90339089908890889060040161254d565b602060405180830381600087803b158015611af757600080fd5b505af1925050508015611b27575060408051601f3d908101601f19168201909252611b24918101906122c5565b60015b611b82573d808015611b55576040519150601f19603f3d011682016040523d82523d6000602084013e611b5a565b606091505b508051611b7a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600f80546106a9906126a8565b606081611bd35750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611bfd5780611be7816126e3565b9150611bf69050600a83612632565b9150611bd7565b60008167ffffffffffffffff811115611c2657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c50576020820181803683370190505b5090505b8415611b9857611c65600183612665565b9150611c72600a866126fe565b611c7d90603061261a565b60f81b818381518110611ca057634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611cda600a86612632565b9450611c54565b6000546001600160a01b038516611d0a57604051622e076360e81b815260040160405180910390fd5b83611d285760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611dd557506001600160a01b0387163b15155b15611e5e575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611e266000888480600101955088611aa8565b611e43576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611ddb578260005414611e5957600080fd5b611ea4565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611e5f575b50600055610cb8565b828054611eb9906126a8565b90600052602060002090601f016020900481019282611edb5760008555611f21565b82601f10611ef45782800160ff19823516178555611f21565b82800160010185558215611f21579182015b82811115611f21578235825591602001919060010190611f06565b50611f2d929150611f31565b5090565b5b80821115611f2d5760008155600101611f32565b60008083601f840112611f57578182fd5b50813567ffffffffffffffff811115611f6e578182fd5b6020830191508360208260051b8501011115611f8957600080fd5b9250929050565b60008083601f840112611fa1578182fd5b50813567ffffffffffffffff811115611fb8578182fd5b602083019150836020828501011115611f8957600080fd5b80356001600160801b0381168114611fe757600080fd5b919050565b600060208284031215611ffd578081fd5b81356112a881612754565b6000806040838503121561201a578081fd5b823561202581612754565b9150602083013561203581612754565b809150509250929050565b600080600060608486031215612054578081fd5b833561205f81612754565b9250602084013561206f81612754565b929592945050506040919091013590565b60008060008060808587031215612095578081fd5b84356120a081612754565b93506020858101356120b181612754565b935060408601359250606086013567ffffffffffffffff808211156120d4578384fd5b818801915088601f8301126120e7578384fd5b8135818111156120f9576120f961273e565b61210b601f8201601f191685016125e9565b91508082528984828501011115612120578485fd5b8084840185840137810190920192909252939692955090935050565b6000806040838503121561214e578182fd5b823561215981612754565b915060208301358015158114612035578182fd5b6000806040838503121561217f578182fd5b823561218a81612754565b946020939093013593505050565b6000806000806000606086880312156121af578283fd5b853567ffffffffffffffff808211156121c6578485fd5b6121d289838a01611f46565b909750955060208801359150808211156121ea578485fd5b506121f788828901611f46565b96999598509660400135949350505050565b6000806020838503121561221b578182fd5b823567ffffffffffffffff811115612231578283fd5b61223d85828601611f46565b90969095509350505050565b6000806000806080858703121561225e578182fd5b8435935060208501356122708161277f565b9250604085013561ffff81168114612286578283fd5b9150606085013563ffffffff8116811461229e578182fd5b939692955090935050565b6000602082840312156122ba578081fd5b81356112a881612769565b6000602082840312156122d6578081fd5b81516112a881612769565b600080602083850312156122f3578182fd5b823567ffffffffffffffff811115612309578283fd5b61223d85828601611f90565b6000806000806040858703121561232a578182fd5b843567ffffffffffffffff80821115612341578384fd5b61234d88838901611f90565b90965094506020870135915080821115612365578384fd5b5061237287828801611f90565b95989497509550505050565b60006040828403121561238f578081fd5b6040516040810181811067ffffffffffffffff821117156123b2576123b261273e565b60405282516123c081612754565b815260208301516123d08161277f565b60208201529392505050565b600080604083850312156123ee578182fd5b6123f783611fd0565b915061240560208401611fd0565b90509250929050565b60006020828403121561241f578081fd5b5035919050565b600060208284031215612437578081fd5b5051919050565b60008060408385031215612450578182fd5b8235915060208084013567ffffffffffffffff8082111561246f578384fd5b818601915086601f830112612482578384fd5b8135818111156124945761249461273e565b8060051b91506124a58483016125e9565b8181528481019084860184860187018b10156124bf578788fd5b8795505b838610156124e15780358352600195909501949186019186016124c3565b508096505050505050509250929050565b6000815180845261250a81602086016020860161267c565b601f01601f19169290920160200192915050565b6000835161253081846020880161267c565b83519083019061254481836020880161267c565b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261257f60808301846124f2565b9695505050505050565b6020815260006112a860208301846124f2565b6020808252602d908201527f4d756c74697369674f776e61626c653a2063616c6c6572206973206e6f74207460408201526c3432903932b0b61037bbb732b960991b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156126125761261261273e565b604052919050565b6000821982111561262d5761262d612712565b500190565b60008261264157612641612728565b500490565b600081600019048311821515161561266057612660612712565b500290565b60008282101561267757612677612712565b500390565b60005b8381101561269757818101518382015260200161267f565b83811115610f075750506000910152565b600181811c908216806126bc57607f821691505b602082108114156126dd57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156126f7576126f7612712565b5060010190565b60008261270d5761270d612728565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461083a57600080fd5b6001600160e01b03198116811461083a57600080fd5b67ffffffffffffffff8116811461083a57600080fdfea26469706673582212209c22604f7f8c9cb219980e9eb0d5444a1d78cd4b265c417fa9533491e58066e064736f6c63430008040033000000000000000000000000ed5af388653567af2f388e6224dc7c4b3241c5440000000000000000000000000000000000000000000000000000000000004e20000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000009536f6d657468696e6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004534d544800000000000000000000000000000000000000000000000000000000
60e06040523480156200001157600080fd5b5060405162002c2d38038062002c2d83398101604081905262000034916200030e565b83604051806040016040528060058152602001642132b0b73d60d91b815250604051806040016040528060058152602001642122a0a72d60d91b81525081600290805190602001906200008992919062000198565b5080516200009f90600390602084019062000198565b50506000805550620000b13362000146565b60098054336001600160a01b031991821617909155606091821b6001600160601b03199081166080529188901b90911660c05260a08690526010805482166001600160a01b03878116919091179091556011805490921690851617905581516200012390601490602085019062000198565b5080516200013990601590602084019062000198565b5050505050505062000409565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001a690620003b6565b90600052602060002090601f016020900481019282620001ca576000855562000215565b82601f10620001e557805160ff191683800117855562000215565b8280016001018555821562000215579182015b8281111562000215578251825591602001919060010190620001f8565b506200022392915062000227565b5090565b5b8082111562000223576000815560010162000228565b80516001600160a01b03811681146200025657600080fd5b919050565b600082601f8301126200026c578081fd5b81516001600160401b0380821115620002895762000289620003f3565b604051601f8301601f19908116603f01168101908282118183101715620002b457620002b4620003f3565b81604052838152602092508683858801011115620002d0578485fd5b8491505b83821015620002f35785820183015181830184015290820190620002d4565b838211156200030457848385830101525b9695505050505050565b60008060008060008060c0878903121562000327578182fd5b62000332876200023e565b95506020870151945062000349604088016200023e565b935062000359606088016200023e565b60808801519093506001600160401b038082111562000376578384fd5b620003848a838b016200025b565b935060a08901519150808211156200039a578283fd5b50620003a989828a016200025b565b9150509295509295509295565b600181811c90821680620003cb57607f821691505b60208210811415620003ed57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160c05160601c6127cb62000462600039600081816104b80152610da10152600081816105b5015281816108f3015281816115530152611854015260008181610a450152610a8701526127cb6000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c80635a4462151161013b5780638da5cb5b116100b8578063c5d37ae11161007c578063c5d37ae11461055f578063c87b56dd1461059d578063d5abeb01146105b0578063e985e9c5146105d7578063f2fde38b1461061357600080fd5b80638da5cb5b146104fd57806395d89b411461050e5780639fd6afe314610516578063a22cb46514610539578063b88d4fde1461054c57600080fd5b806370a08231116100ff57806370a0823114610485578063715018a614610498578063731186eb146104a0578063738ca607146104b357806381a4cd00146104da57600080fd5b80635a446215146104165780635c7d9251146104295780636352211e1461043c5780636819bec51461044f5780636ba4c1381461047257600080fd5b80631fe543e3116101c957806342842e0e1161018d57806342842e0e1461036a57806349faa4d41461037d5780634b9796291461038557806354f0168f1461039857806355f804b31461040357600080fd5b80631fe543e31461031657806323b872dd146103295780632cff67701461033c57806333d66b5b1461034f578063412583df1461036257600080fd5b806309af3f9a1161021057806309af3f9a146102bf578063172801ac146102d257806318160ddd146102e55780631c4f5150146102fb5780631df270f31461030357600080fd5b806301ffc9a71461024257806306fdde031461026a578063081812fc1461027f578063095ea7b3146102aa575b600080fd5b6102556102503660046122a9565b610626565b60405190151581526020015b60405180910390f35b610272610678565b6040516102619190612589565b61029261028d36600461240e565b61072c565b6040516001600160a01b039091168152602001610261565b6102bd6102b836600461216d565b610770565b005b6102bd6102cd366004611fec565b6107fe565b6102bd6102e0366004612249565b61083d565b600154600054035b604051908152602001610261565b6102ed6108c4565b600954610292906001600160a01b031681565b6102bd61032436600461243e565b610a3a565b6102bd610337366004612040565b610ac2565b6102bd61034a366004611fec565b610acd565b6102bd61035d366004612209565b610b19565b6102ed607881565b6102bd610378366004612040565b610bb1565b6102ed600681565b6102bd6103933660046123dc565b610bcc565b6012546013546103cb919067ffffffffffffffff811690600160401b810461ffff1690600160501b900463ffffffff1684565b6040805194855267ffffffffffffffff909316602085015261ffff9091169183019190915263ffffffff166060820152608001610261565b6102bd6104113660046122e1565b610c0f565b6102bd610424366004612315565b610c75565b6102bd61043736600461240e565b610cbf565b61029261044a36600461240e565b610cf3565b61025561045d366004611fec565b600d6020526000908152604090205460ff1681565b6102bd610480366004612209565b610d05565b6102ed610493366004611fec565b610f0d565b6102bd610f5c565b6102bd6104ae366004612198565b610fc2565b6102927f000000000000000000000000000000000000000000000000000000000000000081565b6102556104e836600461240e565b600b6020526000908152604090205460ff1681565b6008546001600160a01b0316610292565b61027261111d565b61025561052436600461240e565b600c6020526000908152604090205460ff1681565b6102bd61054736600461213c565b611149565b6102bd61055a366004612080565b6111df565b600a5461057d906001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610261565b6102726105ab36600461240e565b61122a565b6102ed7f000000000000000000000000000000000000000000000000000000000000000081565b6102556105e5366004612008565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6102bd610621366004611fec565b6112af565b60006001600160e01b031982166380ac58cd60e01b148061065757506001600160e01b03198216635b5e139f60e01b145b8061067257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060148054610687906126a8565b1515905061069c57610697611377565b905090565b601480546106a9906126a8565b80601f01602080910402602001604051908101604052809291908181526020018280546106d5906126a8565b80156107225780601f106106f757610100808354040283529160200191610722565b820191906000526020600020905b81548152906001019060200180831161070557829003601f168201915b5050505050905090565b600061073782611386565b610754576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061077b82610cf3565b9050806001600160a01b0316836001600160a01b031614156107b05760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906107d057506107ce81336105e5565b155b156107ee576040516367d9dca160e11b815260040160405180910390fd5b6107f98383836113b1565b505050565b6009546001600160a01b031633146108315760405162461bcd60e51b81526004016108289061259c565b60405180910390fd5b61083a816112af565b50565b6009546001600160a01b031633146108675760405162461bcd60e51b81526004016108289061259c565b6012939093556013805463ffffffff909416600160501b026dffffffff000000000000000000001961ffff909316600160401b0269ffffffffffffffffffff1990951667ffffffffffffffff909416939093179390931716179055565b6009546000906001600160a01b031633146108f15760405162461bcd60e51b81526004016108289061259c565b7f000000000000000000000000000000000000000000000000000000000000000061091f6001546000540390565b61092a90600161261a565b11156109495760405163d05cb60960e01b815260040160405180910390fd5b6040805160808101825260125480825260135467ffffffffffffffff811660208401819052600160401b820461ffff16848601819052600160501b90920463ffffffff166060850181905260105495516305d3b1d360e41b815260048101949094526024840191909152604483019190915260648201526001608482015290916000916001600160a01b0390911690635d3b1d309060a401602060405180830381600087803b1580156109fb57600080fd5b505af1158015610a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a339190612426565b9250505090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ab45760405163073e64fd60e21b81523360048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610828565b610abe828261140d565b5050565b6107f9838383611656565b6009546001600160a01b03163314610af75760405162461bcd60e51b81526004016108289061259c565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b03163314610b435760405162461bcd60e51b81526004016108289061259c565b60005b818110156107f9576001600b6000858585818110610b7457634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555080610baa906126e3565b9050610b46565b6107f9838383604051806020016040528060008152506111df565b6009546001600160a01b03163314610bf65760405162461bcd60e51b81526004016108289061259c565b6001600160801b03908116600160801b02911617600a55565b6008546001600160a01b03163314610c695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610828565b6107f9600f8383611ead565b6009546001600160a01b03163314610c9f5760405162461bcd60e51b81526004016108289061259c565b610cab60148585611ead565b50610cb860158383611ead565b5050505050565b6009546001600160a01b03163314610ce95760405162461bcd60e51b81526004016108289061259c565b61083a3382611843565b6000610cfe8261192b565b5192915050565b60408051808201909152600a546001600160801b03808216808452600160801b9092041660208301524290811080610d49575081602001516001600160801b031681115b15610d67576040516309ca1d3560e11b815260040160405180910390fd5b60005b83811015610efc576000858583818110610d9457634e487b7160e01b600052603260045260246000fd5b90506020020135905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639231ab2a836040518263ffffffff1660e01b8152600401610ded91815260200190565b604080518083038186803b158015610e0457600080fd5b505afa158015610e18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3c919061237e565b80519091506001600160a01b0381163314610e6a57604051631a48ea6960e21b815260040160405180910390fd5b6000838152600b602052604090205460ff16610e9957604051635366f67d60e11b815260040160405180910390fd5b602082015167ffffffffffffffff166078610eb48242612665565b1015610ed35760405163621e39d960e11b815260040160405180910390fd5b5050506000908152600b60205260409020805460ff19169055610ef5816126e3565b9050610d6a565b50610f073384611843565b50505050565b60006001600160a01b038216610f36576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610fb65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610828565b610fc06000611a47565b565b6009546001600160a01b03163314610fec5760405162461bcd60e51b81526004016108289061259c565b6000818152600e602052604090205460ff16806110415750600061103f8686600081811061102a57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906104939190611fec565b115b1561105f5760405163046a2bfb60e01b815260040160405180910390fd5b83821461107e576040516222e42d60e41b815260040160405180910390fd5b60005b848110156110fd576110ed8686838181106110ac57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110c19190611fec565b8585848181106110e157634e487b7160e01b600052603260045260246000fd5b90506020020135611843565b6110f6816126e3565b9050611081565b506000908152600e60205260409020805460ff1916600117905550505050565b60606015805461112c906126a8565b1515905061113c57610697611a99565b601580546106a9906126a8565b6001600160a01b0382163314156111735760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111ea848484611656565b6001600160a01b0383163b1515801561120c575061120a84848484611aa8565b155b15610f07576040516368d2bf6b60e11b815260040160405180910390fd5b606061123582611386565b61125257604051630a14c4b560e41b815260040160405180910390fd5b600061125c611ba0565b905080516000141561127d57604051806020016040528060008152506112a8565b8061128784611baf565b60405160200161129892919061251e565b6040516020818303038152906040525b9392505050565b6008546001600160a01b031633146113095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610828565b6001600160a01b03811661136e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610828565b61083a81611a47565b6060600280546106a9906126a8565b6000805482108015610672575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600080548260008151811061143257634e487b7160e01b600052603260045260246000fd5b602002602001015161144491906126fe565b6000818152600c602052604090205490915060ff16156114775760405163ae2122df60e01b815260040160405180910390fd5b600061148282610cf3565b90506114966008546001600160a01b031690565b6001600160a01b0316816001600160a01b031614806114cd57506001600160a01b0381166000908152600d602052604090205460ff165b156114eb576040516332c03f9760e21b815260040160405180910390fd5b6001600160a01b0381163b1561151457604051636b17d49b60e11b815260040160405180910390fd5b6000828152600c602090815260408083208054600160ff1991821681179092556001600160a01b0386168552600d9093529220805490911690911790557f000000000000000000000000000000000000000000000000000000000000000061157f6001546000540390565b61158a90600161261a565b11156115a95760405163d05cb60960e01b815260040160405180910390fd5b6115c6816001604051806020016040528060008152506000611ce1565b600060016115d360005490565b6115dd9190612665565b6000818152600c602052604090819020805460ff19166001179055519091507fb7f339c4a7aad4a1b47704005283a1a2cdec75bbd915bf5522652e90e98055f490611647908590859085909283526001600160a01b03919091166020830152604082015260600190565b60405180910390a15050505050565b60006116618261192b565b9050836001600160a01b031681600001516001600160a01b0316146116985760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806116b657506116b685336105e5565b806116d15750336116c68461072c565b6001600160a01b0316145b9050806116f157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661171857604051633a954ecd60e21b815260040160405180910390fd5b611724600084876113b1565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166117fa5760005482146117fa578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610cb8565b6000611850826002612646565b90507f0000000000000000000000000000000000000000000000000000000000000000816118816001546000540390565b61188b919061261a565b11156118aa5760405163d05cb60960e01b815260040160405180910390fd5b60006118b7600683612632565b905060005b818110156118f1576118e1856006604051806020016040528060008152506001611ce1565b6118ea816126e3565b90506118bc565b5060006118ff6006846126fe565b1115610f0757610f07846119146006856126fe565b604051806020016040528060008152506001611ce1565b604080516060810182526000808252602082018190529181019190915281600054811015611a2e57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290611a2c5780516001600160a01b0316156119c2579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611a27579392505050565b6119c2565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600380546106a9906126a8565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611add90339089908890889060040161254d565b602060405180830381600087803b158015611af757600080fd5b505af1925050508015611b27575060408051601f3d908101601f19168201909252611b24918101906122c5565b60015b611b82573d808015611b55576040519150601f19603f3d011682016040523d82523d6000602084013e611b5a565b606091505b508051611b7a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600f80546106a9906126a8565b606081611bd35750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611bfd5780611be7816126e3565b9150611bf69050600a83612632565b9150611bd7565b60008167ffffffffffffffff811115611c2657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c50576020820181803683370190505b5090505b8415611b9857611c65600183612665565b9150611c72600a866126fe565b611c7d90603061261a565b60f81b818381518110611ca057634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611cda600a86612632565b9450611c54565b6000546001600160a01b038516611d0a57604051622e076360e81b815260040160405180910390fd5b83611d285760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611dd557506001600160a01b0387163b15155b15611e5e575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611e266000888480600101955088611aa8565b611e43576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611ddb578260005414611e5957600080fd5b611ea4565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611e5f575b50600055610cb8565b828054611eb9906126a8565b90600052602060002090601f016020900481019282611edb5760008555611f21565b82601f10611ef45782800160ff19823516178555611f21565b82800160010185558215611f21579182015b82811115611f21578235825591602001919060010190611f06565b50611f2d929150611f31565b5090565b5b80821115611f2d5760008155600101611f32565b60008083601f840112611f57578182fd5b50813567ffffffffffffffff811115611f6e578182fd5b6020830191508360208260051b8501011115611f8957600080fd5b9250929050565b60008083601f840112611fa1578182fd5b50813567ffffffffffffffff811115611fb8578182fd5b602083019150836020828501011115611f8957600080fd5b80356001600160801b0381168114611fe757600080fd5b919050565b600060208284031215611ffd578081fd5b81356112a881612754565b6000806040838503121561201a578081fd5b823561202581612754565b9150602083013561203581612754565b809150509250929050565b600080600060608486031215612054578081fd5b833561205f81612754565b9250602084013561206f81612754565b929592945050506040919091013590565b60008060008060808587031215612095578081fd5b84356120a081612754565b93506020858101356120b181612754565b935060408601359250606086013567ffffffffffffffff808211156120d4578384fd5b818801915088601f8301126120e7578384fd5b8135818111156120f9576120f961273e565b61210b601f8201601f191685016125e9565b91508082528984828501011115612120578485fd5b8084840185840137810190920192909252939692955090935050565b6000806040838503121561214e578182fd5b823561215981612754565b915060208301358015158114612035578182fd5b6000806040838503121561217f578182fd5b823561218a81612754565b946020939093013593505050565b6000806000806000606086880312156121af578283fd5b853567ffffffffffffffff808211156121c6578485fd5b6121d289838a01611f46565b909750955060208801359150808211156121ea578485fd5b506121f788828901611f46565b96999598509660400135949350505050565b6000806020838503121561221b578182fd5b823567ffffffffffffffff811115612231578283fd5b61223d85828601611f46565b90969095509350505050565b6000806000806080858703121561225e578182fd5b8435935060208501356122708161277f565b9250604085013561ffff81168114612286578283fd5b9150606085013563ffffffff8116811461229e578182fd5b939692955090935050565b6000602082840312156122ba578081fd5b81356112a881612769565b6000602082840312156122d6578081fd5b81516112a881612769565b600080602083850312156122f3578182fd5b823567ffffffffffffffff811115612309578283fd5b61223d85828601611f90565b6000806000806040858703121561232a578182fd5b843567ffffffffffffffff80821115612341578384fd5b61234d88838901611f90565b90965094506020870135915080821115612365578384fd5b5061237287828801611f90565b95989497509550505050565b60006040828403121561238f578081fd5b6040516040810181811067ffffffffffffffff821117156123b2576123b261273e565b60405282516123c081612754565b815260208301516123d08161277f565b60208201529392505050565b600080604083850312156123ee578182fd5b6123f783611fd0565b915061240560208401611fd0565b90509250929050565b60006020828403121561241f578081fd5b5035919050565b600060208284031215612437578081fd5b5051919050565b60008060408385031215612450578182fd5b8235915060208084013567ffffffffffffffff8082111561246f578384fd5b818601915086601f830112612482578384fd5b8135818111156124945761249461273e565b8060051b91506124a58483016125e9565b8181528481019084860184860187018b10156124bf578788fd5b8795505b838610156124e15780358352600195909501949186019186016124c3565b508096505050505050509250929050565b6000815180845261250a81602086016020860161267c565b601f01601f19169290920160200192915050565b6000835161253081846020880161267c565b83519083019061254481836020880161267c565b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261257f60808301846124f2565b9695505050505050565b6020815260006112a860208301846124f2565b6020808252602d908201527f4d756c74697369674f776e61626c653a2063616c6c6572206973206e6f74207460408201526c3432903932b0b61037bbb732b960991b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156126125761261261273e565b604052919050565b6000821982111561262d5761262d612712565b500190565b60008261264157612641612728565b500490565b600081600019048311821515161561266057612660612712565b500290565b60008282101561267757612677612712565b500390565b60005b8381101561269757818101518382015260200161267f565b83811115610f075750506000910152565b600181811c908216806126bc57607f821691505b602082108114156126dd57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156126f7576126f7612712565b5060010190565b60008261270d5761270d612728565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461083a57600080fd5b6001600160e01b03198116811461083a57600080fd5b67ffffffffffffffff8116811461083a57600080fdfea26469706673582212209c22604f7f8c9cb219980e9eb0d5444a1d78cd4b265c417fa9533491e58066e064736f6c63430008040033000000000000000000000000ed5af388653567af2f388e6224dc7c4b3241c5440000000000000000000000000000000000000000000000000000000000004e20000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000009536f6d657468696e6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004534d544800000000000000000000000000000000000000000000000000000000