Meebits
Deploy on AlchemyContract Information
Explore the source code, ABI, and bytecode for the Meebits smart contract.
More Info
pragma solidity 0.7.6;
/**
* __ __ _ _ _
* | \/ | | | (_) |
* | \ / | ___ ___| |__ _| |_ ___
* | |\/| |/ _ \/ _ \ '_ \| | __/ __|
* | | | | __/ __/ |_) | | |_\__ \
* |_| |_|\___|\___|_.__/|_|\__|___/
*
* An NFT project from Larva Labs.
*
*/
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function transferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function setApprovalForAll(address operator, bool _approved) external;
function isApprovedForAll(address owner, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
/**
* Minimal interface to Cryptopunks for verifying ownership during Community Grant.
*/
interface Cryptopunks {
function punkIndexToAddress(uint index) external view returns(address);
}
interface ERC721TokenReceiver
{
function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
require(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
require(c >= a);
return c;
}
}
contract Meebits is IERC721 {
using SafeMath for uint256;
/**
* Event emitted when minting a new NFT. "createdVia" is the index of the Cryptopunk/Autoglyph that was used to mint, or 0 if not applicable.
*/
event Mint(uint indexed index, address indexed minter, uint createdVia);
/**
* Event emitted when a trade is executed.
*/
event Trade(bytes32 indexed hash, address indexed maker, address taker, uint makerWei, uint[] makerIds, uint takerWei, uint[] takerIds);
/**
* Event emitted when ETH is deposited into the contract.
*/
event Deposit(address indexed account, uint amount);
/**
* Event emitted when ETH is withdrawn from the contract.
*/
event Withdraw(address indexed account, uint amount);
/**
* Event emitted when a trade offer is cancelled.
*/
event OfferCancelled(bytes32 hash);
/**
* Event emitted when the public sale begins.
*/
event SaleBegins();
/**
* Event emitted when the community grant period ends.
*/
event CommunityGrantEnds();
bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;
// IPFS Hash to the NFT content
string public contentHash = "QmfXYgfX1qNfzQ6NRyFnupniZusasFPMeiWn5aaDnx7YXo";
uint public constant TOKEN_LIMIT = 20000;
uint public constant SALE_LIMIT = 9000;
mapping(bytes4 => bool) internal supportedInterfaces;
mapping (uint256 => address) internal idToOwner;
mapping (uint256 => uint256) public creatorNftMints;
mapping (uint256 => address) internal idToApproval;
mapping (address => mapping (address => bool)) internal ownerToOperators;
mapping(address => uint256[]) internal ownerToIds;
mapping(uint256 => uint256) internal idToOwnerIndex;
string internal nftName = "Meebits";
string internal nftSymbol = unicode"⚇";
uint internal numTokens = 0;
uint internal numSales = 0;
// Cryptopunks contract
address internal punks;
// Autoglyphs contract
address internal glyphs;
address payable internal deployer;
address payable internal beneficiary;
bool public communityGrant = true;
bool public publicSale = false;
uint private price;
uint public saleStartTime;
uint public saleDuration;
//// Random index assignment
uint internal nonce = 0;
uint[TOKEN_LIMIT] internal indices;
//// Market
bool public marketPaused;
bool public contractSealed;
mapping (address => uint256) public ethBalance;
mapping (bytes32 => bool) public cancelledOffers;
modifier onlyDeployer() {
require(msg.sender == deployer, "Only deployer.");
_;
}
bool private reentrancyLock = false;
/* Prevent a contract function from being reentrant-called. */
modifier reentrancyGuard {
if (reentrancyLock) {
revert();
}
reentrancyLock = true;
_;
reentrancyLock = false;
}
modifier canOperate(uint256 _tokenId) {
address tokenOwner = idToOwner[_tokenId];
require(tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender], "Cannot operate.");
_;
}
modifier canTransfer(uint256 _tokenId) {
address tokenOwner = idToOwner[_tokenId];
require(
tokenOwner == msg.sender
|| idToApproval[_tokenId] == msg.sender
|| ownerToOperators[tokenOwner][msg.sender], "Cannot transfer."
);
_;
}
modifier validNFToken(uint256 _tokenId) {
require(idToOwner[_tokenId] != address(0), "Invalid token.");
_;
}
constructor(address _punks, address _glyphs, address payable _beneficiary) {
supportedInterfaces[0x01ffc9a7] = true; // ERC165
supportedInterfaces[0x80ac58cd] = true; // ERC721
supportedInterfaces[0x780e9d63] = true; // ERC721 Enumerable
supportedInterfaces[0x5b5e139f] = true; // ERC721 Metadata
deployer = msg.sender;
punks = _punks;
glyphs = _glyphs;
beneficiary = _beneficiary;
}
function startSale(uint _price, uint _saleDuration) external onlyDeployer {
require(!publicSale);
price = _price;
saleDuration = _saleDuration;
saleStartTime = block.timestamp;
publicSale = true;
emit SaleBegins();
}
function endCommunityGrant() external onlyDeployer {
require(communityGrant);
communityGrant = false;
emit CommunityGrantEnds();
}
function pauseMarket(bool _paused) external onlyDeployer {
require(!contractSealed, "Contract sealed.");
marketPaused = _paused;
}
function sealContract() external onlyDeployer {
contractSealed = true;
}
//////////////////////////
//// ERC 721 and 165 ////
//////////////////////////
function isContract(address _addr) internal view returns (bool addressCheck) {
uint256 size;
assembly { size := extcodesize(_addr) } // solhint-disable-line
addressCheck = size > 0;
}
function supportsInterface(bytes4 _interfaceID) external view override returns (bool) {
return supportedInterfaces[_interfaceID];
}
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata _data) external override {
_safeTransferFrom(_from, _to, _tokenId, _data);
}
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external override {
_safeTransferFrom(_from, _to, _tokenId, "");
}
function transferFrom(address _from, address _to, uint256 _tokenId) external override canTransfer(_tokenId) validNFToken(_tokenId) {
address tokenOwner = idToOwner[_tokenId];
require(tokenOwner == _from, "Wrong from address.");
require(_to != address(0), "Cannot send to 0x0.");
_transfer(_to, _tokenId);
}
function approve(address _approved, uint256 _tokenId) external override canOperate(_tokenId) validNFToken(_tokenId) {
address tokenOwner = idToOwner[_tokenId];
require(_approved != tokenOwner);
idToApproval[_tokenId] = _approved;
emit Approval(tokenOwner, _approved, _tokenId);
}
function setApprovalForAll(address _operator, bool _approved) external override {
ownerToOperators[msg.sender][_operator] = _approved;
emit ApprovalForAll(msg.sender, _operator, _approved);
}
function balanceOf(address _owner) external view override returns (uint256) {
require(_owner != address(0));
return _getOwnerNFTCount(_owner);
}
function ownerOf(uint256 _tokenId) external view override returns (address _owner) {
require(idToOwner[_tokenId] != address(0));
_owner = idToOwner[_tokenId];
}
function getApproved(uint256 _tokenId) external view override validNFToken(_tokenId) returns (address) {
return idToApproval[_tokenId];
}
function isApprovedForAll(address _owner, address _operator) external override view returns (bool) {
return ownerToOperators[_owner][_operator];
}
function _transfer(address _to, uint256 _tokenId) internal {
address from = idToOwner[_tokenId];
_clearApproval(_tokenId);
_removeNFToken(from, _tokenId);
_addNFToken(_to, _tokenId);
emit Transfer(from, _to, _tokenId);
}
function randomIndex() internal returns (uint) {
uint totalSize = TOKEN_LIMIT - numTokens;
uint index = uint(keccak256(abi.encodePacked(nonce, msg.sender, block.difficulty, block.timestamp))) % totalSize;
uint value = 0;
if (indices[index] != 0) {
value = indices[index];
} else {
value = index;
}
// Move last value to selected position
if (indices[totalSize - 1] == 0) {
// Array position not initialized, so use position
indices[index] = totalSize - 1;
} else {
// Array position holds a value so use that
indices[index] = indices[totalSize - 1];
}
nonce++;
// Don't allow a zero index, start counting at 1
return value.add(1);
}
// Calculate the mint price
function getPrice() public view returns (uint) {
require(publicSale, "Sale not started.");
uint elapsed = block.timestamp.sub(saleStartTime);
if (elapsed >= saleDuration) {
return 0;
} else {
return saleDuration.sub(elapsed).mul(price).div(saleDuration);
}
}
// The deployer can mint in bulk without paying
function devMint(uint quantity, address recipient) external onlyDeployer {
for (uint i = 0; i < quantity; i++) {
_mint(recipient, 0);
}
}
function mintsRemaining() external view returns (uint) {
return SALE_LIMIT.sub(numSales);
}
/**
* Community grant minting.
*/
function mintWithPunkOrGlyph(uint _createVia) external reentrancyGuard returns (uint) {
require(communityGrant);
require(!marketPaused);
require(_createVia > 0 && _createVia <= 10512, "Invalid punk/glyph index.");
require(creatorNftMints[_createVia] == 0, "Already minted with this punk/glyph");
if (_createVia > 10000) {
// It's a glyph
// Compute the glyph ID
uint glyphId = _createVia.sub(10000);
// Make sure the sender owns the glyph
require(IERC721(glyphs).ownerOf(glyphId) == msg.sender, "Not the owner of this glyph.");
} else {
// It's a punk
// Compute the punk ID
uint punkId = _createVia.sub(1);
// Make sure the sender owns the punk
require(Cryptopunks(punks).punkIndexToAddress(punkId) == msg.sender, "Not the owner of this punk.");
}
creatorNftMints[_createVia]++;
return _mint(msg.sender, _createVia);
}
/**
* Public sale minting.
*/
function mint() external payable reentrancyGuard returns (uint) {
require(publicSale, "Sale not started.");
require(!marketPaused);
require(numSales < SALE_LIMIT, "Sale limit reached.");
uint salePrice = getPrice();
require(msg.value >= salePrice, "Insufficient funds to purchase.");
if (msg.value > salePrice) {
msg.sender.transfer(msg.value.sub(salePrice));
}
beneficiary.transfer(salePrice);
numSales++;
return _mint(msg.sender, 0);
}
function _mint(address _to, uint createdVia) internal returns (uint) {
require(_to != address(0), "Cannot mint to 0x0.");
require(numTokens < TOKEN_LIMIT, "Token limit reached.");
uint id = randomIndex();
numTokens = numTokens + 1;
_addNFToken(_to, id);
emit Mint(id, _to, createdVia);
emit Transfer(address(0), _to, id);
return id;
}
function _addNFToken(address _to, uint256 _tokenId) internal {
require(idToOwner[_tokenId] == address(0), "Cannot add, already owned.");
idToOwner[_tokenId] = _to;
ownerToIds[_to].push(_tokenId);
idToOwnerIndex[_tokenId] = ownerToIds[_to].length.sub(1);
}
function _removeNFToken(address _from, uint256 _tokenId) internal {
require(idToOwner[_tokenId] == _from, "Incorrect owner.");
delete idToOwner[_tokenId];
uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId];
uint256 lastTokenIndex = ownerToIds[_from].length.sub(1);
if (lastTokenIndex != tokenToRemoveIndex) {
uint256 lastToken = ownerToIds[_from][lastTokenIndex];
ownerToIds[_from][tokenToRemoveIndex] = lastToken;
idToOwnerIndex[lastToken] = tokenToRemoveIndex;
}
ownerToIds[_from].pop();
}
function _getOwnerNFTCount(address _owner) internal view returns (uint256) {
return ownerToIds[_owner].length;
}
function _safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) private canTransfer(_tokenId) validNFToken(_tokenId) {
address tokenOwner = idToOwner[_tokenId];
require(tokenOwner == _from, "Incorrect owner.");
require(_to != address(0));
_transfer(_to, _tokenId);
if (isContract(_to)) {
bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
require(retval == MAGIC_ON_ERC721_RECEIVED);
}
}
function _clearApproval(uint256 _tokenId) private {
if (idToApproval[_tokenId] != address(0)) {
delete idToApproval[_tokenId];
}
}
//// Enumerable
function totalSupply() public view returns (uint256) {
return numTokens;
}
function tokenByIndex(uint256 index) public pure returns (uint256) {
require(index >= 0 && index < TOKEN_LIMIT);
return index + 1;
}
function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) {
require(_index < ownerToIds[_owner].length);
return ownerToIds[_owner][_index];
}
//// Metadata
/**
* @dev Converts a `uint256` to its ASCII `string` representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
uint256 index = digits - 1;
temp = value;
while (temp != 0) {
buffer[index--] = bytes1(uint8(48 + temp % 10));
temp /= 10;
}
return string(buffer);
}
/**
* @dev Returns a descriptive name for a collection of NFTokens.
* @return _name Representing name.
*/
function name() external view returns (string memory _name) {
_name = nftName;
}
/**
* @dev Returns an abbreviated name for NFTokens.
* @return _symbol Representing symbol.
*/
function symbol() external view returns (string memory _symbol) {
_symbol = nftSymbol;
}
/**
* @dev A distinct URI (RFC 3986) for a given NFT.
* @param _tokenId Id for which we want uri.
* @return _tokenId URI of _tokenId.
*/
function tokenURI(uint256 _tokenId) external view validNFToken(_tokenId) returns (string memory) {
return string(abi.encodePacked("https://meebits.larvalabs.com/meebit/", toString(_tokenId)));
}
//// MARKET
struct Offer {
address maker;
address taker;
uint256 makerWei;
uint256[] makerIds;
uint256 takerWei;
uint256[] takerIds;
uint256 expiry;
uint256 salt;
}
function hashOffer(Offer memory offer) private pure returns (bytes32){
return keccak256(abi.encode(
offer.maker,
offer.taker,
offer.makerWei,
keccak256(abi.encodePacked(offer.makerIds)),
offer.takerWei,
keccak256(abi.encodePacked(offer.takerIds)),
offer.expiry,
offer.salt
));
}
function hashToSign(address maker, address taker, uint256 makerWei, uint256[] memory makerIds, uint256 takerWei, uint256[] memory takerIds, uint256 expiry, uint256 salt) public pure returns (bytes32) {
Offer memory offer = Offer(maker, taker, makerWei, makerIds, takerWei, takerIds, expiry, salt);
return hashOffer(offer);
}
function hashToVerify(Offer memory offer) private pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hashOffer(offer)));
}
function verify(address signer, bytes32 hash, bytes memory signature) internal pure returns (bool) {
require(signer != address(0));
require(signature.length == 65);
bytes32 r;
bytes32 s;
uint8 v;
assembly {
r := mload(add(signature, 32))
s := mload(add(signature, 64))
v := byte(0, mload(add(signature, 96)))
}
if (v < 27) {
v += 27;
}
require(v == 27 || v == 28);
return signer == ecrecover(hash, v, r, s);
}
function tradeValid(address maker, address taker, uint256 makerWei, uint256[] memory makerIds, uint256 takerWei, uint256[] memory takerIds, uint256 expiry, uint256 salt, bytes memory signature) view public returns (bool) {
Offer memory offer = Offer(maker, taker, makerWei, makerIds, takerWei, takerIds, expiry, salt);
// Check for cancellation
bytes32 hash = hashOffer(offer);
require(cancelledOffers[hash] == false, "Trade offer was cancelled.");
// Verify signature
bytes32 verifyHash = hashToVerify(offer);
require(verify(offer.maker, verifyHash, signature), "Signature not valid.");
// Check for expiry
require(block.timestamp < offer.expiry, "Trade offer expired.");
// Only one side should ever have to pay, not both
require(makerWei == 0 || takerWei == 0, "Only one side of trade must pay.");
// At least one side should offer tokens
require(makerIds.length > 0 || takerIds.length > 0, "One side must offer tokens.");
// Make sure the maker has funded the trade
require(ethBalance[offer.maker] >= offer.makerWei, "Maker does not have sufficient balance.");
// Ensure the maker owns the maker tokens
for (uint i = 0; i < offer.makerIds.length; i++) {
require(idToOwner[offer.makerIds[i]] == offer.maker, "At least one maker token doesn't belong to maker.");
}
// If the taker can be anybody, then there can be no taker tokens
if (offer.taker == address(0)) {
// If taker not specified, then can't specify IDs
require(offer.takerIds.length == 0, "If trade is offered to anybody, cannot specify tokens from taker.");
} else {
// Ensure the taker owns the taker tokens
for (uint i = 0; i < offer.takerIds.length; i++) {
require(idToOwner[offer.takerIds[i]] == offer.taker, "At least one taker token doesn't belong to taker.");
}
}
return true;
}
function cancelOffer(address maker, address taker, uint256 makerWei, uint256[] memory makerIds, uint256 takerWei, uint256[] memory takerIds, uint256 expiry, uint256 salt) external {
require(maker == msg.sender, "Only the maker can cancel this offer.");
Offer memory offer = Offer(maker, taker, makerWei, makerIds, takerWei, takerIds, expiry, salt);
bytes32 hash = hashOffer(offer);
cancelledOffers[hash] = true;
emit OfferCancelled(hash);
}
function acceptTrade(address maker, address taker, uint256 makerWei, uint256[] memory makerIds, uint256 takerWei, uint256[] memory takerIds, uint256 expiry, uint256 salt, bytes memory signature) external payable reentrancyGuard {
require(!marketPaused, "Market is paused.");
require(msg.sender != maker, "Can't accept ones own trade.");
Offer memory offer = Offer(maker, taker, makerWei, makerIds, takerWei, takerIds, expiry, salt);
if (msg.value > 0) {
ethBalance[msg.sender] = ethBalance[msg.sender].add(msg.value);
emit Deposit(msg.sender, msg.value);
}
require(offer.taker == address(0) || offer.taker == msg.sender, "Not the recipient of this offer.");
require(tradeValid(maker, taker, makerWei, makerIds, takerWei, takerIds, expiry, salt, signature), "Trade not valid.");
require(ethBalance[msg.sender] >= offer.takerWei, "Insufficient funds to execute trade.");
// Transfer ETH
ethBalance[offer.maker] = ethBalance[offer.maker].sub(offer.makerWei);
ethBalance[msg.sender] = ethBalance[msg.sender].add(offer.makerWei);
ethBalance[msg.sender] = ethBalance[msg.sender].sub(offer.takerWei);
ethBalance[offer.maker] = ethBalance[offer.maker].add(offer.takerWei);
// Transfer maker ids to taker (msg.sender)
for (uint i = 0; i < makerIds.length; i++) {
_transfer(msg.sender, makerIds[i]);
}
// Transfer taker ids to maker
for (uint i = 0; i < takerIds.length; i++) {
_transfer(maker, takerIds[i]);
}
// Prevent a replay attack on this offer
bytes32 hash = hashOffer(offer);
cancelledOffers[hash] = true;
emit Trade(hash, offer.maker, msg.sender, offer.makerWei, offer.makerIds, offer.takerWei, offer.takerIds);
}
function withdraw(uint amount) external reentrancyGuard {
require(amount <= ethBalance[msg.sender]);
ethBalance[msg.sender] = ethBalance[msg.sender].sub(amount);
(bool success, ) = msg.sender.call{value:amount}("");
require(success);
emit Withdraw(msg.sender, amount);
}
function deposit() external payable {
ethBalance[msg.sender] = ethBalance[msg.sender].add(msg.value);
emit Deposit(msg.sender, msg.value);
}
}
[{"inputs":[{"internalType":"address","name":"_punks","type":"address"},{"internalType":"address","name":"_glyphs","type":"address"},{"internalType":"address payable","name":"_beneficiary","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[],"name":"CommunityGrantEnds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"createdVia","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"OfferCancelled","type":"event"},{"anonymous":false,"inputs":[],"name":"SaleBegins","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":false,"internalType":"address","name":"taker","type":"address"},{"indexed":false,"internalType":"uint256","name":"makerWei","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"makerIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"takerWei","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"takerIds","type":"uint256[]"}],"name":"Trade","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"SALE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"taker","type":"address"},{"internalType":"uint256","name":"makerWei","type":"uint256"},{"internalType":"uint256[]","name":"makerIds","type":"uint256[]"},{"internalType":"uint256","name":"takerWei","type":"uint256"},{"internalType":"uint256[]","name":"takerIds","type":"uint256[]"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"acceptTrade","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"taker","type":"address"},{"internalType":"uint256","name":"makerWei","type":"uint256"},{"internalType":"uint256[]","name":"makerIds","type":"uint256[]"},{"internalType":"uint256","name":"takerWei","type":"uint256"},{"internalType":"uint256[]","name":"takerIds","type":"uint256[]"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"cancelOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"cancelledOffers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"communityGrant","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contentHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creatorNftMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endCommunityGrant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ethBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"taker","type":"address"},{"internalType":"uint256","name":"makerWei","type":"uint256"},{"internalType":"uint256[]","name":"makerIds","type":"uint256[]"},{"internalType":"uint256","name":"takerWei","type":"uint256"},{"internalType":"uint256[]","name":"takerIds","type":"uint256[]"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"hashToSign","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","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":"marketPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_createVia","type":"uint256"}],"name":"mintWithPunkOrGlyph","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"pauseMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"saleDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sealContract","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":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_saleDuration","type":"uint256"}],"name":"startSale","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":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maker","type":"address"},{"internalType":"address","name":"taker","type":"address"},{"internalType":"uint256","name":"makerWei","type":"uint256"},{"internalType":"uint256[]","name":"makerIds","type":"uint256[]"},{"internalType":"uint256","name":"takerWei","type":"uint256"},{"internalType":"uint256[]","name":"takerIds","type":"uint256[]"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"tradeValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
[{"inputs":[{"internalType":"address","name":"_punks","type":"address"},{"internalType":"address","name":"_glyphs","type":"address"},{"internalType":"address payable","name":"_beneficiary","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[],"name":"CommunityGrantEnds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"createdVia","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"OfferCancelled","type":"event"},{"anonymous":false,"inputs":[],"name":"SaleBegins","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":false,"internalType":"address","name":"taker","type":"address"},{"indexed":false,"internalType":"uint256","name":"makerWei","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"makerIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"takerWei","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"takerIds","type":"uint256[]"}],"name":"Trade","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"SALE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"taker","type":"address"},{"internalType":"uint256","name":"makerWei","type":"uint256"},{"internalType":"uint256[]","name":"makerIds","type":"uint256[]"},{"internalType":"uint256","name":"takerWei","type":"uint256"},{"internalType":"uint256[]","name":"takerIds","type":"uint256[]"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"acceptTrade","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"taker","type":"address"},{"internalType":"uint256","name":"makerWei","type":"uint256"},{"internalType":"uint256[]","name":"makerIds","type":"uint256[]"},{"internalType":"uint256","name":"takerWei","type":"uint256"},{"internalType":"uint256[]","name":"takerIds","type":"uint256[]"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"cancelOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"cancelledOffers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"communityGrant","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contentHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creatorNftMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endCommunityGrant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ethBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"maker","type":"address"},{"internalType":"address","name":"taker","type":"address"},{"internalType":"uint256","name":"makerWei","type":"uint256"},{"internalType":"uint256[]","name":"makerIds","type":"uint256[]"},{"internalType":"uint256","name":"takerWei","type":"uint256"},{"internalType":"uint256[]","name":"takerIds","type":"uint256[]"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"hashToSign","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","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":"marketPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_createVia","type":"uint256"}],"name":"mintWithPunkOrGlyph","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"pauseMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"saleDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sealContract","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":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_saleDuration","type":"uint256"}],"name":"startSale","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":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maker","type":"address"},{"internalType":"address","name":"taker","type":"address"},{"internalType":"uint256","name":"makerWei","type":"uint256"},{"internalType":"uint256[]","name":"makerIds","type":"uint256[]"},{"internalType":"uint256","name":"takerWei","type":"uint256"},{"internalType":"uint256[]","name":"takerIds","type":"uint256[]"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"tradeValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
60806040526040518060600160405280602e81526020016200643f602e91396000908051906020019062000035929190620003dc565b506040518060400160405280600781526020017f4d656562697473000000000000000000000000000000000000000000000000008152506008908051906020019062000083929190620003dc565b506040518060400160405280600381526020017fe29a87000000000000000000000000000000000000000000000000000000000081525060099080519060200190620000d1929190620003dc565b506000600a556000600b556001600f60146101000a81548160ff0219169083151502179055506000600f60156101000a81548160ff02191690831515021790555060006013556000614e3760006101000a81548160ff0219169083151502179055503480156200014057600080fd5b506040516200646d3803806200646d833981810160405260608110156200016657600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505060018060006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060018060006380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600180600063780e9d6360e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001806000635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000492565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000414576000855562000460565b82601f106200042f57805160ff191683800117855562000460565b8280016001018555821562000460579182015b828111156200045f57825182559160200191906001019062000442565b5b5090506200046f919062000473565b5090565b5b808211156200048e57600081600090555060010162000474565b5090565b615f9d80620004a26000396000f3fe60806040526004361061025c5760003560e01c80635ec390d811610144578063b88d4fde116100b6578063d357b01e1161007a578063d357b01e14611190578063d3d6c767146111a7578063d8f3790f14611416578063e985e9c51461147b578063f4f3122e14611502578063f592934c146115475761025c565b8063b88d4fde14610f64578063b9f7e21814611034578063c87b56dd14611083578063d09229a814611137578063d0e30db0146111865761025c565b80638a84fe00116101085780638a84fe0014610c0c57806395d89b4114610dce57806398d5fdca14610e5e5780639f7bf76214610e89578063a22cb46514610eda578063b650163714610f375761025c565b80635ec390d814610a5e5780636352211e14610a9b578063646c2e3314610b0057806368bd580e14610b9057806370a0823114610ba75761025c565b8063212e8f67116101dd57806333bc1c5c116101a157806333bc1c5c146108e45780633711d9fb146109115780633a283bd21461093c57806342842e0e1461096957806344c66be7146109e45780634f6ccce714610a0f5761025c565b8063212e8f671461073957806323b872dd146107645780632d1a12f6146107df5780632e1a7d4d1461083a5780632f745c59146108755761025c565b8063095ea7b311610224578063095ea7b31461041e5780630faadcf6146104795780631249c58b146106c557806318160ddd146106e35780631cbaee2d1461070e5761025c565b806301ffc9a714610261578063031bd4c4146102d15780630614a6ba146102fc57806306fdde0314610329578063081812fc146103b9575b600080fd5b34801561026d57600080fd5b506102b96004803603602081101561028457600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061171d565b60405180821515815260200191505060405180910390f35b3480156102dd57600080fd5b506102e6611785565b6040518082815260200191505060405180910390f35b34801561030857600080fd5b5061031161178b565b60405180821515815260200191505060405180910390f35b34801561033557600080fd5b5061033e61179e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561037e578082015181840152602081019050610363565b50505050905090810190601f1680156103ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103c557600080fd5b506103f2600480360360208110156103dc57600080fd5b8101908080359060200190929190505050611840565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561042a57600080fd5b506104776004803603604081101561044157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611955565b005b6106c3600480360361012081101561049057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156104f757600080fd5b82018360208201111561050957600080fd5b8035906020019184602083028401116401000000008311171561052b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291908035906020019064010000000081111561059557600080fd5b8201836020820111156105a757600080fd5b803590602001918460208302840111640100000000831117156105c957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803590602001909291908035906020019064010000000081111561063d57600080fd5b82018360208201111561064f57600080fd5b8035906020019184600183028401116401000000008311171561067157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611cbd565b005b6106cd6125db565b6040518082815260200191505060405180910390f35b3480156106ef57600080fd5b506106f86128b6565b6040518082815260200191505060405180910390f35b34801561071a57600080fd5b506107236128c0565b6040518082815260200191505060405180910390f35b34801561074557600080fd5b5061074e6128c6565b6040518082815260200191505060405180910390f35b34801561077057600080fd5b506107dd6004803603606081101561078757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506128cc565b005b3480156107eb57600080fd5b506108386004803603604081101561080257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d06565b005b34801561084657600080fd5b506108736004803603602081101561085d57600080fd5b8101908080359060200190929190505050612df2565b005b34801561088157600080fd5b506108ce6004803603604081101561089857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612fee565b6040518082815260200191505060405180910390f35b3480156108f057600080fd5b506108f961309b565b60405180821515815260200191505060405180910390f35b34801561091d57600080fd5b506109266130ae565b6040518082815260200191505060405180910390f35b34801561094857600080fd5b506109516130b4565b60405180821515815260200191505060405180910390f35b34801561097557600080fd5b506109e26004803603606081101561098c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506130c8565b005b3480156109f057600080fd5b506109f96130e8565b6040518082815260200191505060405180910390f35b348015610a1b57600080fd5b50610a4860048036036020811015610a3257600080fd5b8101908080359060200190929190505050613106565b6040518082815260200191505060405180910390f35b348015610a6a57600080fd5b50610a9960048036036020811015610a8157600080fd5b8101908080351515906020019092919050505061312d565b005b348015610aa757600080fd5b50610ad460048036036020811015610abe57600080fd5b8101908080359060200190929190505050613292565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b0c57600080fd5b50610b1561333b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b55578082015181840152602081019050610b3a565b50505050905090810190601f168015610b825780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b9c57600080fd5b50610ba56133d9565b005b348015610bb357600080fd5b50610bf660048036036020811015610bca57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506134ba565b6040518082815260200191505060405180910390f35b348015610c1857600080fd5b50610dcc6004803603610100811015610c3057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610c9757600080fd5b820183602082011115610ca957600080fd5b80359060200191846020830284011164010000000083111715610ccb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190640100000000811115610d3557600080fd5b820183602082011115610d4757600080fd5b80359060200191846020830284011164010000000083111715610d6957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190929190505050613505565b005b348015610dda57600080fd5b50610de3613670565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e23578082015181840152602081019050610e08565b50505050905090810190601f168015610e505780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e6a57600080fd5b50610e73613712565b6040518082815260200191505060405180910390f35b348015610e9557600080fd5b50610ec260048036036020811015610eac57600080fd5b8101908080359060200190929190505050613806565b60405180821515815260200191505060405180910390f35b348015610ee657600080fd5b50610f3560048036036040811015610efd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613827565b005b348015610f4357600080fd5b50610f4c613926565b60405180821515815260200191505060405180910390f35b348015610f7057600080fd5b5061103260048036036080811015610f8757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fee57600080fd5b82018360208201111561100057600080fd5b8035906020019184600183028401116401000000008311171561102257600080fd5b909192939192939050505061393a565b005b34801561104057600080fd5b5061106d6004803603602081101561105757600080fd5b8101908080359060200190929190505050613991565b6040518082815260200191505060405180910390f35b34801561108f57600080fd5b506110bc600480360360208110156110a657600080fd5b81019080803590602001909291905050506139a9565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156110fc5780820151818401526020810190506110e1565b50505050905090810190601f1680156111295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561114357600080fd5b506111706004803603602081101561115a57600080fd5b8101908080359060200190929190505050613b08565b6040518082815260200191505060405180910390f35b61118e613f94565b005b34801561119c57600080fd5b506111a561407b565b005b3480156111b357600080fd5b506113fe60048036036101208110156111cb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561123257600080fd5b82018360208201111561124457600080fd5b8035906020019184602083028401116401000000008311171561126657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803590602001906401000000008111156112d057600080fd5b8201836020820111156112e257600080fd5b8035906020019184602083028401116401000000008311171561130457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803590602001909291908035906020019064010000000081111561137857600080fd5b82018360208201111561138a57600080fd5b803590602001918460018302840111640100000000831117156113ac57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506141a0565b60405180821515815260200191505060405180910390f35b34801561142257600080fd5b506114656004803603602081101561143957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506147f0565b6040518082815260200191505060405180910390f35b34801561148757600080fd5b506114ea6004803603604081101561149e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614809565b60405180821515815260200191505060405180910390f35b34801561150e57600080fd5b506115456004803603604081101561152557600080fd5b81019080803590602001909291908035906020019092919050505061489d565b005b34801561155357600080fd5b50611707600480360361010081101561156b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156115d257600080fd5b8201836020820111156115e457600080fd5b8035906020019184602083028401116401000000008311171561160657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291908035906020019064010000000081111561167057600080fd5b82018360208201111561168257600080fd5b803590602001918460208302840111640100000000831117156116a457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803590602001909291905050506149da565b6040518082815260200191505060405180910390f35b600060016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b614e2081565b600f60149054906101000a900460ff1681565b606060088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118365780601f1061180b57610100808354040283529160200191611836565b820191906000526020600020905b81548152906001019060200180831161181957829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c696420746f6b656e2e00000000000000000000000000000000000081525060200191505060405180910390fd5b6004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611a4e5750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611ac0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f43616e6e6f74206f7065726174652e000000000000000000000000000000000081525060200191505060405180910390fd5b82600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c696420746f6b656e2e00000000000000000000000000000000000081525060200191505060405180910390fd5b60006002600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611c0857600080fd5b856004600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b614e3760009054906101000a900460ff1615611cd857600080fd5b6001614e3760006101000a81548160ff021916908315150217905550614e3460009054906101000a900460ff1615611d78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4d61726b6574206973207061757365642e00000000000000000000000000000081525060200191505060405180910390fd5b8873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611e1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f43616e277420616363657074206f6e6573206f776e2074726164652e0000000081525060200191505060405180910390fd5b60006040518061010001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018881526020018781526020018681526020018581526020018481525090506000341115611f7357611ee034614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a5d90919063ffffffff16565b614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b600073ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff161480611fe157503373ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff16145b612053576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4e6f742074686520726563697069656e74206f662074686973206f666665722e81525060200191505060405180910390fd5b6120648a8a8a8a8a8a8a8a8a6141a0565b6120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5472616465206e6f742076616c69642e0000000000000000000000000000000081525060200191505060405180910390fd5b8060800151614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612173576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615e326024913960400191505060405180910390fd5b6121ce8160400151614e356000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a7790919063ffffffff16565b614e356000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061226d8160400151614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a5d90919063ffffffff16565b614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506123088160800151614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a7790919063ffffffff16565b614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506123a78160800151614e356000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a5d90919063ffffffff16565b614e356000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b8751811015612425576124183389838151811061240b57fe5b6020026020010151614a91565b80806001019150506123f2565b5060005b855181101561245c5761244f8b87838151811061244257fe5b6020026020010151614a91565b8080600101915050612429565b50600061246882614b46565b90506001614e36600083815260200190815260200160002060006101000a81548160ff021916908315150217905550816000015173ffffffffffffffffffffffffffffffffffffffff16817f753d4db383bcac616c2e2651156bc71c1ec81c0d5509071a85e3f565568765a3338560400151866060015187608001518860a00151604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018060200184815260200180602001838103835286818151815260200191508051906020019060200280838360005b8381101561255857808201518184015260208101905061253d565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561259a57808201518184015260208101905061257f565b5050505090500197505050505050505060405180910390a350506000614e3760006101000a81548160ff021916908315150217905550505050505050505050565b6000614e3760009054906101000a900460ff16156125f857600080fd5b6001614e3760006101000a81548160ff021916908315150217905550600f60159054906101000a900460ff16612696576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f53616c65206e6f7420737461727465642e00000000000000000000000000000081525060200191505060405180910390fd5b614e3460009054906101000a900460ff16156126b157600080fd5b612328600b541061272a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53616c65206c696d697420726561636865642e0000000000000000000000000081525060200191505060405180910390fd5b6000612734613712565b9050803410156127ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e73756666696369656e742066756e647320746f2070757263686173652e0081525060200191505060405180910390fd5b8034111561280e573373ffffffffffffffffffffffffffffffffffffffff166108fc6127e18334614a7790919063ffffffff16565b9081150290604051600060405180830381858888f1935050505015801561280c573d6000803e3d6000fd5b505b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612876573d6000803e3d6000fd5b50600b60008154809291906001019190505550612894336000614ca0565b9150506000614e3760006101000a81548160ff02191690831515021790555090565b6000600a54905090565b60115481565b61232881565b8060006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061299d57503373ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80612a2e5750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612aa0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f43616e6e6f74207472616e736665722e0000000000000000000000000000000081525060200191505060405180910390fd5b82600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c696420746f6b656e2e00000000000000000000000000000000000081525060200191505060405180910390fd5b60006002600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c50576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f57726f6e672066726f6d20616464726573732e0000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415612cf3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f43616e6e6f742073656e6420746f203078302e0000000000000000000000000081525060200191505060405180910390fd5b612cfd8686614a91565b50505050505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612dc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4f6e6c79206465706c6f7965722e00000000000000000000000000000000000081525060200191505060405180910390fd5b60005b82811015612ded57612ddf826000614ca0565b508080600101915050612dcc565b505050565b614e3760009054906101000a900460ff1615612e0d57600080fd5b6001614e3760006101000a81548160ff021916908315150217905550614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115612e7657600080fd5b612ec981614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a7790919063ffffffff16565b614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060003373ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d8060008114612f6d576040519150601f19603f3d011682016040523d82523d6000602084013e612f72565b606091505b5050905080612f8057600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364836040518082815260200191505060405180910390a2506000614e3760006101000a81548160ff02191690831515021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050821061303e57600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061308857fe5b9060005260206000200154905092915050565b600f60159054906101000a900460ff1681565b60125481565b614e3460009054906101000a900460ff1681565b6130e383838360405180602001604052806000815250614e94565b505050565b6000613101600b54612328614a7790919063ffffffff16565b905090565b60008082101580156131195750614e2082105b61312257600080fd5b600182019050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146131f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4f6e6c79206465706c6f7965722e00000000000000000000000000000000000081525060200191505060405180910390fd5b614e3460019054906101000a900460ff1615613274576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f436f6e7472616374207365616c65642e0000000000000000000000000000000081525060200191505060405180910390fd5b80614e3460006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561330057600080fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156133d15780601f106133a6576101008083540402835291602001916133d1565b820191906000526020600020905b8154815290600101906020018083116133b457829003601f168201915b505050505081565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461349c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4f6e6c79206465706c6f7965722e00000000000000000000000000000000000081525060200191505060405180910390fd5b6001614e3460016101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134f557600080fd5b6134fe82615402565b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614613589576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615f126025913960400191505060405180910390fd5b60006040518061010001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff16815260200188815260200187815260200186815260200185815260200184815260200183815250905060006135fe82614b46565b90506001614e36600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507f3f9cb69d022b6ec319f86f2df848bcce01f2fc51c9f86396779a8081cf6ca2ea816040518082815260200191505060405180910390a150505050505050505050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156137085780601f106136dd57610100808354040283529160200191613708565b820191906000526020600020905b8154815290600101906020018083116136eb57829003601f168201915b5050505050905090565b6000600f60159054906101000a900460ff16613796576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f53616c65206e6f7420737461727465642e00000000000000000000000000000081525060200191505060405180910390fd5b60006137ad60115442614a7790919063ffffffff16565b905060125481106137c2576000915050613803565b6137ff6012546137f16010546137e385601254614a7790919063ffffffff16565b61544e90919063ffffffff16565b61548290919063ffffffff16565b9150505b90565b614e366020528060005260406000206000915054906101000a900460ff1681565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b614e3460019054906101000a900460ff1681565b61398a85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050614e94565b5050505050565b60036020528060005260406000206000915090505481565b606081600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613a82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c696420746f6b656e2e00000000000000000000000000000000000081525060200191505060405180910390fd5b613a8b83615496565b6040516020018080615e0d6025913960250182805190602001908083835b60208310613acc5780518252602082019150602081019050602083039250613aa9565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052915050919050565b6000614e3760009054906101000a900460ff1615613b2557600080fd5b6001614e3760006101000a81548160ff021916908315150217905550600f60149054906101000a900460ff16613b5a57600080fd5b614e3460009054906101000a900460ff1615613b7557600080fd5b600082118015613b8757506129108211155b613bf9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f496e76616c69642070756e6b2f676c79706820696e6465782e0000000000000081525060200191505060405180910390fd5b6000600360008481526020019081526020016000205414613c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615e566023913960400191505060405180910390fd5b612710821115613ddc576000613c8661271084614a7790919063ffffffff16565b90503373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613d1257600080fd5b505afa158015613d26573d6000803e3d6000fd5b505050506040513d6020811015613d3c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614613dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e6f7420746865206f776e6572206f66207468697320676c7970682e0000000081525060200191505060405180910390fd5b50613f44565b6000613df2600184614a7790919063ffffffff16565b90503373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166358178168836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613e7e57600080fd5b505afa158015613e92573d6000803e3d6000fd5b505050506040513d6020811015613ea857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614613f42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e6f7420746865206f776e6572206f6620746869732070756e6b2e000000000081525060200191505060405180910390fd5b505b6003600083815260200190815260200160002060008154809291906001019190505550613f713383614ca0565b90506000614e3760006101000a81548160ff021916908315150217905550919050565b613fe734614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a5d90919063ffffffff16565b614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461413e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4f6e6c79206465706c6f7965722e00000000000000000000000000000000000081525060200191505060405180910390fd5b600f60149054906101000a900460ff1661415757600080fd5b6000600f60146101000a81548160ff0219169083151502179055507f5f00e567de9d29d9d36405c34b1164390da767fb97a1fb7d6bf3680ff90a3b2660405160405180910390a1565b6000806040518061010001604052808c73ffffffffffffffffffffffffffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a8152602001898152602001888152602001878152602001868152602001858152509050600061421682614b46565b905060001515614e36600083815260200190815260200160002060009054906101000a900460ff161515146142b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5472616465206f66666572207761732063616e63656c6c65642e00000000000081525060200191505060405180910390fd5b60006142be836155dd565b90506142cf8360000151828761563d565b614341576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5369676e6174757265206e6f742076616c69642e00000000000000000000000081525060200191505060405180910390fd5b8260c0015142106143ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5472616465206f6666657220657870697265642e00000000000000000000000081525060200191505060405180910390fd5b60008b14806143c95750600089145b61443b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f6e6c79206f6e652073696465206f66207472616465206d757374207061792e81525060200191505060405180910390fd5b60008a51118061444c575060008851115b6144be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4f6e652073696465206d757374206f6666657220746f6b656e732e000000000081525060200191505060405180910390fd5b8260400151614e356000856000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561455f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180615eba6027913960400191505060405180910390fd5b60005b83606001515181101561464e57836000015173ffffffffffffffffffffffffffffffffffffffff16600260008660600151848151811061459e57fe5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614641576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180615f376031913960400191505060405180910390fd5b8080600101915050614562565b50600073ffffffffffffffffffffffffffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff1614156146eb5760008360a0015151146146e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526041815260200180615e796041913960600191505060405180910390fd5b6147dc565b60005b8360a00151518110156147da57836020015173ffffffffffffffffffffffffffffffffffffffff16600260008660a00151848151811061472a57fe5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146147cd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180615ee16031913960400191505060405180910390fd5b80806001019150506146ee565b505b600193505050509998505050505050505050565b614e356020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4f6e6c79206465706c6f7965722e00000000000000000000000000000000000081525060200191505060405180910390fd5b600f60159054906101000a900460ff161561497a57600080fd5b8160108190555080601281905550426011819055506001600f60156101000a81548160ff0219169083151502179055507f771cfe172460b7d64cc46cca57a1e1f40f52b47cf1d16fe30c78a2935b3dd58060405160405180910390a15050565b6000806040518061010001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001898152602001888152602001878152602001868152602001858152602001848152509050614a4e81614b46565b91505098975050505050505050565b6000818301905082811015614a7157600080fd5b92915050565b600082821115614a8657600080fd5b818303905092915050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050614ad282615772565b614adc8183615813565b614ae68383615ac6565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000816000015182602001518360400151846060015160405160200180828051906020019060200280838360005b83811015614b8f578082015181840152602081019050614b74565b505050509050019150506040516020818303038152906040528051906020012085608001518660a0015160405160200180828051906020019060200280838360005b83811015614bec578082015181840152602081019050614bd1565b50505050905001915050604051602081830303815290604052805190602001208760c001518860e00151604051602001808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff16815260200187815260200186815260200185815260200184815260200183815260200182815260200198505050505050505050604051602081830303815290604052805190602001209050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614d44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f43616e6e6f74206d696e7420746f203078302e0000000000000000000000000081525060200191505060405180910390fd5b614e20600a5410614dbd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e206c696d697420726561636865642e00000000000000000000000081525060200191505060405180910390fd5b6000614dc7615cc4565b90506001600a5401600a81905550614ddf8482615ac6565b8373ffffffffffffffffffffffffffffffffffffffff16817f4e3883c75cc9c752bb1db2e406a822e4a75067ae77ad9a0a4d179f2709b9e1f6856040518082815260200191505060405180910390a3808473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48091505092915050565b8160006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480614f6557503373ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80614ff65750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b615068576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f43616e6e6f74207472616e736665722e0000000000000000000000000000000081525060200191505060405180910390fd5b83600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561513f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c696420746f6b656e2e00000000000000000000000000000000000081525060200191505060405180910390fd5b60006002600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614615218576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f496e636f7272656374206f776e65722e0000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141561525257600080fd5b61525c8787614a91565b61526587615df9565b156153f85760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156153195780820151818401526020810190506152fe565b50505050905090810190601f1680156153465780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561536857600080fd5b505af115801561537c573d6000803e3d6000fd5b505050506040513d602081101561539257600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146153f657600080fd5b505b5050505050505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600080831415615461576000905061547c565b81830290508183828161547057fe5b041461547b57600080fd5b5b92915050565b600081838161548d57fe5b04905092915050565b606060008214156154de576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506155d8565b600082905060005b60008214615508578080600101915050600a828161550057fe5b0491506154e6565b60008167ffffffffffffffff8111801561552157600080fd5b506040519080825280601f01601f1916602001820160405280156155545781602001600182028036833780820191505090505b50905060006001830390508593505b600084146155d057600a848161557557fe5b0660300160f81b8282806001900393508151811061558f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816155c857fe5b049350615563565b819450505050505b919050565b60006155e882614b46565b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561567857600080fd5b604182511461568657600080fd5b60008060006020850151925060408501519150606085015160001a9050601b8160ff1610156156b657601b810190505b601b8160ff1614806156cb5750601c8160ff16145b6156d457600080fd5b60018682858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561572e573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161493505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615810576004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b8173ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146158e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f496e636f7272656374206f776e65722e0000000000000000000000000000000081525060200191505060405180910390fd5b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600060076000838152602001908152602001600020549050600061598d6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050614a7790919063ffffffff16565b9050818114615a62576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106159e257fe5b9060005260206000200154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110615a3a57fe5b9060005260206000200181905550826007600083815260200190815260200160002081905550505b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480615aaa57fe5b6001900381819060005260206000200160009055905550505050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615b9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f43616e6e6f74206164642c20616c7265616479206f776e65642e00000000000081525060200191505060405180910390fd5b816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055615ca96001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050614a7790919063ffffffff16565b60076000838152602001908152602001600020819055505050565b600080600a54614e20039050600081601354334442604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1660601b81526014018381526020018281526020019450505050506040516020818303038152906040528051906020012060001c81615d3757fe5b069050600080601483614e208110615d4b57fe5b015414615d6957601482614e208110615d6057fe5b01549050615d6d565b8190505b6000601460018503614e208110615d8057fe5b01541415615da45760018303601483614e208110615d9a57fe5b0181905550615dcb565b601460018403614e208110615db557fe5b0154601483614e208110615dc557fe5b01819055505b601360008154809291906001019190505550615df1600182614a5d90919063ffffffff16565b935050505090565b600080823b90506000811191505091905056fe68747470733a2f2f6d6565626974732e6c617276616c6162732e636f6d2f6d65656269742f496e73756666696369656e742066756e647320746f20657865637574652074726164652e416c7265616479206d696e746564207769746820746869732070756e6b2f676c7970684966207472616465206973206f66666572656420746f20616e79626f64792c2063616e6e6f74207370656369667920746f6b656e732066726f6d2074616b65722e4d616b657220646f6573206e6f7420686176652073756666696369656e742062616c616e63652e4174206c65617374206f6e652074616b657220746f6b656e20646f65736e27742062656c6f6e6720746f2074616b65722e4f6e6c7920746865206d616b65722063616e2063616e63656c2074686973206f666665722e4174206c65617374206f6e65206d616b657220746f6b656e20646f65736e27742062656c6f6e6720746f206d616b65722ea26469706673582212208c6207b4011c283c186af7c3ff1174c8465f56c8edadff785faab511352d0c0464736f6c63430007060033516d66585967665831714e667a51364e5279466e75706e695a7573617346504d6569576e356161446e783759586f000000000000000000000000b47e3cd837ddf8e4c57f05d70ab865de6e193bbb000000000000000000000000d4e4078ca3495de5b1d4db434bebc5a986197782000000000000000000000000c352b534e8b987e036a93539fd6897f53488e56a
60806040526040518060600160405280602e81526020016200643f602e91396000908051906020019062000035929190620003dc565b506040518060400160405280600781526020017f4d656562697473000000000000000000000000000000000000000000000000008152506008908051906020019062000083929190620003dc565b506040518060400160405280600381526020017fe29a87000000000000000000000000000000000000000000000000000000000081525060099080519060200190620000d1929190620003dc565b506000600a556000600b556001600f60146101000a81548160ff0219169083151502179055506000600f60156101000a81548160ff02191690831515021790555060006013556000614e3760006101000a81548160ff0219169083151502179055503480156200014057600080fd5b506040516200646d3803806200646d833981810160405260608110156200016657600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505060018060006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060018060006380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600180600063780e9d6360e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001806000635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000492565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000414576000855562000460565b82601f106200042f57805160ff191683800117855562000460565b8280016001018555821562000460579182015b828111156200045f57825182559160200191906001019062000442565b5b5090506200046f919062000473565b5090565b5b808211156200048e57600081600090555060010162000474565b5090565b615f9d80620004a26000396000f3fe60806040526004361061025c5760003560e01c80635ec390d811610144578063b88d4fde116100b6578063d357b01e1161007a578063d357b01e14611190578063d3d6c767146111a7578063d8f3790f14611416578063e985e9c51461147b578063f4f3122e14611502578063f592934c146115475761025c565b8063b88d4fde14610f64578063b9f7e21814611034578063c87b56dd14611083578063d09229a814611137578063d0e30db0146111865761025c565b80638a84fe00116101085780638a84fe0014610c0c57806395d89b4114610dce57806398d5fdca14610e5e5780639f7bf76214610e89578063a22cb46514610eda578063b650163714610f375761025c565b80635ec390d814610a5e5780636352211e14610a9b578063646c2e3314610b0057806368bd580e14610b9057806370a0823114610ba75761025c565b8063212e8f67116101dd57806333bc1c5c116101a157806333bc1c5c146108e45780633711d9fb146109115780633a283bd21461093c57806342842e0e1461096957806344c66be7146109e45780634f6ccce714610a0f5761025c565b8063212e8f671461073957806323b872dd146107645780632d1a12f6146107df5780632e1a7d4d1461083a5780632f745c59146108755761025c565b8063095ea7b311610224578063095ea7b31461041e5780630faadcf6146104795780631249c58b146106c557806318160ddd146106e35780631cbaee2d1461070e5761025c565b806301ffc9a714610261578063031bd4c4146102d15780630614a6ba146102fc57806306fdde0314610329578063081812fc146103b9575b600080fd5b34801561026d57600080fd5b506102b96004803603602081101561028457600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061171d565b60405180821515815260200191505060405180910390f35b3480156102dd57600080fd5b506102e6611785565b6040518082815260200191505060405180910390f35b34801561030857600080fd5b5061031161178b565b60405180821515815260200191505060405180910390f35b34801561033557600080fd5b5061033e61179e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561037e578082015181840152602081019050610363565b50505050905090810190601f1680156103ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103c557600080fd5b506103f2600480360360208110156103dc57600080fd5b8101908080359060200190929190505050611840565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561042a57600080fd5b506104776004803603604081101561044157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611955565b005b6106c3600480360361012081101561049057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156104f757600080fd5b82018360208201111561050957600080fd5b8035906020019184602083028401116401000000008311171561052b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291908035906020019064010000000081111561059557600080fd5b8201836020820111156105a757600080fd5b803590602001918460208302840111640100000000831117156105c957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803590602001909291908035906020019064010000000081111561063d57600080fd5b82018360208201111561064f57600080fd5b8035906020019184600183028401116401000000008311171561067157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611cbd565b005b6106cd6125db565b6040518082815260200191505060405180910390f35b3480156106ef57600080fd5b506106f86128b6565b6040518082815260200191505060405180910390f35b34801561071a57600080fd5b506107236128c0565b6040518082815260200191505060405180910390f35b34801561074557600080fd5b5061074e6128c6565b6040518082815260200191505060405180910390f35b34801561077057600080fd5b506107dd6004803603606081101561078757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506128cc565b005b3480156107eb57600080fd5b506108386004803603604081101561080257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d06565b005b34801561084657600080fd5b506108736004803603602081101561085d57600080fd5b8101908080359060200190929190505050612df2565b005b34801561088157600080fd5b506108ce6004803603604081101561089857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612fee565b6040518082815260200191505060405180910390f35b3480156108f057600080fd5b506108f961309b565b60405180821515815260200191505060405180910390f35b34801561091d57600080fd5b506109266130ae565b6040518082815260200191505060405180910390f35b34801561094857600080fd5b506109516130b4565b60405180821515815260200191505060405180910390f35b34801561097557600080fd5b506109e26004803603606081101561098c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506130c8565b005b3480156109f057600080fd5b506109f96130e8565b6040518082815260200191505060405180910390f35b348015610a1b57600080fd5b50610a4860048036036020811015610a3257600080fd5b8101908080359060200190929190505050613106565b6040518082815260200191505060405180910390f35b348015610a6a57600080fd5b50610a9960048036036020811015610a8157600080fd5b8101908080351515906020019092919050505061312d565b005b348015610aa757600080fd5b50610ad460048036036020811015610abe57600080fd5b8101908080359060200190929190505050613292565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b0c57600080fd5b50610b1561333b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b55578082015181840152602081019050610b3a565b50505050905090810190601f168015610b825780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b9c57600080fd5b50610ba56133d9565b005b348015610bb357600080fd5b50610bf660048036036020811015610bca57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506134ba565b6040518082815260200191505060405180910390f35b348015610c1857600080fd5b50610dcc6004803603610100811015610c3057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610c9757600080fd5b820183602082011115610ca957600080fd5b80359060200191846020830284011164010000000083111715610ccb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190640100000000811115610d3557600080fd5b820183602082011115610d4757600080fd5b80359060200191846020830284011164010000000083111715610d6957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190929190505050613505565b005b348015610dda57600080fd5b50610de3613670565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e23578082015181840152602081019050610e08565b50505050905090810190601f168015610e505780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e6a57600080fd5b50610e73613712565b6040518082815260200191505060405180910390f35b348015610e9557600080fd5b50610ec260048036036020811015610eac57600080fd5b8101908080359060200190929190505050613806565b60405180821515815260200191505060405180910390f35b348015610ee657600080fd5b50610f3560048036036040811015610efd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613827565b005b348015610f4357600080fd5b50610f4c613926565b60405180821515815260200191505060405180910390f35b348015610f7057600080fd5b5061103260048036036080811015610f8757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fee57600080fd5b82018360208201111561100057600080fd5b8035906020019184600183028401116401000000008311171561102257600080fd5b909192939192939050505061393a565b005b34801561104057600080fd5b5061106d6004803603602081101561105757600080fd5b8101908080359060200190929190505050613991565b6040518082815260200191505060405180910390f35b34801561108f57600080fd5b506110bc600480360360208110156110a657600080fd5b81019080803590602001909291905050506139a9565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156110fc5780820151818401526020810190506110e1565b50505050905090810190601f1680156111295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561114357600080fd5b506111706004803603602081101561115a57600080fd5b8101908080359060200190929190505050613b08565b6040518082815260200191505060405180910390f35b61118e613f94565b005b34801561119c57600080fd5b506111a561407b565b005b3480156111b357600080fd5b506113fe60048036036101208110156111cb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561123257600080fd5b82018360208201111561124457600080fd5b8035906020019184602083028401116401000000008311171561126657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803590602001906401000000008111156112d057600080fd5b8201836020820111156112e257600080fd5b8035906020019184602083028401116401000000008311171561130457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803590602001909291908035906020019064010000000081111561137857600080fd5b82018360208201111561138a57600080fd5b803590602001918460018302840111640100000000831117156113ac57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506141a0565b60405180821515815260200191505060405180910390f35b34801561142257600080fd5b506114656004803603602081101561143957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506147f0565b6040518082815260200191505060405180910390f35b34801561148757600080fd5b506114ea6004803603604081101561149e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614809565b60405180821515815260200191505060405180910390f35b34801561150e57600080fd5b506115456004803603604081101561152557600080fd5b81019080803590602001909291908035906020019092919050505061489d565b005b34801561155357600080fd5b50611707600480360361010081101561156b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156115d257600080fd5b8201836020820111156115e457600080fd5b8035906020019184602083028401116401000000008311171561160657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291908035906020019064010000000081111561167057600080fd5b82018360208201111561168257600080fd5b803590602001918460208302840111640100000000831117156116a457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803590602001909291905050506149da565b6040518082815260200191505060405180910390f35b600060016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b614e2081565b600f60149054906101000a900460ff1681565b606060088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118365780601f1061180b57610100808354040283529160200191611836565b820191906000526020600020905b81548152906001019060200180831161181957829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c696420746f6b656e2e00000000000000000000000000000000000081525060200191505060405180910390fd5b6004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611a4e5750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611ac0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f43616e6e6f74206f7065726174652e000000000000000000000000000000000081525060200191505060405180910390fd5b82600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c696420746f6b656e2e00000000000000000000000000000000000081525060200191505060405180910390fd5b60006002600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611c0857600080fd5b856004600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b614e3760009054906101000a900460ff1615611cd857600080fd5b6001614e3760006101000a81548160ff021916908315150217905550614e3460009054906101000a900460ff1615611d78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4d61726b6574206973207061757365642e00000000000000000000000000000081525060200191505060405180910390fd5b8873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611e1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f43616e277420616363657074206f6e6573206f776e2074726164652e0000000081525060200191505060405180910390fd5b60006040518061010001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018881526020018781526020018681526020018581526020018481525090506000341115611f7357611ee034614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a5d90919063ffffffff16565b614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b600073ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff161480611fe157503373ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff16145b612053576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4e6f742074686520726563697069656e74206f662074686973206f666665722e81525060200191505060405180910390fd5b6120648a8a8a8a8a8a8a8a8a6141a0565b6120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5472616465206e6f742076616c69642e0000000000000000000000000000000081525060200191505060405180910390fd5b8060800151614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612173576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615e326024913960400191505060405180910390fd5b6121ce8160400151614e356000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a7790919063ffffffff16565b614e356000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061226d8160400151614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a5d90919063ffffffff16565b614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506123088160800151614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a7790919063ffffffff16565b614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506123a78160800151614e356000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a5d90919063ffffffff16565b614e356000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b8751811015612425576124183389838151811061240b57fe5b6020026020010151614a91565b80806001019150506123f2565b5060005b855181101561245c5761244f8b87838151811061244257fe5b6020026020010151614a91565b8080600101915050612429565b50600061246882614b46565b90506001614e36600083815260200190815260200160002060006101000a81548160ff021916908315150217905550816000015173ffffffffffffffffffffffffffffffffffffffff16817f753d4db383bcac616c2e2651156bc71c1ec81c0d5509071a85e3f565568765a3338560400151866060015187608001518860a00151604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018060200184815260200180602001838103835286818151815260200191508051906020019060200280838360005b8381101561255857808201518184015260208101905061253d565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561259a57808201518184015260208101905061257f565b5050505090500197505050505050505060405180910390a350506000614e3760006101000a81548160ff021916908315150217905550505050505050505050565b6000614e3760009054906101000a900460ff16156125f857600080fd5b6001614e3760006101000a81548160ff021916908315150217905550600f60159054906101000a900460ff16612696576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f53616c65206e6f7420737461727465642e00000000000000000000000000000081525060200191505060405180910390fd5b614e3460009054906101000a900460ff16156126b157600080fd5b612328600b541061272a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53616c65206c696d697420726561636865642e0000000000000000000000000081525060200191505060405180910390fd5b6000612734613712565b9050803410156127ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e73756666696369656e742066756e647320746f2070757263686173652e0081525060200191505060405180910390fd5b8034111561280e573373ffffffffffffffffffffffffffffffffffffffff166108fc6127e18334614a7790919063ffffffff16565b9081150290604051600060405180830381858888f1935050505015801561280c573d6000803e3d6000fd5b505b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612876573d6000803e3d6000fd5b50600b60008154809291906001019190505550612894336000614ca0565b9150506000614e3760006101000a81548160ff02191690831515021790555090565b6000600a54905090565b60115481565b61232881565b8060006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061299d57503373ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80612a2e5750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612aa0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f43616e6e6f74207472616e736665722e0000000000000000000000000000000081525060200191505060405180910390fd5b82600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c696420746f6b656e2e00000000000000000000000000000000000081525060200191505060405180910390fd5b60006002600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c50576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f57726f6e672066726f6d20616464726573732e0000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415612cf3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f43616e6e6f742073656e6420746f203078302e0000000000000000000000000081525060200191505060405180910390fd5b612cfd8686614a91565b50505050505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612dc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4f6e6c79206465706c6f7965722e00000000000000000000000000000000000081525060200191505060405180910390fd5b60005b82811015612ded57612ddf826000614ca0565b508080600101915050612dcc565b505050565b614e3760009054906101000a900460ff1615612e0d57600080fd5b6001614e3760006101000a81548160ff021916908315150217905550614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115612e7657600080fd5b612ec981614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a7790919063ffffffff16565b614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060003373ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d8060008114612f6d576040519150601f19603f3d011682016040523d82523d6000602084013e612f72565b606091505b5050905080612f8057600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364836040518082815260200191505060405180910390a2506000614e3760006101000a81548160ff02191690831515021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050821061303e57600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061308857fe5b9060005260206000200154905092915050565b600f60159054906101000a900460ff1681565b60125481565b614e3460009054906101000a900460ff1681565b6130e383838360405180602001604052806000815250614e94565b505050565b6000613101600b54612328614a7790919063ffffffff16565b905090565b60008082101580156131195750614e2082105b61312257600080fd5b600182019050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146131f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4f6e6c79206465706c6f7965722e00000000000000000000000000000000000081525060200191505060405180910390fd5b614e3460019054906101000a900460ff1615613274576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f436f6e7472616374207365616c65642e0000000000000000000000000000000081525060200191505060405180910390fd5b80614e3460006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561330057600080fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156133d15780601f106133a6576101008083540402835291602001916133d1565b820191906000526020600020905b8154815290600101906020018083116133b457829003601f168201915b505050505081565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461349c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4f6e6c79206465706c6f7965722e00000000000000000000000000000000000081525060200191505060405180910390fd5b6001614e3460016101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134f557600080fd5b6134fe82615402565b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614613589576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615f126025913960400191505060405180910390fd5b60006040518061010001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff16815260200188815260200187815260200186815260200185815260200184815260200183815250905060006135fe82614b46565b90506001614e36600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507f3f9cb69d022b6ec319f86f2df848bcce01f2fc51c9f86396779a8081cf6ca2ea816040518082815260200191505060405180910390a150505050505050505050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156137085780601f106136dd57610100808354040283529160200191613708565b820191906000526020600020905b8154815290600101906020018083116136eb57829003601f168201915b5050505050905090565b6000600f60159054906101000a900460ff16613796576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f53616c65206e6f7420737461727465642e00000000000000000000000000000081525060200191505060405180910390fd5b60006137ad60115442614a7790919063ffffffff16565b905060125481106137c2576000915050613803565b6137ff6012546137f16010546137e385601254614a7790919063ffffffff16565b61544e90919063ffffffff16565b61548290919063ffffffff16565b9150505b90565b614e366020528060005260406000206000915054906101000a900460ff1681565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b614e3460019054906101000a900460ff1681565b61398a85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050614e94565b5050505050565b60036020528060005260406000206000915090505481565b606081600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613a82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c696420746f6b656e2e00000000000000000000000000000000000081525060200191505060405180910390fd5b613a8b83615496565b6040516020018080615e0d6025913960250182805190602001908083835b60208310613acc5780518252602082019150602081019050602083039250613aa9565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052915050919050565b6000614e3760009054906101000a900460ff1615613b2557600080fd5b6001614e3760006101000a81548160ff021916908315150217905550600f60149054906101000a900460ff16613b5a57600080fd5b614e3460009054906101000a900460ff1615613b7557600080fd5b600082118015613b8757506129108211155b613bf9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f496e76616c69642070756e6b2f676c79706820696e6465782e0000000000000081525060200191505060405180910390fd5b6000600360008481526020019081526020016000205414613c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615e566023913960400191505060405180910390fd5b612710821115613ddc576000613c8661271084614a7790919063ffffffff16565b90503373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613d1257600080fd5b505afa158015613d26573d6000803e3d6000fd5b505050506040513d6020811015613d3c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614613dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e6f7420746865206f776e6572206f66207468697320676c7970682e0000000081525060200191505060405180910390fd5b50613f44565b6000613df2600184614a7790919063ffffffff16565b90503373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166358178168836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613e7e57600080fd5b505afa158015613e92573d6000803e3d6000fd5b505050506040513d6020811015613ea857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614613f42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e6f7420746865206f776e6572206f6620746869732070756e6b2e000000000081525060200191505060405180910390fd5b505b6003600083815260200190815260200160002060008154809291906001019190505550613f713383614ca0565b90506000614e3760006101000a81548160ff021916908315150217905550919050565b613fe734614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a5d90919063ffffffff16565b614e3560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461413e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4f6e6c79206465706c6f7965722e00000000000000000000000000000000000081525060200191505060405180910390fd5b600f60149054906101000a900460ff1661415757600080fd5b6000600f60146101000a81548160ff0219169083151502179055507f5f00e567de9d29d9d36405c34b1164390da767fb97a1fb7d6bf3680ff90a3b2660405160405180910390a1565b6000806040518061010001604052808c73ffffffffffffffffffffffffffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a8152602001898152602001888152602001878152602001868152602001858152509050600061421682614b46565b905060001515614e36600083815260200190815260200160002060009054906101000a900460ff161515146142b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5472616465206f66666572207761732063616e63656c6c65642e00000000000081525060200191505060405180910390fd5b60006142be836155dd565b90506142cf8360000151828761563d565b614341576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5369676e6174757265206e6f742076616c69642e00000000000000000000000081525060200191505060405180910390fd5b8260c0015142106143ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5472616465206f6666657220657870697265642e00000000000000000000000081525060200191505060405180910390fd5b60008b14806143c95750600089145b61443b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f6e6c79206f6e652073696465206f66207472616465206d757374207061792e81525060200191505060405180910390fd5b60008a51118061444c575060008851115b6144be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4f6e652073696465206d757374206f6666657220746f6b656e732e000000000081525060200191505060405180910390fd5b8260400151614e356000856000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561455f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180615eba6027913960400191505060405180910390fd5b60005b83606001515181101561464e57836000015173ffffffffffffffffffffffffffffffffffffffff16600260008660600151848151811061459e57fe5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614641576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180615f376031913960400191505060405180910390fd5b8080600101915050614562565b50600073ffffffffffffffffffffffffffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff1614156146eb5760008360a0015151146146e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526041815260200180615e796041913960600191505060405180910390fd5b6147dc565b60005b8360a00151518110156147da57836020015173ffffffffffffffffffffffffffffffffffffffff16600260008660a00151848151811061472a57fe5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146147cd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180615ee16031913960400191505060405180910390fd5b80806001019150506146ee565b505b600193505050509998505050505050505050565b614e356020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4f6e6c79206465706c6f7965722e00000000000000000000000000000000000081525060200191505060405180910390fd5b600f60159054906101000a900460ff161561497a57600080fd5b8160108190555080601281905550426011819055506001600f60156101000a81548160ff0219169083151502179055507f771cfe172460b7d64cc46cca57a1e1f40f52b47cf1d16fe30c78a2935b3dd58060405160405180910390a15050565b6000806040518061010001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001898152602001888152602001878152602001868152602001858152602001848152509050614a4e81614b46565b91505098975050505050505050565b6000818301905082811015614a7157600080fd5b92915050565b600082821115614a8657600080fd5b818303905092915050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050614ad282615772565b614adc8183615813565b614ae68383615ac6565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000816000015182602001518360400151846060015160405160200180828051906020019060200280838360005b83811015614b8f578082015181840152602081019050614b74565b505050509050019150506040516020818303038152906040528051906020012085608001518660a0015160405160200180828051906020019060200280838360005b83811015614bec578082015181840152602081019050614bd1565b50505050905001915050604051602081830303815290604052805190602001208760c001518860e00151604051602001808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff16815260200187815260200186815260200185815260200184815260200183815260200182815260200198505050505050505050604051602081830303815290604052805190602001209050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614d44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f43616e6e6f74206d696e7420746f203078302e0000000000000000000000000081525060200191505060405180910390fd5b614e20600a5410614dbd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f546f6b656e206c696d697420726561636865642e00000000000000000000000081525060200191505060405180910390fd5b6000614dc7615cc4565b90506001600a5401600a81905550614ddf8482615ac6565b8373ffffffffffffffffffffffffffffffffffffffff16817f4e3883c75cc9c752bb1db2e406a822e4a75067ae77ad9a0a4d179f2709b9e1f6856040518082815260200191505060405180910390a3808473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48091505092915050565b8160006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480614f6557503373ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80614ff65750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b615068576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f43616e6e6f74207472616e736665722e0000000000000000000000000000000081525060200191505060405180910390fd5b83600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561513f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c696420746f6b656e2e00000000000000000000000000000000000081525060200191505060405180910390fd5b60006002600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614615218576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f496e636f7272656374206f776e65722e0000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141561525257600080fd5b61525c8787614a91565b61526587615df9565b156153f85760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156153195780820151818401526020810190506152fe565b50505050905090810190601f1680156153465780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561536857600080fd5b505af115801561537c573d6000803e3d6000fd5b505050506040513d602081101561539257600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146153f657600080fd5b505b5050505050505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600080831415615461576000905061547c565b81830290508183828161547057fe5b041461547b57600080fd5b5b92915050565b600081838161548d57fe5b04905092915050565b606060008214156154de576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506155d8565b600082905060005b60008214615508578080600101915050600a828161550057fe5b0491506154e6565b60008167ffffffffffffffff8111801561552157600080fd5b506040519080825280601f01601f1916602001820160405280156155545781602001600182028036833780820191505090505b50905060006001830390508593505b600084146155d057600a848161557557fe5b0660300160f81b8282806001900393508151811061558f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816155c857fe5b049350615563565b819450505050505b919050565b60006155e882614b46565b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561567857600080fd5b604182511461568657600080fd5b60008060006020850151925060408501519150606085015160001a9050601b8160ff1610156156b657601b810190505b601b8160ff1614806156cb5750601c8160ff16145b6156d457600080fd5b60018682858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561572e573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161493505050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615810576004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b8173ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146158e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f496e636f7272656374206f776e65722e0000000000000000000000000000000081525060200191505060405180910390fd5b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600060076000838152602001908152602001600020549050600061598d6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050614a7790919063ffffffff16565b9050818114615a62576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106159e257fe5b9060005260206000200154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110615a3a57fe5b9060005260206000200181905550826007600083815260200190815260200160002081905550505b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480615aaa57fe5b6001900381819060005260206000200160009055905550505050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615b9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f43616e6e6f74206164642c20616c7265616479206f776e65642e00000000000081525060200191505060405180910390fd5b816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055615ca96001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050614a7790919063ffffffff16565b60076000838152602001908152602001600020819055505050565b600080600a54614e20039050600081601354334442604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1660601b81526014018381526020018281526020019450505050506040516020818303038152906040528051906020012060001c81615d3757fe5b069050600080601483614e208110615d4b57fe5b015414615d6957601482614e208110615d6057fe5b01549050615d6d565b8190505b6000601460018503614e208110615d8057fe5b01541415615da45760018303601483614e208110615d9a57fe5b0181905550615dcb565b601460018403614e208110615db557fe5b0154601483614e208110615dc557fe5b01819055505b601360008154809291906001019190505550615df1600182614a5d90919063ffffffff16565b935050505090565b600080823b90506000811191505091905056fe68747470733a2f2f6d6565626974732e6c617276616c6162732e636f6d2f6d65656269742f496e73756666696369656e742066756e647320746f20657865637574652074726164652e416c7265616479206d696e746564207769746820746869732070756e6b2f676c7970684966207472616465206973206f66666572656420746f20616e79626f64792c2063616e6e6f74207370656369667920746f6b656e732066726f6d2074616b65722e4d616b657220646f6573206e6f7420686176652073756666696369656e742062616c616e63652e4174206c65617374206f6e652074616b657220746f6b656e20646f65736e27742062656c6f6e6720746f2074616b65722e4f6e6c7920746865206d616b65722063616e2063616e63656c2074686973206f666665722e4174206c65617374206f6e65206d616b657220746f6b656e20646f65736e27742062656c6f6e6720746f206d616b65722ea26469706673582212208c6207b4011c283c186af7c3ff1174c8465f56c8edadff785faab511352d0c0464736f6c63430007060033516d66585967665831714e667a51364e5279466e75706e695a7573617346504d6569576e356161446e783759586f000000000000000000000000b47e3cd837ddf8e4c57f05d70ab865de6e193bbb000000000000000000000000d4e4078ca3495de5b1d4db434bebc5a986197782000000000000000000000000c352b534e8b987e036a93539fd6897f53488e56a