ETH Price: $3,681.66 (+2.25%)

Contract

0xc3d37986C2aE7F62D7b834E80f1E09dBAA7EbC1B
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...207312852024-09-12 1:35:1179 days ago1726104911IN
0xc3d37986...BAA7EbC1B
0 ETH0.000104052.25417774
Transfer From198356552024-05-09 23:06:23204 days ago1715295983IN
0xc3d37986...BAA7EbC1B
0 ETH0.000227713.81231251
Set Approval For...194178912024-03-12 8:45:35263 days ago1710233135IN
0xc3d37986...BAA7EbC1B
0 ETH0.0025423355.06347573
Safe Transfer Fr...178571782023-08-06 16:42:47482 days ago1691340167IN
0xc3d37986...BAA7EbC1B
0 ETH0.0014949123.88382631
Mint Elonone Roc...175791582023-06-28 16:58:35521 days ago1687971515IN
0xc3d37986...BAA7EbC1B
0 ETH0.0019516329.36474331
Mint Elonone Roc...175791582023-06-28 16:58:35521 days ago1687971515IN
0xc3d37986...BAA7EbC1B
0 ETH0.0019516329.36474331
Mint Elonone Roc...175791582023-06-28 16:58:35521 days ago1687971515IN
0xc3d37986...BAA7EbC1B
0 ETH0.0019516329.36474331
Mint Elonone Roc...175791582023-06-28 16:58:35521 days ago1687971515IN
0xc3d37986...BAA7EbC1B
0 ETH0.0019516329.36474331
Mint Elonone Roc...175791572023-06-28 16:58:23521 days ago1687971503IN
0xc3d37986...BAA7EbC1B
0 ETH0.0020727731.18744208
Mint Elonone Roc...175791572023-06-28 16:58:23521 days ago1687971503IN
0xc3d37986...BAA7EbC1B
0 ETH0.0020774631.25790443
Mint Elonone Roc...175791572023-06-28 16:58:23521 days ago1687971503IN
0xc3d37986...BAA7EbC1B
0 ETH0.0020774631.25790443
Mint Elonone Roc...175791572023-06-28 16:58:23521 days ago1687971503IN
0xc3d37986...BAA7EbC1B
0 ETH0.0019598629.48857809
Mint Elonone Roc...175791572023-06-28 16:58:23521 days ago1687971503IN
0xc3d37986...BAA7EbC1B
0 ETH0.0020774631.25790443
Mint Elonone Roc...175791572023-06-28 16:58:23521 days ago1687971503IN
0xc3d37986...BAA7EbC1B
0 ETH0.0020774631.25790443
Mint Elonone Roc...175791572023-06-28 16:58:23521 days ago1687971503IN
0xc3d37986...BAA7EbC1B
0 ETH0.0021123531.78290443
Transfer From173584872023-05-28 15:44:47552 days ago1685288687IN
0xc3d37986...BAA7EbC1B
0 ETH0.002028133.93971528
Transfer From172225542023-05-09 11:20:23571 days ago1683631223IN
0xc3d37986...BAA7EbC1B
0 ETH0.0040175467.23241732
Set Approval For...172174242023-05-08 18:02:35571 days ago1683568955IN
0xc3d37986...BAA7EbC1B
0 ETH0.01023875222.16145812
Transfer From170326232023-04-12 14:49:59598 days ago1681310999IN
0xc3d37986...BAA7EbC1B
0 ETH0.0014323723.97040244
Transfer From170222852023-04-11 3:44:35599 days ago1681184675IN
0xc3d37986...BAA7EbC1B
0 ETH0.0008817120.67042888
Transfer From169441302023-03-31 2:11:23610 days ago1680228683IN
0xc3d37986...BAA7EbC1B
0 ETH0.0015736326.33426075
Set Approval For...167231932023-02-28 0:47:11641 days ago1677545231IN
0xc3d37986...BAA7EbC1B
0 ETH0.0009608120.84776385
Transfer From166154112023-02-12 21:38:35656 days ago1676237915IN
0xc3d37986...BAA7EbC1B
0 ETH0.0014986425.07936451
Transfer From165149862023-01-29 20:53:11670 days ago1675025591IN
0xc3d37986...BAA7EbC1B
0 ETH0.0014032823.48357921
Set Approval For...164026002023-01-14 4:17:35686 days ago1673669855IN
0xc3d37986...BAA7EbC1B
0 ETH0.0006134423.425367
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RocketdashMinting

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 77777 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-12
*/

/**
 *Submitted for verification at Etherscan.io on 2022-11-11
*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.15;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
 contract Pausable is Ownable {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function pause() external onlyOwner whenNotPaused {
        _paused = true;
        emit Paused(msg.sender);
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function unpause() external onlyOwner whenPaused {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}

/// @title Interface for ERC-721: Non-Fungible Tokens
interface InterfaceERC721 {
    // Required methods
    function totalSupply() external view returns (uint256 total);
    function balanceOf(address _owner) external view returns (uint256 balance);
    function ownerOf(uint256 _tokenId) external view returns (address owner);
    function approve(address _to, uint256 _tokenId) external;
    function transfer(address _to, uint256 _tokenId) external;
    function transferFrom(address _from, address _to, uint256 _tokenId) external;

    // Events
    event Transfer(address from, address to, uint256 tokenId);
    event Approval(address owner, address approved, uint256 tokenId);

   
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

/// @title Auction Core
/// @dev Contains models, variables, and internal methods for the auction.
/// @notice We omit a fallback function to prevent accidental sends to this contract.
contract ClockAuctionBase {

    // Represents an auction on an NFT
    struct Auction {
        // Current owner of NFT
        address seller;
        // Price (in wei) at beginning of auction
        uint128 startingPrice;
        // Price (in wei) at end of auction
        uint128 endingPrice;
        // Duration (in seconds) of auction
        uint64 duration;
        // Time when auction started
        // NOTE: 0 if this auction has been concluded
        uint64 startedAt;

        address tokenAddress;
    }

    // Reference to contract tracking NFT ownership
    InterfaceERC721 public nonFungibleContract;

    // Cut owner takes on each auction, measured in basis points (1/100 of a percent).
    uint256 public ownerCut;

    // Map from token ID to their corresponding auction.
    mapping (uint256 => Auction) tokenIdToAuction;

    event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);
    event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);
    event AuctionCancelled(uint256 tokenId);

    /// @dev Returns true if the claimant owns the token.
    /// @param _claimant - Address claiming to own the token.
    /// @param _tokenId - ID of token whose ownership to verify.
    function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return (nonFungibleContract.ownerOf(_tokenId) == _claimant);
    }

    /// @dev Escrows the NFT, assigning ownership to this contract.
    /// Throws if the escrow fails.
    /// @param _owner - Current owner address of token to escrow.
    /// @param _tokenId - ID of token whose approval to verify.
    function _escrow(address _owner, uint256 _tokenId) internal {
        // it will throw if transfer fails
        nonFungibleContract.transferFrom(_owner, address(this), _tokenId);
    }

    /// @dev Transfers an NFT owned by this contract to another address.
    /// Returns true if the transfer succeeds.
    /// @param _receiver - Address to transfer NFT to.
    /// @param _tokenId - ID of token to transfer.
    function _transfer(address _receiver, uint256 _tokenId) internal {
        // it will throw if transfer fails
        nonFungibleContract.transferFrom(address(this), _receiver, _tokenId);
    }

    /// @dev Adds an auction to the list of open auctions. Also fires the
    ///  AuctionCreated event.
    /// @param _tokenId The ID of the token to be put on auction.
    /// @param _auction Auction to add.
    function _addAuction(uint256 _tokenId, Auction memory _auction) internal {
        // Require that all auctions have a duration of
        // at least one minute.
        require(_auction.duration >= 1 minutes);

        tokenIdToAuction[_tokenId] = _auction;

        emit AuctionCreated(
            uint256(_tokenId),
            uint256(_auction.startingPrice),
            uint256(_auction.endingPrice),
            uint256(_auction.duration)
        );
    }

    /// @dev Cancels an auction unconditionally.
    function _cancelAuction(uint256 _tokenId, address _seller) internal {
        _removeAuction(_tokenId);
        _transfer(_seller, _tokenId);
        emit AuctionCancelled(_tokenId);
    }

    /// @dev Computes the price and transfers winnings.
    function _bid(uint256 _tokenId, uint256 _bidAmount)
        internal
        returns (uint256)
    {
        // Get a reference to the auction struct
        Auction storage auction = tokenIdToAuction[_tokenId];

        // Explicitly check that this auction is currently live.
        require(_isOnAuction(auction));

        // Check that the bid is greater than or equal to the current price
        uint256 price = _currentPrice(auction);
        require(_bidAmount >= price);

        address seller = auction.seller;

        // Remove the auction before sending the fees
        _removeAuction(_tokenId);

        // Transfer proceeds to seller (if there are any!)
        if (price > 0) {
          
            uint256 auctioneerCut = _computeCut(price);
            uint256 sellerProceeds = price - auctioneerCut;

            payable(seller).transfer(sellerProceeds);
        }

        // Calculate any excess funds        
        uint256 bidExcess = _bidAmount - price;
        // Return the funds.
        payable(msg.sender).transfer(bidExcess);

        // Tell the world!
        emit AuctionSuccessful(_tokenId, price, msg.sender);

        return price;
    }

    /// @dev Removes an auction from the list of open auctions.
    /// @param _tokenId - ID of NFT on auction.
    function _removeAuction(uint256 _tokenId) internal {
        delete tokenIdToAuction[_tokenId];
    }

    /// @dev Returns true if the NFT is on auction.
    /// @param _auction - Auction to check.
    function _isOnAuction(Auction memory _auction) internal pure returns (bool) {
        return (_auction.startedAt > 0);
    }

    /// @dev Returns current price of an NFT on auction. 
    function _currentPrice(Auction memory _auction)
        internal
        view
        returns (uint256)
    {
        uint256 secondsPassed = 0;
        if (block.timestamp > _auction.startedAt) {
            secondsPassed = block.timestamp - _auction.startedAt;
        }

        return _computeCurrentPrice(
            _auction.startingPrice,
            _auction.endingPrice,
            _auction.duration,
            secondsPassed
        );
    }

    /// @dev Computes the current price of an auction.    
    function _computeCurrentPrice(
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        uint256 _secondsPassed
    )
        internal
        pure
        returns (uint256)
    {
        
        if (_secondsPassed >= _duration) {
            return _endingPrice;
        } else {
  
            int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);          
            int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);
            int256 currentPrice = int256(_startingPrice) + currentPriceChange;
            return uint256(currentPrice);
        }
    }

    /// @dev Computes owner's cut of a sale.
    /// @param _price - Sale price of NFT.
    function _computeCut(uint256 _price) internal view returns (uint256) {
        return _price * ownerCut / 10000;
    }
}


contract ClockAuction is Pausable, ClockAuctionBase {

     bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);

     constructor(address _nftAddress, uint256 _cut)  {
        require(_cut <= 10000);
        ownerCut = _cut;

        InterfaceERC721 candidateContract = InterfaceERC721(_nftAddress);
        nonFungibleContract = candidateContract;
    }

    /// @dev Remove all Ether from the contract, which is the owner's cuts
    function withdrawBalance() external {
        address nftAddress = address(nonFungibleContract);
        require(
            msg.sender == owner() ||
            msg.sender == nftAddress
        );
        // We are using this boolean method to make sure that even if one fails it will still work
        bool res = payable(nftAddress).send(address(this).balance);
        require(res == true, "transfer failed");
    }

    /// @dev Creates and begins a new auction.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of time to move between starting
    ///  price and ending price (in seconds).
    /// @param _seller - Seller
    function createAuction(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address _seller,
        address _tokenAddress
    )
        external virtual
        whenNotPaused
    {
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(_owns(msg.sender, _tokenId));
        _escrow(msg.sender, _tokenId);
        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(block.timestamp),
            _tokenAddress
        );
        _addAuction(_tokenId, auction);
    }

    /// @dev Bids on an open auction, completing the auction and transferring
    ///  ownership of the NFT if enough Ether is supplied.
    /// @param _tokenId - ID of token to bid on.
    function bid(uint256 _tokenId)
        external
        virtual 
        payable
        whenNotPaused
    {
        // _bid will throw if the bid or funds transfer fails
        _bid(_tokenId, msg.value);
        _transfer(msg.sender, _tokenId);
    }

    /// @dev Cancels an auction that hasn't been won yet.
    ///  Returns the NFT to original owner.
    /// @notice This is a state-modifying function that can
    ///  be called while the contract is paused.
    /// @param _tokenId - ID of token on auction
    function cancelAuction(uint256 _tokenId)
        external
        whenPaused
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction),"not in auction");
        address seller = auction.seller;
        require(msg.sender == seller,"not a seller");
        _cancelAuction(_tokenId, seller);
    }

    /// @dev Cancels an auction when the contract is paused.
    ///  Only the owner may do this, and NFTs are returned to
    ///  the seller. This should only be used in emergencies.
    /// @param _tokenId - ID of the NFT on auction to cancel.
    function cancelAuctionWhenPaused(uint256 _tokenId)
        whenPaused
        onlyOwner
        external
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction),"not in auction");
        _cancelAuction(_tokenId, auction.seller);
    }

    /// @dev Returns auction info for an NFT on auction.
    /// @param _tokenId - ID of NFT on auction.
    function getAuction(uint256 _tokenId)
        external
        view
        returns
    (
        address seller,
        uint256 startingPrice,
        uint256 endingPrice,
        uint256 duration,
        uint256 startedAt
    ) {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        return (
            auction.seller,
            auction.startingPrice,
            auction.endingPrice,
            auction.duration,
            auction.startedAt
        );
    }

    /// @dev Returns the current price of an auction.
    /// @param _tokenId - ID of the token price we are checking.
    function getCurrentPrice(uint256 _tokenId)
        external
        view
        returns (uint256)
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        return _currentPrice(auction);
    }

}

contract SaleClockAuction is ClockAuction {

    bool public isSaleClockAuction = true;
    
    // Tracks last 5 sale price of gen0 rocket sales
    uint256 public gen0SaleCount;
    uint256[5] public lastGen0SalePrices;

    constructor(address _nftAddr, uint256 _cut) 
        ClockAuction(_nftAddr, _cut) {}

    /// @dev Creates and begins a new auction.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of auction (in seconds).
    /// @param _seller - Seller, if not the message sender
    function createAuction(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address _seller,
        address _tokenAddress
    )
        external override virtual

    {
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(msg.sender == address(nonFungibleContract),"Not a tokenContract");
        _escrow(_seller, _tokenId);
        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(block.timestamp),
            _tokenAddress
        );
        _addAuction(_tokenId, auction);
    }

    /// @dev Updates lastSalePrice if seller is the nft contract
    /// Otherwise, works the same as default bid method.
    function bid(uint256 _tokenId)
        external 
        virtual 
        override
        payable
    {
        // _bid verifies token ID size
        address seller = tokenIdToAuction[_tokenId].seller;
        uint256 price = _bid(_tokenId, msg.value);
        _transfer(msg.sender, _tokenId);

        // If not a gen0 auction, exit
        if (seller == address(nonFungibleContract)) {
            // Track gen0 sale prices
            lastGen0SalePrices[gen0SaleCount % 5] = price;
            gen0SaleCount++;
        }
    }

    function averageGen0SalePrice() external view returns (uint256) {
        uint256 sum = 0;
        for (uint256 i = 0; i < 5; i++) {
            sum += lastGen0SalePrices[i];
        }
        return sum / 5;
    }

}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721Base is Context, ERC165, IERC721, IERC721Metadata , Pausable{
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) internal _owners;

    // Mapping owner address to token count
    mapping(address => uint256) internal _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) internal _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) internal _operatorApprovals;

     // Base URI
    string private baseURI_;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual  returns (string memory) {
        return baseURI_;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        if(tokenId != 0){
            require(to != address(0), "ERC721: mint to the zero address");
        }
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

       /**
     * @dev function to set the contract URI
     * @param _baseTokenURI string URI prefix to assign
     */
    function setBaseURI(string calldata _baseTokenURI) external onlyOwner {
        _setBaseURI(_baseTokenURI);
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory _baseUri) internal virtual {
        baseURI_ = _baseUri;
    }

    /**
     * @dev Returns the base URI set via {_setBaseURI}. This will be
     * automatically added as a prefix in {tokenURI} to each token's URI, or
     * to the token ID if no specific URI is set for that token ID.
     */
    function baseUri() public view returns (string memory) {
        return baseURI_;
    }    


}


contract RocketBase is ERC721Base("Rocket", "RocketDash") {

    /// @dev The Build event is fired whenever a new rocket comes into existence.
    event Build(address owner, uint256 rocketId, uint256 inventorModelId, uint256 architectModelId);

  
    struct Rocket {

        // The timestamp from the block when this rocketcame into existence.
        uint64 buildTime;

        // The minimum timestamp after which this rocket can able build
        // new rockets again.
        uint64 recoveryEndTime;

        // The ID of the originator of this rocket, set to 0 for gen0 rockets.
        uint32 inventorModelId;
        uint32 architectModelId;

        // Set to the ID of the architectModel rocketfor inventorModels that are preProduction,
        // zero otherwise. 
        uint32 ProcessingWithId;

        // Set to the index in the recovery array (see below) that represents
        // the current recovery duration for this Rocket. This starts at zero
        // for gen0 rockets, and is initialized to floor(generation/2) for others.
        // Incremented by one for each successful building action, regardless
        // of whether this rocketis acting as inventorModel or architectModel.
        uint16 recoveryIndex;

        // The "generation number" of this rocket.
        // for sale are called "gen0" and have a generation number of 0. The
        // generation number of all other rockets is the larger of the two generation
        // numbers of their originator, plus one.
        // (i.e. max(inventorModel.generation, architectModel.generation) + 1)
        uint16 generation;
    }

    /*** CONSTANTS ***/

    /// @dev A lookup table rocketing the recovery duration after any successful
    ///  building action, called "processing time" for inventorModels and "Processing recovery"
    ///  for architectModels. Designed such that the recovery roughly doubles each time a rocket
    ///  is build, encouraging owners not to just keep building the same rocketover
    ///  and over again. Caps out at one week (a rocketcan build an unbounded number
    ///  of times, and the maximum recovery is always seven days).
    uint32[14] public recovery = [
        uint32(1 minutes),
        uint32(2 minutes),
        uint32(5 minutes),
        uint32(10 minutes),
        uint32(30 minutes),
        uint32(1 hours),
        uint32(2 hours),
        uint32(4 hours),
        uint32(8 hours),
        uint32(16 hours),
        uint32(1 days),
        uint32(2 days),
        uint32(4 days),
        uint32(7 days)
    ];

    /*** STORAGE ***/

    /// @dev An array containing the Rocket struct for all rockets in existence. The ID
    ///  of each rocketis actually an index into this array. 
    Rocket[] rockets;

    /// @dev A mapping from RocketIDs to an address that has been approved to use
    ///  this Rocket for Processing via buildWith(). Each Rocket can only have one approved
    ///  address for Processing at any time. A zero value means no approval is outstanding.
    mapping (uint256 => address) public architectModelAllowedToAddress;

    /// @dev The address of the ClockAuction contract that handles sales of rockets. This
    ///  same contract handles both peer-to-peer sales as well as the gen0 sales. 
    SaleClockAuction public saleAuction;

    constructor(){

    }

     function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._transfer(from, to, tokenId);
        // once the rocket is transferred also clear architectModel allowances
        delete architectModelAllowedToAddress[tokenId];
    }

    /// @dev An internal method that creates a new rocket and stores it. This
    /// @param _inventorModelId The rocket ID of the inventorModel of this rocket(zero for gen0)
    /// @param _architectModelId The rocket ID of the architectModel of this rocket(zero for gen0)
    /// @param _generation The generation number of this rocket, must be computed by caller.
    /// @param _owner The inital owner of this rocket, must be non-zero (except for the unRocket, ID 0)
    function _createRocket(
        uint256 _inventorModelId,
        uint256 _architectModelId,
        uint256 _generation,
        address _owner
    )
        internal
        returns (uint)
    {

        require(_inventorModelId == uint256(uint32(_inventorModelId)));
        require(_architectModelId == uint256(uint32(_architectModelId)));
        require(_generation == uint256(uint16(_generation)));

        // New rocket starts with the same recovery as parent gen/2
        uint16 recoveryIndex = uint16(_generation / 2);
        if (recoveryIndex > 13) {
            recoveryIndex = 13;
        }

        Rocket memory _rocket = Rocket({
            buildTime: uint64(block.timestamp),
            recoveryEndTime: 0,
            inventorModelId: uint32(_inventorModelId),
            architectModelId: uint32(_architectModelId),
            ProcessingWithId: 0,
            recoveryIndex: recoveryIndex,
            generation: uint16(_generation)
        });
        rockets.push(_rocket);
        uint256 newrocketId =  rockets.length;

      
        require(newrocketId == uint256(uint32(newrocketId)));

        // emit the build event
        emit Build(
            _owner,
            newrocketId,
            uint256(_rocket.inventorModelId),
            uint256(_rocket.architectModelId)
        );

        // This will assign ownership, and also emit the Transfer event as
        // per ERC721 draft
        _mint(_owner, newrocketId);

        return newrocketId;
    }

    /// @notice Returns the total number of rockets currently in existence.
    /// @dev Required for ERC-721 compliance.
    function totalSupply() public view returns (uint) {
        return rockets.length - 1;
    }

    /// @notice Returns a list of all Rocket IDs assigned to an address.
    /// @param _owner The owner whose rockets we are interested in.
    /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly
    ///  expensive (it walks the entire Rocket array looking for rockets belonging to owner),
    ///  but it also returns a dynamic array, which is only supported for web3 calls, and
    ///  not contract-to-contract calls.
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ownerTokens) {
        uint256 tokenCount = balanceOf(_owner);

        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 totalRockets = totalSupply();
            uint256 resultIndex = 0;

            // We count on the fact that all rockets have IDs starting at 1 and increasing
            // sequentially up to the totalRocketcount.
            uint256 rocketId;

            for (rocketId = 1; rocketId <= totalRockets; rocketId++) {
                if (_owners[rocketId] == _owner) {
                    result[resultIndex] = rocketId;
                    resultIndex++;
                }
            }

            return result;
        }
    }

  function setRecovery(uint32[14] calldata  _recovery) external onlyOwner {
        recovery = _recovery;
    }
}

contract RocketBuildBase is RocketBase{

    event Inventing(address owner, uint256 inventorModelId, uint256 architectModelId, uint256 recoveryEndTime);

    /// @notice The minimum payment required to use build new rocket 
    uint256 public autoBuildFee = 2e15;
    // platform charge percentage
    uint256 public charge = 10; // 10 equals 1% 
    // Keeps track of number of preProduction rocket.
    uint256 public preProductionRockets;
 
    /// @dev Checks that a given rocket is able to build. Requires that the
    ///  current recovery is finished (for architectModels) and also checks that there is
    ///  no pending processing.
    function _isReadyToBuild(Rocket memory _rocket) internal view returns (bool) {
        // In addition to checking the recoveryEndTime, we also need to check to see if
        // the rockethas a pending launch; there can be some period of time between the end
        // of the processing timer and the build event.
        return (_rocket.ProcessingWithId == 0) && (_rocket.recoveryEndTime <= uint64(block.timestamp));
    }

    /// @dev Check if a architectModel has authorized building with this inventorModel. True if both architectModel
    ///  and inventorModel have the same owner, or if the architectModel has given build permission to
    ///  the inventorModel's owner (via approveArchitectModel()).
    function _isArchitectModelPermitted(uint256 _architectModelId, uint256 _inventorModelId) internal view returns (bool) {
        address inventorModelOwner = _owners[_inventorModelId];
        address architectModelOwner = _owners[_architectModelId];

        // ArchitectModel is okay if they have same owner, or if the inventorModel's owner was given
        // permission to build with this architectModel.
        return (inventorModelOwner == architectModelOwner || architectModelAllowedToAddress[_architectModelId] == inventorModelOwner);
    }

    /// @dev Set the recoveryEndTime for the given Rocket, based on its current recoveryIndex.
    ///  Also increments the recoveryIndex (unless it has hit the cap).
    /// @param _rocket A reference to the Rocket in storage which needs its timer started.
    function _triggerRecovery(Rocket storage _rocket) internal {
        // Compute an estimation of the recovery time in blocks (based on current recoveryIndex).
        _rocket.recoveryEndTime = uint64((recovery[_rocket.recoveryIndex]) + block.timestamp);

        // Increment the building count, clamping it at 13
        if (_rocket.recoveryIndex < 13) {
            _rocket.recoveryIndex += 1;
        }
    }

    /// @notice Grants approval to another user to architectModel with one of your Rocket.
    /// @param _addr The address that will be able to  create new rocket using architectModel with your Rocket. Set to
    ///  address(0) to clear all Processing approvals for this Rocket.
    /// @param _architectModelId A Rocket that you own that _addr will now be able to architectModel with.
    function approveArchitectModel(address _addr, uint256 _architectModelId)
        external
        whenNotPaused
    {
        require(_owns(msg.sender, _architectModelId));
        architectModelAllowedToAddress[_architectModelId] = _addr;
    }

    /// @dev Updates the minimum payment required for building new rocket. 
    function setAutoBuildFee(uint256 val) external onlyOwner {
        autoBuildFee = val;
    }

    /// @dev Checks to see if a given Rocket is preProduction and (if so) if the processing
    ///  period has passed.
    function _isReadyToLaunch(Rocket memory _inventorModel) private view returns (bool) {
        return (_inventorModel.ProcessingWithId != 0) && (_inventorModel.recoveryEndTime <= uint64(block.timestamp));
    }

    /// @notice Checks that a given rocket is able to build (i.e. it is not preProduction or
    ///  in the middle of a Processing recovery).
    /// @param _rocketId reference the id of the rocket, any user can inquire about it
    function isReadyToBuild(uint256 _rocketId)
        public
        view
        returns (bool)
    {
        require(_rocketId > 0);
        Rocket storage _rocket = rockets[_rocketId];
        return _isReadyToBuild(_rocket);
    }

    /// @dev Checks whether a rocket is currently preProduction.
    /// @param _rocketId reference the id of the rocket, any user can inquire about it
    function isInventing(uint256 _rocketId)
        public
        view
        returns (bool)
    {
        require(_rocketId > 0);
        // A rocket is preProduction if and only if this field is set
        return rockets[_rocketId].ProcessingWithId != 0;
    }

    /// @dev Internal check to see if a given architectModel and inventorModel are a valid inventor model.
    /// @param _inventorModel A reference to the Rocket struct of the potential inventorModel.
    /// @param _inventorModelId The inventorModel's ID.
    /// @param _architectModel A reference to the Rocket struct of the potential architectModel.
    /// @param _architectModelId The architectModel's ID
    function _isValidInventorModel(
        Rocket storage _inventorModel,
        uint256 _inventorModelId,
        Rocket storage _architectModel,
        uint256 _architectModelId
    )
        private
        view
        returns(bool)
    {
        // A Rocket can't build with itself!
        if (_inventorModelId == _architectModelId) {
            return false;
        }

        // Rocket can't build with inventor .
        if (_inventorModel.inventorModelId == _architectModelId || _inventorModel.architectModelId == _architectModelId) {
            return false;
        }
        if (_architectModel.inventorModelId == _inventorModelId || _architectModel.architectModelId == _inventorModelId) {
            return false;
        }

        // We can short circuit the  co model check (below) if either rocketis
        // gen zero (has a inventorModel ID of zero).
        if (_architectModel.inventorModelId == 0 || _inventorModel.inventorModelId == 0) {
            return true;
        }

        // Rocket can't build with full or half co models.
        if (_architectModel.inventorModelId == _inventorModel.inventorModelId || _architectModel.inventorModelId == _inventorModel.architectModelId) {
            return false;
        }
        if (_architectModel.architectModelId == _inventorModel.inventorModelId || _architectModel.architectModelId == _inventorModel.architectModelId) {
            return false;
        }

        return true;
    }

    /// @dev Internal check to see if a given architectModel and inventorModel are a valid inventor model for
    ///  building via auction (i.e. skips ownership and Processing approval checks).
    function _canBuildWithViaAuction(uint256 _inventorModelId, uint256 _architectModelId)
        internal
        view
        returns (bool)
    {
        Rocket storage inventorModel = rockets[_inventorModelId];
        Rocket storage architectModel = rockets[_architectModelId];
        return _isValidInventorModel(inventorModel, _inventorModelId, architectModel, _architectModelId);
    }

    /// @notice Checks to see if two rocket can build together, including checks for
    ///  ownership and Processing approvals. 
    /// @param _inventorModelId The ID of the proposed inventorModel.
    /// @param _architectModelId The ID of the proposed architectModel.
    function canBuildWith(uint256 _inventorModelId, uint256 _architectModelId)
        external
        view
        returns(bool)
    {
        require(_inventorModelId > 0);
        require(_architectModelId > 0);
        Rocket storage inventorModel = rockets[_inventorModelId];
        Rocket storage architectModel = rockets[_architectModelId];
        return _isValidInventorModel(inventorModel, _inventorModelId, architectModel, _architectModelId) &&
            _isArchitectModelPermitted(_architectModelId, _inventorModelId);
    }

    /// @dev Internal utility function to initiate building, assumes that all building
    ///  requirements have been checked.
    function _buildWith(uint256 _inventorModelId, uint256 _architectModelId) internal {
        // Grab a reference to the Rocket from storage.
        Rocket storage architectModel = rockets[_architectModelId];
        Rocket storage inventorModel = rockets[_inventorModelId];

        inventorModel.ProcessingWithId = uint32(_architectModelId);

        // Trigger the recovery for both inventor .
        _triggerRecovery(architectModel);
        _triggerRecovery(inventorModel);

        // Clear Processing permission for both inventor . This may not be strictly necessary
        delete architectModelAllowedToAddress[_inventorModelId];
        delete architectModelAllowedToAddress[_architectModelId];

        // Every time a new rocket gets in preProduction, counter is incremented.
        preProductionRockets++;

        // Emit the processing event.
        emit Inventing(_owners[_inventorModelId], _inventorModelId, _architectModelId, inventorModel.recoveryEndTime);
    }

    /// @notice Build a Rocket you own (as inventorModel) with a architectModel that you own, or for which you
    ///  have previously been given ArchitectModel approval. Will either make your rocket preProduction, or will
    ///  fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBuild()
    /// @param _inventorModelId The ID of the Rocket acting as inventorModel (will end up preProduction if successful)
    /// @param _architectModelId The ID of the Rocket acting as architectModel (will begin its Processing recovery if successful)
    function buildNewRocket(uint256 _inventorModelId, uint256 _architectModelId)
        external
        payable
        whenNotPaused
    {
        // Checks for payment.
        require(msg.value >= autoBuildFee);

        // Caller must own the inventorModel.
        require(_owns(msg.sender, _inventorModelId));
      
        // Check that inventorModel and architectModel are both owned by caller, or that the architectModel
        // has given Processing permission to caller (i.e. inventorModel's owner).
        // Will fail for _architectModelId = 0
        require(_isArchitectModelPermitted(_architectModelId, _inventorModelId));

        // Grab a reference to the potential inventorModel
        Rocket storage inventorModel = rockets[_inventorModelId];

        // Make sure inventorModel isn't preProduction, or in the middle of a Processing recovery
        require(_isReadyToBuild(inventorModel));

        // Grab a reference to the potential architectModel
        Rocket storage architectModel = rockets[_architectModelId];

        // Make sure architectModel isn't preProduction, or in the middle of a Processing recovery
        require(_isReadyToBuild(architectModel));

        // Test that these rocket are a valid inventor model.
        require(_isValidInventorModel(
            inventorModel,
            _inventorModelId,
            architectModel,
            _architectModelId
        ));

        // All checks passed, rocket gets preProduction!
        _buildWith(_inventorModelId, _architectModelId);
    }

    /// @notice Have a preProduction Rocket give build!
    /// @param _inventorModelId A Rocket ready to give build.
    /// @return The Rocket ID of the new rocket.
    /// @dev Looks at a given Rocket and, if preProduction and if the processing period has passed,
    ///  combines the  of the two inventor  to create a new rocket. The new Rocket is assigned
    ///  to the current owner of the inventorModel. Upon successful completion, both the inventorModel and the
    ///  new rocket will be ready to build again. Note that anyone can call this function (if they
    ///  are willing to pay the gas!), but the new rocket always goes to the inventorModel's owner.
    function LaunchRocket(uint256 _inventorModelId)
        external
        whenNotPaused
        returns(uint256)
    {
        // Grab a reference to the inventorModel in storage.
        Rocket storage inventorModel = rockets[_inventorModelId];

        // Check that the inventorModel is a valid rocket.
        require(inventorModel.buildTime != 0);

        // Check that its time has come!
        require(_isReadyToLaunch(inventorModel));

        // Grab a reference to the architectModel in storage.
        uint256 architectModelId = inventorModel.ProcessingWithId;
        Rocket storage architectModel = rockets[architectModelId];

        // Determine the higher generation number of the two inventor 
        uint16 parentGen = inventorModel.generation;
        if (architectModel.generation > inventorModel.generation) {
            parentGen = architectModel.generation;
        }


        // Make the new rocket!
        address owner = _owners[_inventorModelId];
        uint256 rocketId = _createRocket(_inventorModelId, inventorModel.ProcessingWithId, parentGen + 1,  owner);

        delete inventorModel.ProcessingWithId;

        // Every time a rocket gives build counter is decremented.
        preProductionRockets--;

        // Send the balance fee to the person who made build happen.
        payable(msg.sender).transfer(autoBuildFee-(autoBuildFee*charge/1000));

        // return the new rocket's ID
        return rocketId;
    }

    /// @dev Returns true if the claimant owns the token.
    /// @param _claimant - Address claiming to own the token.
    /// @param _tokenId - ID of token whose ownership to verify.
    function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return (ownerOf(_tokenId) == _claimant);
    }

}

contract AuctionBase is RocketBuildBase {

    /// @dev Sets the reference to the sale auction.
    /// @param _address - Address of sale contract.
    function setSaleAuctionAddress(address _address) external onlyOwner {
        SaleClockAuction candidateContract = SaleClockAuction(_address);

        require(candidateContract.isSaleClockAuction());

        // Set the new contract address
        saleAuction = candidateContract;
    }

    /// @dev Put a rocket up for auction.
    ///  Does some ownership trickery to create auctions in one tx.
    function createSaleAuction(
        uint256 _rocketId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address _tokenAddress
    )
        external
        whenNotPaused
    {
        // Auction contract checks input sizes
        // If rocket is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(_owns(msg.sender, _rocketId));
        // Ensure the rocket is not inventing to prevent the auction
        // contract accidentally receiving ownership of the child.
        // NOTE: the rocket IS allowed to be in a recovery.
        require(!isInventing(_rocketId));
        _approve(address(saleAuction),_rocketId);
        // Sale auction throws if inputs are invalid and clears
        // transfer and architectModel approval after escrowing the rocket.
        saleAuction.createAuction(
            _rocketId,
            _startingPrice,
            _endingPrice,
            _duration,
            msg.sender,
            _tokenAddress
        );
    }
    
    /// @dev Transfers the balance of the sale auction contract
    /// to the RocketCore contract. We use two-step withdrawal to
    /// prevent two transfer calls in the auction bid function.
    function withdrawAuctionBalances() external onlyOwner {
        saleAuction.withdrawBalance();
    }
}

contract RocketdashMinting is AuctionBase {

    // Constants for gen0 auctions.
    uint256 public constant GEN0_STARTING_PRICE = 10e15;
    uint256 public constant GEN0_AUCTION_DURATION = 1 days;

    // Counts the number of rockets the contract owner has created.
    uint256 public promoCreatedCount;
    uint256 public gen0CreatedCount;
    uint256 public elononeCreatedCount;

    uint256 public initTime;

    address elonone = 0x97b65710D03E12775189F0D113202cc1443b0aa2;
    uint256 elononeRequirement = 40000000000 * 10**9; // 40b

    // for future business collab partner rockets
    // vars needed to split mint fees with partners and set price, time frame
    uint256 mintPrice;
    uint256 mintInit;
    uint256 mintPeriod;
    address payable partnerAddress;
    address payable teamAddress;

    mapping(address => bool) hasMinted;

    constructor (string memory _baseUri) {
        _setBaseURI(_baseUri);
    }

    IERC20 _elonone = IERC20(elonone);

    // to stop bot smart contracts from frontrunning minting
    modifier noContract(address account) {
        require(Address.isContract(account) == false, "Contracts are not allowed to interact with the farm");
        _;
    }

    function initElononeMint() external onlyOwner {
        initTime = block.timestamp;
    }

    function mintElononeRocket() external noContract(msg.sender) {
        uint256 bal = _elonone.balanceOf(msg.sender);
        require(bal >= elononeRequirement, "you need more ELONONE!");
        require(block.timestamp < initTime + 3 days, "ELONONE mint is over!");
        require(!hasMinted[msg.sender], "already minted");
        _createRocket(0, 0, 0, msg.sender);
        hasMinted[msg.sender] = true;
        gen0CreatedCount++;
        elononeCreatedCount++;
    }

    // 1 partner mint event at a time only
    function initPartnershipMintWithParams(uint256 _mintPrice, uint256 _mintPeriod, address payable _partnerAddress, address payable _teamAddress) external onlyOwner {
        mintPrice = _mintPrice;
        mintInit = block.timestamp;
        mintPeriod = _mintPeriod;
        partnerAddress = _partnerAddress;
        teamAddress = _teamAddress;
    }

    function mintPartnershipRocket() external payable noContract(msg.sender) {
        require(block.timestamp < mintInit + mintPeriod, "mint is over");
        require(msg.value >= mintPrice, "not enough ether supplied");
        _createRocket(0, 0, 0, msg.sender);
        gen0CreatedCount++;
        uint256 divi = msg.value / 2;
        partnerAddress.transfer(divi);
        teamAddress.transfer(divi);
    }

    function createMultipleRocket(address[] memory _owner,uint256 _count) external onlyOwner {
        require(_owner.length == _count,"Invalid count of minting");
        uint i;
        for(i = 0; i < _owner.length; i++){

            address rocketOwner = _owner[i];
            if (rocketOwner == address(0)) {
                rocketOwner = owner();
            }

            promoCreatedCount++;
            _createRocket(0, 0, 0,  rocketOwner);
        }
    }

    /// @dev Creates a new gen0 rocket
    ///  creates an auction for it.
    function createGen0Auction(address _tokenAddress) external onlyOwner {

        uint256 rocketId = _createRocket(0, 0, 0, address(this));
        _approve(address(saleAuction), rocketId);

        saleAuction.createAuction(
            rocketId,
            _computeNextGen0Price(),
            0,
            GEN0_AUCTION_DURATION,
            address(this),
            _tokenAddress
        );

        gen0CreatedCount++;
    }

    /// @dev Computes the next gen0 auction starting price, given
    ///  the average of the past 5 prices + 50%.
    function _computeNextGen0Price() internal view returns (uint256) {
        uint256 avePrice = saleAuction.averageGen0SalePrice();

        // Sanity check to ensure we don't overflow arithmetic
        require(avePrice == uint256(uint128(avePrice)));
        uint256 nextPrice = avePrice + (avePrice / 2);

        // We never auction for less than starting price
        if (nextPrice < GEN0_STARTING_PRICE) {
            nextPrice = GEN0_STARTING_PRICE;
        }
        return nextPrice;
    }


    /// @notice Returns all the relevant information about a specific rocket.
    /// @param _id The ID of the rocket of interest.
    function getRocket(uint256 _id)
        external
        view
        returns (
        bool isProcessing,
        bool isReady,
        uint256 recoveryIndex,
        uint256 nextActionAt,
        uint256 ProcessingWithId,
        uint256 buildTime,
        uint256 inventorModelId,
        uint256 architectModelId,
        uint256 generation
    ) {
        Rocket storage _rocket = rockets[_id];

        // if this variable is 0 then it's not building 
        isProcessing = (_rocket.ProcessingWithId != 0);
        isReady = (_rocket.recoveryEndTime <= block.timestamp);
        recoveryIndex = uint256(_rocket.recoveryIndex);
        nextActionAt = uint256(_rocket.recoveryEndTime);
        ProcessingWithId = uint256(_rocket.ProcessingWithId);
        buildTime = uint256(_rocket.buildTime);
        inventorModelId = uint256(_rocket.inventorModelId);
        architectModelId = uint256(_rocket.architectModelId);
        generation = uint256(_rocket.generation);
    }

     // @dev Allows the owner to capture the balance available to the contract.
    function withdrawBalance() external onlyOwner {
        uint256 balance = address(this).balance;
        // Subtract all the currently preProduction rockets we have, plus 1 of margin.
        uint256 subtractFees = (preProductionRockets + 1) * autoBuildFee;

        if (balance > subtractFees) {
            payable(msg.sender).transfer(balance - subtractFees);
        }
    }
    
    // @dev allow contract to receive ether 
    receive () external payable {}

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"rocketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"inventorModelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"architectModelId","type":"uint256"}],"name":"Build","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"inventorModelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"architectModelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"recoveryEndTime","type":"uint256"}],"name":"Inventing","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"GEN0_AUCTION_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GEN0_STARTING_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_inventorModelId","type":"uint256"}],"name":"LaunchRocket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_architectModelId","type":"uint256"}],"name":"approveArchitectModel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"architectModelAllowedToAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoBuildFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_inventorModelId","type":"uint256"},{"internalType":"uint256","name":"_architectModelId","type":"uint256"}],"name":"buildNewRocket","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_inventorModelId","type":"uint256"},{"internalType":"uint256","name":"_architectModelId","type":"uint256"}],"name":"canBuildWith","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"createGen0Auction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owner","type":"address[]"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"createMultipleRocket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rocketId","type":"uint256"},{"internalType":"uint256","name":"_startingPrice","type":"uint256"},{"internalType":"uint256","name":"_endingPrice","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"createSaleAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"elononeCreatedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gen0CreatedCount","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":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getRocket","outputs":[{"internalType":"bool","name":"isProcessing","type":"bool"},{"internalType":"bool","name":"isReady","type":"bool"},{"internalType":"uint256","name":"recoveryIndex","type":"uint256"},{"internalType":"uint256","name":"nextActionAt","type":"uint256"},{"internalType":"uint256","name":"ProcessingWithId","type":"uint256"},{"internalType":"uint256","name":"buildTime","type":"uint256"},{"internalType":"uint256","name":"inventorModelId","type":"uint256"},{"internalType":"uint256","name":"architectModelId","type":"uint256"},{"internalType":"uint256","name":"generation","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initElononeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_mintPeriod","type":"uint256"},{"internalType":"address payable","name":"_partnerAddress","type":"address"},{"internalType":"address payable","name":"_teamAddress","type":"address"}],"name":"initPartnershipMintWithParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rocketId","type":"uint256"}],"name":"isInventing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rocketId","type":"uint256"}],"name":"isReadyToBuild","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintElononeRocket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPartnershipRocket","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preProductionRockets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"promoCreatedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"recovery","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleAuction","outputs":[{"internalType":"contract SaleClockAuction","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setAutoBuildFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32[14]","name":"_recovery","type":"uint32[14]"}],"name":"setRecovery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setSaleAuctionAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"ownerTokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAuctionBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

610240604052603c6080908152607860a05261012c60c05261025860e05261070861010052610e1061012052611c2061014052613840610160526170806101805261e1006101a052620151806101c0526202a3006101e052620546006102005262093a80610220526200007790600890600e62000202565b5066071afd498d0000600d55600a600e55601480547397b65710d03e12775189f0d113202cc1443b0aa26001600160a01b0319918216811790925568022b1c8c1227a00000601555601c80549091169091179055348015620000d857600080fd5b50604051620058cc380380620058cc833981016040819052620000fb91620002d2565b60405180604001604052806006815260200165149bd8dad95d60d21b8152506040518060400160405280600a8152602001690a4dec6d6cae888c2e6d60b31b81525062000157620001516200019c60201b60201c565b620001a0565b6000805460ff60a01b19169055600162000172838262000436565b50600262000181828262000436565b5050506200019581620001f060201b60201c565b5062000502565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6007620001fe828262000436565b5050565b600283019183908215620002935791602002820160005b838211156200025f57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000219565b8015620002915782816101000a81549063ffffffff02191690556004016020816003010492830192600103026200025f565b505b50620002a1929150620002a5565b5090565b5b80821115620002a15760008155600101620002a6565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215620002e657600080fd5b82516001600160401b0380821115620002fe57600080fd5b818501915085601f8301126200031357600080fd5b815181811115620003285762000328620002bc565b604051601f8201601f19908116603f01168101908382118183101715620003535762000353620002bc565b8160405282815288868487010111156200036c57600080fd5b600093505b8284101562000390578484018601518185018701529285019262000371565b600086848301015280965050505050505092915050565b600181811c90821680620003bc57607f821691505b602082108103620003dd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200043157600081815260208120601f850160051c810160208610156200040c5750805b601f850160051c820191505b818110156200042d5782815560010162000418565b5050505b505050565b81516001600160401b03811115620004525762000452620002bc565b6200046a81620004638454620003a7565b84620003e3565b602080601f831160018114620004a25760008415620004895750858301515b600019600386901b1c1916600185901b1785556200042d565b600085815260208120601f198616915b82811015620004d357888601518255948401946001909101908401620004b2565b5085821015620004f25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6153ba80620005126000396000f3fe6080604052600436106103595760003560e01c80636872ebdf116101bb5780639b7df652116100f7578063e319856d11610095578063e985e9c51161006f578063e985e9c5146109a4578063f1ca9410146109fa578063f2fde38b14610a10578063faea4a7414610a3057600080fd5b8063e319856d14610937578063e3868b4f14610957578063e6cbe3511461097757600080fd5b8063b88d4fde116100d1578063b88d4fde146108b7578063c87b56dd146108d7578063ca0e7fd3146108f7578063d4236f2d1461091757600080fd5b80639b7df65214610811578063a22cb46514610831578063aed4f39c1461085157600080fd5b80638462151c1161016457806391876e571161013e57806391876e57146107bd578063937df102146107d257806395d89b41146107e75780639abc8320146107fc57600080fd5b80638462151c1461074f5780638d3cfa9b1461077c5780638da5cb5b1461079257600080fd5b8063715018a611610195578063715018a61461071257806381e58b29146107275780638456cb591461073a57600080fd5b80636872ebdf146106bd5780636fbde40d146106d257806370a08231146106f257600080fd5b80631e419ff3116102955780634a696f15116102335780635c975abb1161020d5780635c975abb146106385780635f4fe931146106685780635fd8c710146106885780636352211e1461069d57600080fd5b80634a696f15146105e2578063551619131461060257806355f804b31461061857600080fd5b80633f4ba83a1161026f5780633f4ba83a1461056d57806342842e0e146105825780634693aee5146105a25780634821fa0a146105c257600080fd5b80631e419ff31461051057806323b872dd146105185780632b079b2e1461053857600080fd5b8063081812fc116103025780631091b981116102dc5780631091b981146104ae57806314394f59146104ce57806318160ddd146104e457806319c2f201146104f957600080fd5b8063081812fc1461042e578063095ea7b3146104735780630e583df01461049357600080fd5b806305fe46001161033357806305fe4600146103d457806306fdde03146103ea57806307d6e9a41461040c57600080fd5b806301ffc9a714610365578063041151871461039a57806305e45546146103be57600080fd5b3661036057005b600080fd5b34801561037157600080fd5b506103856103803660046149f9565b610a73565b60405190151581526020015b60405180910390f35b3480156103a657600080fd5b506103b060135481565b604051908152602001610391565b3480156103ca57600080fd5b506103b060105481565b3480156103e057600080fd5b506103b060125481565b3480156103f657600080fd5b506103ff610b58565b6040516103919190614a84565b34801561041857600080fd5b5061042c610427366004614ab9565b610bea565b005b34801561043a57600080fd5b5061044e610449366004614ad6565b610d87565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561047f57600080fd5b5061042c61048e366004614aef565b610e61565b34801561049f57600080fd5b506103b0662386f26fc1000081565b3480156104ba57600080fd5b5061042c6104c9366004614ad6565b610fed565b3480156104da57600080fd5b506103b0600f5481565b3480156104f057600080fd5b506103b0611073565b34801561050557600080fd5b506103b06201518081565b61042c61108a565b34801561052457600080fd5b5061042c610533366004614b1b565b6112c0565b34801561054457600080fd5b50610558610553366004614ad6565b611361565b60405163ffffffff9091168152602001610391565b34801561057957600080fd5b5061042c611391565b34801561058e57600080fd5b5061042c61059d366004614b1b565b6114f4565b3480156105ae57600080fd5b506103b06105bd366004614ad6565b61150f565b3480156105ce57600080fd5b5061042c6105dd366004614aef565b611893565b3480156105ee57600080fd5b506103856105fd366004614ad6565b61197e565b34801561060e57600080fd5b506103b0600e5481565b34801561062457600080fd5b5061042c610633366004614b5c565b611aaa565b34801561064457600080fd5b5060005474010000000000000000000000000000000000000000900460ff16610385565b34801561067457600080fd5b50610385610683366004614bce565b611b6e565b34801561069457600080fd5b5061042c611bf1565b3480156106a957600080fd5b5061044e6106b8366004614ad6565b611cd2565b3480156106c957600080fd5b5061042c611d84565b3480156106de57600080fd5b5061042c6106ed366004614ab9565b611e0b565b3480156106fe57600080fd5b506103b061070d366004614ab9565b611f51565b34801561071e57600080fd5b5061042c61201f565b61042c610735366004614bce565b6120ac565b34801561074657600080fd5b5061042c6123cb565b34801561075b57600080fd5b5061076f61076a366004614ab9565b612540565b6040516103919190614bf0565b34801561078857600080fd5b506103b0600d5481565b34801561079e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661044e565b3480156107c957600080fd5b5061042c612649565b3480156107de57600080fd5b5061042c612748565b3480156107f357600080fd5b506103ff612a35565b34801561080857600080fd5b506103ff612a44565b34801561081d57600080fd5b5061042c61082c366004614c34565b612a53565b34801561083d57600080fd5b5061042c61084c366004614c8f565b612bcf565b34801561085d57600080fd5b5061087161086c366004614ad6565b612ce5565b604080519915158a5297151560208a0152968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610391565b3480156108c357600080fd5b5061042c6108d2366004614d46565b612e3d565b3480156108e357600080fd5b506103ff6108f2366004614ad6565b612edf565b34801561090357600080fd5b50610385610912366004614ad6565b612fee565b34801561092357600080fd5b5061042c610932366004614e28565b613045565b34801561094357600080fd5b5061042c610952366004614ee0565b6131e1565b34801561096357600080fd5b5061042c610972366004614f2a565b6132c5565b34801561098357600080fd5b50600c5461044e9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156109b057600080fd5b506103856109bf366004614f55565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a0657600080fd5b506103b060115481565b348015610a1c57600080fd5b5061042c610a2b366004614ab9565b613353565b348015610a3c57600080fd5b5061044e610a4b366004614ad6565b600b6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b0657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b5257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060018054610b6790614f83565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9390614f83565b8015610be05780601f10610bb557610100808354040283529160200191610be0565b820191906000526020600020905b815481529060010190602001808311610bc357829003601f168201915b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6000610c80600080600030613483565b600c54909150610ca69073ffffffffffffffffffffffffffffffffffffffff16826137a2565b600c5473ffffffffffffffffffffffffffffffffffffffff16637e5d9bb782610ccd613842565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168152600481019290925260248201526000604482015262015180606482015230608482015273ffffffffffffffffffffffffffffffffffffffff851660a482015260c401600060405180830381600087803b158015610d5557600080fd5b505af1158015610d69573d6000803e3d6000fd5b505060118054925090506000610d7e83614fff565b91905055505050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16610e38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c67565b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610e6c82611cd2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c67565b3373ffffffffffffffffffffffffffffffffffffffff82161480610f525750610f5281336109bf565b610fde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c67565b610fe883836137a2565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b600d55565b600a5460009061108590600190615037565b905090565b33803b1561111a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e7460448201527f6572616374207769746820746865206661726d000000000000000000000000006064820152608401610c67565b60185460175461112a919061504a565b4210611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6d696e74206973206f76657200000000000000000000000000000000000000006044820152606401610c67565b6016543410156111fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6e6f7420656e6f75676820657468657220737570706c696564000000000000006044820152606401610c67565b61120c600080600033613483565b506011805490600061121d83614fff565b909155506000905061123060023461508c565b60195460405191925073ffffffffffffffffffffffffffffffffffffffff169082156108fc029083906000818181858888f19350505050158015611278573d6000803e3d6000fd5b50601a5460405173ffffffffffffffffffffffffffffffffffffffff9091169082156108fc029083906000818181858888f19350505050158015610fe8573d6000803e3d6000fd5b6112ca338261392d565b611356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c67565b610fe8838383613a99565b600881600e811061137157600080fd5b60089182820401919006600402915054906101000a900463ffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b60005474010000000000000000000000000000000000000000900460ff16611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610c67565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b610fe883838360405180602001604052806000815250612e3d565b6000805474010000000000000000000000000000000000000000900460ff1615611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b6000600a83815481106115aa576115aa6150a0565b60009182526020822001805490925067ffffffffffffffff1690036115ce57600080fd5b6040805160e081018252825467ffffffffffffffff808216835268010000000000000000820416602083015263ffffffff70010000000000000000000000000000000082048116938301939093527401000000000000000000000000000000000000000081048316606083015278010000000000000000000000000000000000000000000000008104909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008304811660a08301527e0100000000000000000000000000000000000000000000000000000000000090920490911660c08201526116bd90613adc565b6116c657600080fd5b8054600a8054780100000000000000000000000000000000000000000000000090920463ffffffff16916000919083908110611704576117046150a0565b6000918252602090912084549101805490925061ffff7e010000000000000000000000000000000000000000000000000000000000009283900481169290910416811015611776575080547e01000000000000000000000000000000000000000000000000000000000000900461ffff165b600086815260036020526040812054855473ffffffffffffffffffffffffffffffffffffffff90911691906117de9089907801000000000000000000000000000000000000000000000000900463ffffffff166117d48660016150cf565b61ffff1685613483565b86547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff168755600f80549192506000611816836150f1565b91905055503373ffffffffffffffffffffffffffffffffffffffff166108fc6103e8600e54600d546118489190615126565b611852919061508c565b600d5461185f9190615037565b6040518115909202916000818181858888f19350505050158015611887573d6000803e3d6000fd5b50979650505050505050565b60005474010000000000000000000000000000000000000000900460ff1615611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b6119223382613b0c565b61192b57600080fd5b6000908152600b6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080821161198c57600080fd5b6000600a83815481106119a1576119a16150a0565b60009182526020918290206040805160e08101825291909201805467ffffffffffffffff8082168452680100000000000000008204169483019490945263ffffffff70010000000000000000000000000000000085048116938301939093527401000000000000000000000000000000000000000084048316606083015278010000000000000000000000000000000000000000000000008404909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008404811660a08301527e0100000000000000000000000000000000000000000000000000000000000090930490921660c08301529150611aa390613b4c565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b611b6a82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b7b92505050565b5050565b6000808311611b7c57600080fd5b60008211611b8957600080fd5b6000600a8481548110611b9e57611b9e6150a0565b9060005260206000200190506000600a8481548110611bbf57611bbf6150a0565b906000526020600020019050611bd782868387613b87565b8015611be85750611be88486613d8b565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b600d54600f544791600091611c8890600161504a565b611c929190615126565b905080821115611b6a57336108fc611caa8385615037565b6040518115909202916000818181858888f19350505050158015610fe8573d6000803e3d6000fd5b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610b52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c67565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b42601355565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b60008190508073ffffffffffffffffffffffffffffffffffffffff166385b861886040518163ffffffff1660e01b8152600401602060405180830381865afa158015611edc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f00919061513d565b611f0957600080fd5b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b600073ffffffffffffffffffffffffffffffffffffffff8216611ff6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c67565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b6120aa6000613dfa565b565b60005474010000000000000000000000000000000000000000900460ff1615612131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b600d5434101561214057600080fd5b61214a3383613b0c565b61215357600080fd5b61215d8183613d8b565b61216657600080fd5b6000600a838154811061217b5761217b6150a0565b60009182526020918290206040805160e08101825291909201805467ffffffffffffffff8082168452680100000000000000008204169483019490945263ffffffff70010000000000000000000000000000000085048116938301939093527401000000000000000000000000000000000000000084048316606083015278010000000000000000000000000000000000000000000000008404909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008404811660a08301527e0100000000000000000000000000000000000000000000000000000000000090930490921660c0830152915061227d90613b4c565b61228657600080fd5b6000600a838154811061229b5761229b6150a0565b60009182526020918290206040805160e08101825291909201805467ffffffffffffffff8082168452680100000000000000008204169483019490945263ffffffff70010000000000000000000000000000000085048116938301939093527401000000000000000000000000000000000000000084048316606083015278010000000000000000000000000000000000000000000000008404909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008404811660a08301527e0100000000000000000000000000000000000000000000000000000000000090930490921660c0830152915061239d90613b4c565b6123a657600080fd5b6123b282858386613b87565b6123bb57600080fd5b6123c58484613e6f565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461244c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b60005474010000000000000000000000000000000000000000900460ff16156124d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016114ea565b6060600061254d83611f51565b90508060000361256d575050604080516000815260208101909152919050565b60008167ffffffffffffffff81111561258857612588614cc8565b6040519080825280602002602001820160405280156125b1578160200160208202803683370190505b50905060006125be611073565b9050600060015b8281116126385760008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff808916911603612626578084838151811061260d5761260d6150a0565b60209081029190910101528161262281614fff565b9250505b8061263081614fff565b9150506125c5565b509195945050505050565b50919050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146126ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561273457600080fd5b505af11580156123c5573d6000803e3d6000fd5b33803b156127d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e7460448201527f6572616374207769746820746865206661726d000000000000000000000000006064820152608401610c67565b601c546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286b919061515a565b90506015548110156128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f796f75206e656564206d6f726520454c4f4e4f4e4521000000000000000000006044820152606401610c67565b6013546128e9906203f48061504a565b4210612951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f454c4f4e4f4e45206d696e74206973206f7665722100000000000000000000006044820152606401610c67565b336000908152601b602052604090205460ff16156129cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f616c7265616479206d696e7465640000000000000000000000000000000000006044820152606401610c67565b6129d9600080600033613483565b50336000908152601b6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556011805491612a2083614fff565b909155505060128054906000610d7e83614fff565b606060028054610b6790614f83565b606060078054610b6790614f83565b60005474010000000000000000000000000000000000000000900460ff1615612ad8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b612ae23386613b0c565b612aeb57600080fd5b612af485612fee565b15612afe57600080fd5b600c54612b219073ffffffffffffffffffffffffffffffffffffffff16866137a2565b600c546040517f7e5d9bb70000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064810184905233608482015273ffffffffffffffffffffffffffffffffffffffff83811660a483015290911690637e5d9bb79060c401600060405180830381600087803b158015612bb057600080fd5b505af1158015612bc4573d6000803e3d6000fd5b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff831603612c4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c67565b33600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600080600080600080600080600080600a8b81548110612d0757612d076150a0565b9060005260206000200190508060000160189054906101000a900463ffffffff1663ffffffff16600014159950428160000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115985080600001601c9054906101000a900461ffff1661ffff1697508060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1696508060000160189054906101000a900463ffffffff1663ffffffff1695508060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1694508060000160109054906101000a900463ffffffff1663ffffffff1693508060000160149054906101000a900463ffffffff1663ffffffff16925080600001601e9054906101000a900461ffff1661ffff169150509193959799909294969850565b612e47338361392d565b612ed3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c67565b6123c584848484613ff0565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16612f93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610c67565b6000612f9d612a44565b90506000815111612fbd5760405180602001604052806000815250611aa3565b80612fc784614093565b604051602001612fd8929190615173565b6040516020818303038152906040529392505050565b6000808211612ffc57600080fd5b600a828154811061300f5761300f6150a0565b6000918252602090912001547801000000000000000000000000000000000000000000000000900463ffffffff16151592915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146130c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b80825114613130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420636f756e74206f66206d696e74696e6700000000000000006044820152606401610c67565b60005b8251811015610fe8576000838281518110613150576131506150a0565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036131a9575060005473ffffffffffffffffffffffffffffffffffffffff165b601080549060006131b983614fff565b91905055506131cc600080600084613483565b505080806131d990614fff565b915050613133565b60005473ffffffffffffffffffffffffffffffffffffffff163314613262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b601693909355426017556018919091556019805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155601a8054929093169116179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314613346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b611b6a600882600e614914565b60005473ffffffffffffffffffffffffffffffffffffffff1633146133d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b73ffffffffffffffffffffffffffffffffffffffff8116613477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c67565b61348081613dfa565b50565b60008463ffffffff16851461349757600080fd5b8363ffffffff1684146134a957600080fd5b8261ffff1683146134b957600080fd5b60006134c660028561508c565b9050600d8161ffff1611156134d95750600d5b6040805160e08101825267ffffffffffffffff428116825260006020830181815263ffffffff808c169585019586528a8116606086019081526080860184815261ffff808a1660a089019081528d821660c08a01908152600a8054600181018255988190528a517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8909901805498519c51965195519351925185167e01000000000000000000000000000000000000000000000000000000000000027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff939095167c0100000000000000000000000000000000000000000000000000000000027fffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff948916780100000000000000000000000000000000000000000000000002949094167fffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff96891674010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff988a1670010000000000000000000000000000000002989098167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9e8d1668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909b169b909c169a909a17989098179b909b16989098179390931791909116949094171793909316919091179055915490918116811461371f57600080fd5b604082810151606080850151835173ffffffffffffffffffffffffffffffffffffffff8a1681526020810186905263ffffffff9384168186015292169082015290517f428b559deb78ae264f175a82b90ecac7f28acc5c0bbce329463bcf94aa5ffd539181900360800190a161379585826141c8565b925050505b949350505050565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906137fc82611cd2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d6919061515a565b9050806fffffffffffffffffffffffffffffffff1681146138f657600080fd5b600061390360028361508c565b61390d908361504a565b9050662386f26fc10000811015610b525750662386f26fc1000092915050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff166139de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c67565b60006139e983611cd2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613a5857508373ffffffffffffffffffffffffffffffffffffffff16613a4084610d87565b73ffffffffffffffffffffffffffffffffffffffff16145b8061379a575073ffffffffffffffffffffffffffffffffffffffff80821660009081526006602090815260408083209388168352929052205460ff1661379a565b613aa4838383614390565b6000908152600b6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000816080015163ffffffff16600014158015610b525750506020015167ffffffffffffffff4281169116111590565b60008273ffffffffffffffffffffffffffffffffffffffff16613b2e83611cd2565b73ffffffffffffffffffffffffffffffffffffffff16149392505050565b6000816080015163ffffffff166000148015610b525750506020015167ffffffffffffffff4281169116111590565b6007611b6a82826151f0565b6000818403613b985750600061379a565b8454700100000000000000000000000000000000900463ffffffff16821480613bdf5750845474010000000000000000000000000000000000000000900463ffffffff1682145b15613bec5750600061379a565b8254700100000000000000000000000000000000900463ffffffff16841480613c335750825474010000000000000000000000000000000000000000900463ffffffff1684145b15613c405750600061379a565b8254700100000000000000000000000000000000900463ffffffff161580613c8157508454700100000000000000000000000000000000900463ffffffff16155b15613c8e5750600161379a565b845483547001000000000000000000000000000000009182900463ffffffff90811692909104161480613cf8575084548354700100000000000000000000000000000000900463ffffffff9081167401000000000000000000000000000000000000000090920416145b15613d055750600061379a565b8454835474010000000000000000000000000000000000000000900463ffffffff908116700100000000000000000000000000000000909204161480613d73575084548354740100000000000000000000000000000000000000009182900463ffffffff9081169290910416145b15613d805750600061379a565b506001949350505050565b600081815260036020526040808220548483529082205473ffffffffffffffffffffffffffffffffffffffff918216911680821480611be857506000858152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff908116908316149250505092915050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600a8281548110613e8457613e846150a0565b9060005260206000200190506000600a8481548110613ea557613ea56150a0565b600091825260209091200180547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000063ffffffff8616021781559050613f04826145f7565b613f0d816145f7565b6000848152600b602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915585835290822080549091169055600f805491613f6083614fff565b9091555050600084815260036020908152604091829020548354835173ffffffffffffffffffffffffffffffffffffffff909216825291810187905291820185905268010000000000000000900467ffffffffffffffff1660608201527f8d386972618b2508abab1a415558214e499e5f02f175d1fa315d0fdd7022b23b9060800160405180910390a150505050565b613ffb848484613a99565b61400784848484614724565b6123c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c67565b6060816000036140d657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561410057806140ea81614fff565b91506140f99050600a8361508c565b91506140da565b60008167ffffffffffffffff81111561411b5761411b614cc8565b6040519080825280601f01601f191660200182016040528015614145576020820181803683370190505b5090505b841561379a5761415a600183615037565b9150614167600a8661530a565b61417290603061504a565b60f81b818381518110614187576141876150a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506141c1600a8661508c565b9450614149565b801561424b5773ffffffffffffffffffffffffffffffffffffffff821661424b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c67565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16156142d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c67565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040812080546001929061430d90849061504a565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8273ffffffffffffffffffffffffffffffffffffffff166143b082611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614614453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610c67565b73ffffffffffffffffffffffffffffffffffffffff82166144f5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c67565b6145006000826137a2565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600460205260408120805460019290614536908490615037565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040812080546001929061457190849061504a565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b805442906008907c0100000000000000000000000000000000000000000000000000000000900461ffff16600e8110614632576146326150a0565b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1661465e919061504a565b81547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff929092169190910217808255600d7c010000000000000000000000000000000000000000000000000000000090910461ffff1610156134805780546001908290601c906147079084907c0100000000000000000000000000000000000000000000000000000000900461ffff166150cf565b92506101000a81548161ffff021916908361ffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561490c576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061479b90339089908890889060040161531e565b6020604051808303816000875af19250505080156147f4575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526147f191810190615367565b60015b6148c1573d808015614822576040519150601f19603f3d011682016040523d82523d6000602084013e614827565b606091505b5080516000036148b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c67565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061379a565b50600161379a565b6002830191839082156149a65791602002820160005b8382111561497457833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030261492a565b80156149a45782816101000a81549063ffffffff0219169055600401602081600301049283019260010302614974565b505b506149b29291506149b6565b5090565b5b808211156149b257600081556001016149b7565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461348057600080fd5b600060208284031215614a0b57600080fd5b8135611aa3816149cb565b60005b83811015614a31578181015183820152602001614a19565b50506000910152565b60008151808452614a52816020860160208601614a16565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611aa36020830184614a3a565b73ffffffffffffffffffffffffffffffffffffffff8116811461348057600080fd5b600060208284031215614acb57600080fd5b8135611aa381614a97565b600060208284031215614ae857600080fd5b5035919050565b60008060408385031215614b0257600080fd5b8235614b0d81614a97565b946020939093013593505050565b600080600060608486031215614b3057600080fd5b8335614b3b81614a97565b92506020840135614b4b81614a97565b929592945050506040919091013590565b60008060208385031215614b6f57600080fd5b823567ffffffffffffffff80821115614b8757600080fd5b818501915085601f830112614b9b57600080fd5b813581811115614baa57600080fd5b866020828501011115614bbc57600080fd5b60209290920196919550909350505050565b60008060408385031215614be157600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015614c2857835183529284019291840191600101614c0c565b50909695505050505050565b600080600080600060a08688031215614c4c57600080fd5b853594506020860135935060408601359250606086013591506080860135614c7381614a97565b809150509295509295909350565b801515811461348057600080fd5b60008060408385031215614ca257600080fd5b8235614cad81614a97565b91506020830135614cbd81614c81565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614d3e57614d3e614cc8565b604052919050565b60008060008060808587031215614d5c57600080fd5b8435614d6781614a97565b9350602085810135614d7881614a97565b935060408601359250606086013567ffffffffffffffff80821115614d9c57600080fd5b818801915088601f830112614db057600080fd5b813581811115614dc257614dc2614cc8565b614df2847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614cf7565b91508082528984828501011115614e0857600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060408385031215614e3b57600080fd5b823567ffffffffffffffff80821115614e5357600080fd5b818501915085601f830112614e6757600080fd5b8135602082821115614e7b57614e7b614cc8565b8160051b9250614e8c818401614cf7565b8281529284018101928181019089851115614ea657600080fd5b948201945b84861015614ed05785359350614ec084614a97565b8382529482019490820190614eab565b9997909101359750505050505050565b60008060008060808587031215614ef657600080fd5b84359350602085013592506040850135614f0f81614a97565b91506060850135614f1f81614a97565b939692955090935050565b60006101c0808385031215614f3e57600080fd5b838184011115614f4d57600080fd5b509092915050565b60008060408385031215614f6857600080fd5b8235614f7381614a97565b91506020830135614cbd81614a97565b600181811c90821680614f9757607f821691505b602082108103612643577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361503057615030614fd0565b5060010190565b81810381811115610b5257610b52614fd0565b80820180821115610b5257610b52614fd0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261509b5761509b61505d565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b61ffff8181168382160190808211156150ea576150ea614fd0565b5092915050565b60008161510057615100614fd0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b8082028115828204841417610b5257610b52614fd0565b60006020828403121561514f57600080fd5b8151611aa381614c81565b60006020828403121561516c57600080fd5b5051919050565b60008351615185818460208801614a16565b835190830190615199818360208801614a16565b01949350505050565b601f821115610fe857600081815260208120601f850160051c810160208610156151c95750805b601f850160051c820191505b818110156151e8578281556001016151d5565b505050505050565b815167ffffffffffffffff81111561520a5761520a614cc8565b61521e816152188454614f83565b846151a2565b602080601f831160018114615271576000841561523b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556151e8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156152be5788860151825594840194600190910190840161529f565b50858210156152fa57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000826153195761531961505d565b500690565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261535d6080830184614a3a565b9695505050505050565b60006020828403121561537957600080fd5b8151611aa3816149cb56fea2646970667358221220a5d5cff765a94c33f2ce903d96e4ccfe4736b5e21494f45cecede46c7608012764736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010726f636b6574646173682e67616d652f00000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103595760003560e01c80636872ebdf116101bb5780639b7df652116100f7578063e319856d11610095578063e985e9c51161006f578063e985e9c5146109a4578063f1ca9410146109fa578063f2fde38b14610a10578063faea4a7414610a3057600080fd5b8063e319856d14610937578063e3868b4f14610957578063e6cbe3511461097757600080fd5b8063b88d4fde116100d1578063b88d4fde146108b7578063c87b56dd146108d7578063ca0e7fd3146108f7578063d4236f2d1461091757600080fd5b80639b7df65214610811578063a22cb46514610831578063aed4f39c1461085157600080fd5b80638462151c1161016457806391876e571161013e57806391876e57146107bd578063937df102146107d257806395d89b41146107e75780639abc8320146107fc57600080fd5b80638462151c1461074f5780638d3cfa9b1461077c5780638da5cb5b1461079257600080fd5b8063715018a611610195578063715018a61461071257806381e58b29146107275780638456cb591461073a57600080fd5b80636872ebdf146106bd5780636fbde40d146106d257806370a08231146106f257600080fd5b80631e419ff3116102955780634a696f15116102335780635c975abb1161020d5780635c975abb146106385780635f4fe931146106685780635fd8c710146106885780636352211e1461069d57600080fd5b80634a696f15146105e2578063551619131461060257806355f804b31461061857600080fd5b80633f4ba83a1161026f5780633f4ba83a1461056d57806342842e0e146105825780634693aee5146105a25780634821fa0a146105c257600080fd5b80631e419ff31461051057806323b872dd146105185780632b079b2e1461053857600080fd5b8063081812fc116103025780631091b981116102dc5780631091b981146104ae57806314394f59146104ce57806318160ddd146104e457806319c2f201146104f957600080fd5b8063081812fc1461042e578063095ea7b3146104735780630e583df01461049357600080fd5b806305fe46001161033357806305fe4600146103d457806306fdde03146103ea57806307d6e9a41461040c57600080fd5b806301ffc9a714610365578063041151871461039a57806305e45546146103be57600080fd5b3661036057005b600080fd5b34801561037157600080fd5b506103856103803660046149f9565b610a73565b60405190151581526020015b60405180910390f35b3480156103a657600080fd5b506103b060135481565b604051908152602001610391565b3480156103ca57600080fd5b506103b060105481565b3480156103e057600080fd5b506103b060125481565b3480156103f657600080fd5b506103ff610b58565b6040516103919190614a84565b34801561041857600080fd5b5061042c610427366004614ab9565b610bea565b005b34801561043a57600080fd5b5061044e610449366004614ad6565b610d87565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561047f57600080fd5b5061042c61048e366004614aef565b610e61565b34801561049f57600080fd5b506103b0662386f26fc1000081565b3480156104ba57600080fd5b5061042c6104c9366004614ad6565b610fed565b3480156104da57600080fd5b506103b0600f5481565b3480156104f057600080fd5b506103b0611073565b34801561050557600080fd5b506103b06201518081565b61042c61108a565b34801561052457600080fd5b5061042c610533366004614b1b565b6112c0565b34801561054457600080fd5b50610558610553366004614ad6565b611361565b60405163ffffffff9091168152602001610391565b34801561057957600080fd5b5061042c611391565b34801561058e57600080fd5b5061042c61059d366004614b1b565b6114f4565b3480156105ae57600080fd5b506103b06105bd366004614ad6565b61150f565b3480156105ce57600080fd5b5061042c6105dd366004614aef565b611893565b3480156105ee57600080fd5b506103856105fd366004614ad6565b61197e565b34801561060e57600080fd5b506103b0600e5481565b34801561062457600080fd5b5061042c610633366004614b5c565b611aaa565b34801561064457600080fd5b5060005474010000000000000000000000000000000000000000900460ff16610385565b34801561067457600080fd5b50610385610683366004614bce565b611b6e565b34801561069457600080fd5b5061042c611bf1565b3480156106a957600080fd5b5061044e6106b8366004614ad6565b611cd2565b3480156106c957600080fd5b5061042c611d84565b3480156106de57600080fd5b5061042c6106ed366004614ab9565b611e0b565b3480156106fe57600080fd5b506103b061070d366004614ab9565b611f51565b34801561071e57600080fd5b5061042c61201f565b61042c610735366004614bce565b6120ac565b34801561074657600080fd5b5061042c6123cb565b34801561075b57600080fd5b5061076f61076a366004614ab9565b612540565b6040516103919190614bf0565b34801561078857600080fd5b506103b0600d5481565b34801561079e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661044e565b3480156107c957600080fd5b5061042c612649565b3480156107de57600080fd5b5061042c612748565b3480156107f357600080fd5b506103ff612a35565b34801561080857600080fd5b506103ff612a44565b34801561081d57600080fd5b5061042c61082c366004614c34565b612a53565b34801561083d57600080fd5b5061042c61084c366004614c8f565b612bcf565b34801561085d57600080fd5b5061087161086c366004614ad6565b612ce5565b604080519915158a5297151560208a0152968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610391565b3480156108c357600080fd5b5061042c6108d2366004614d46565b612e3d565b3480156108e357600080fd5b506103ff6108f2366004614ad6565b612edf565b34801561090357600080fd5b50610385610912366004614ad6565b612fee565b34801561092357600080fd5b5061042c610932366004614e28565b613045565b34801561094357600080fd5b5061042c610952366004614ee0565b6131e1565b34801561096357600080fd5b5061042c610972366004614f2a565b6132c5565b34801561098357600080fd5b50600c5461044e9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156109b057600080fd5b506103856109bf366004614f55565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a0657600080fd5b506103b060115481565b348015610a1c57600080fd5b5061042c610a2b366004614ab9565b613353565b348015610a3c57600080fd5b5061044e610a4b366004614ad6565b600b6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b0657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b5257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060018054610b6790614f83565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9390614f83565b8015610be05780601f10610bb557610100808354040283529160200191610be0565b820191906000526020600020905b815481529060010190602001808311610bc357829003601f168201915b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6000610c80600080600030613483565b600c54909150610ca69073ffffffffffffffffffffffffffffffffffffffff16826137a2565b600c5473ffffffffffffffffffffffffffffffffffffffff16637e5d9bb782610ccd613842565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168152600481019290925260248201526000604482015262015180606482015230608482015273ffffffffffffffffffffffffffffffffffffffff851660a482015260c401600060405180830381600087803b158015610d5557600080fd5b505af1158015610d69573d6000803e3d6000fd5b505060118054925090506000610d7e83614fff565b91905055505050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16610e38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c67565b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610e6c82611cd2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c67565b3373ffffffffffffffffffffffffffffffffffffffff82161480610f525750610f5281336109bf565b610fde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c67565b610fe883836137a2565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b600d55565b600a5460009061108590600190615037565b905090565b33803b1561111a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e7460448201527f6572616374207769746820746865206661726d000000000000000000000000006064820152608401610c67565b60185460175461112a919061504a565b4210611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6d696e74206973206f76657200000000000000000000000000000000000000006044820152606401610c67565b6016543410156111fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6e6f7420656e6f75676820657468657220737570706c696564000000000000006044820152606401610c67565b61120c600080600033613483565b506011805490600061121d83614fff565b909155506000905061123060023461508c565b60195460405191925073ffffffffffffffffffffffffffffffffffffffff169082156108fc029083906000818181858888f19350505050158015611278573d6000803e3d6000fd5b50601a5460405173ffffffffffffffffffffffffffffffffffffffff9091169082156108fc029083906000818181858888f19350505050158015610fe8573d6000803e3d6000fd5b6112ca338261392d565b611356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c67565b610fe8838383613a99565b600881600e811061137157600080fd5b60089182820401919006600402915054906101000a900463ffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b60005474010000000000000000000000000000000000000000900460ff16611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610c67565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b610fe883838360405180602001604052806000815250612e3d565b6000805474010000000000000000000000000000000000000000900460ff1615611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b6000600a83815481106115aa576115aa6150a0565b60009182526020822001805490925067ffffffffffffffff1690036115ce57600080fd5b6040805160e081018252825467ffffffffffffffff808216835268010000000000000000820416602083015263ffffffff70010000000000000000000000000000000082048116938301939093527401000000000000000000000000000000000000000081048316606083015278010000000000000000000000000000000000000000000000008104909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008304811660a08301527e0100000000000000000000000000000000000000000000000000000000000090920490911660c08201526116bd90613adc565b6116c657600080fd5b8054600a8054780100000000000000000000000000000000000000000000000090920463ffffffff16916000919083908110611704576117046150a0565b6000918252602090912084549101805490925061ffff7e010000000000000000000000000000000000000000000000000000000000009283900481169290910416811015611776575080547e01000000000000000000000000000000000000000000000000000000000000900461ffff165b600086815260036020526040812054855473ffffffffffffffffffffffffffffffffffffffff90911691906117de9089907801000000000000000000000000000000000000000000000000900463ffffffff166117d48660016150cf565b61ffff1685613483565b86547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff168755600f80549192506000611816836150f1565b91905055503373ffffffffffffffffffffffffffffffffffffffff166108fc6103e8600e54600d546118489190615126565b611852919061508c565b600d5461185f9190615037565b6040518115909202916000818181858888f19350505050158015611887573d6000803e3d6000fd5b50979650505050505050565b60005474010000000000000000000000000000000000000000900460ff1615611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b6119223382613b0c565b61192b57600080fd5b6000908152600b6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080821161198c57600080fd5b6000600a83815481106119a1576119a16150a0565b60009182526020918290206040805160e08101825291909201805467ffffffffffffffff8082168452680100000000000000008204169483019490945263ffffffff70010000000000000000000000000000000085048116938301939093527401000000000000000000000000000000000000000084048316606083015278010000000000000000000000000000000000000000000000008404909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008404811660a08301527e0100000000000000000000000000000000000000000000000000000000000090930490921660c08301529150611aa390613b4c565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b611b6a82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b7b92505050565b5050565b6000808311611b7c57600080fd5b60008211611b8957600080fd5b6000600a8481548110611b9e57611b9e6150a0565b9060005260206000200190506000600a8481548110611bbf57611bbf6150a0565b906000526020600020019050611bd782868387613b87565b8015611be85750611be88486613d8b565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b600d54600f544791600091611c8890600161504a565b611c929190615126565b905080821115611b6a57336108fc611caa8385615037565b6040518115909202916000818181858888f19350505050158015610fe8573d6000803e3d6000fd5b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610b52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c67565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b42601355565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b60008190508073ffffffffffffffffffffffffffffffffffffffff166385b861886040518163ffffffff1660e01b8152600401602060405180830381865afa158015611edc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f00919061513d565b611f0957600080fd5b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b600073ffffffffffffffffffffffffffffffffffffffff8216611ff6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c67565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b6120aa6000613dfa565b565b60005474010000000000000000000000000000000000000000900460ff1615612131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b600d5434101561214057600080fd5b61214a3383613b0c565b61215357600080fd5b61215d8183613d8b565b61216657600080fd5b6000600a838154811061217b5761217b6150a0565b60009182526020918290206040805160e08101825291909201805467ffffffffffffffff8082168452680100000000000000008204169483019490945263ffffffff70010000000000000000000000000000000085048116938301939093527401000000000000000000000000000000000000000084048316606083015278010000000000000000000000000000000000000000000000008404909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008404811660a08301527e0100000000000000000000000000000000000000000000000000000000000090930490921660c0830152915061227d90613b4c565b61228657600080fd5b6000600a838154811061229b5761229b6150a0565b60009182526020918290206040805160e08101825291909201805467ffffffffffffffff8082168452680100000000000000008204169483019490945263ffffffff70010000000000000000000000000000000085048116938301939093527401000000000000000000000000000000000000000084048316606083015278010000000000000000000000000000000000000000000000008404909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008404811660a08301527e0100000000000000000000000000000000000000000000000000000000000090930490921660c0830152915061239d90613b4c565b6123a657600080fd5b6123b282858386613b87565b6123bb57600080fd5b6123c58484613e6f565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461244c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b60005474010000000000000000000000000000000000000000900460ff16156124d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016114ea565b6060600061254d83611f51565b90508060000361256d575050604080516000815260208101909152919050565b60008167ffffffffffffffff81111561258857612588614cc8565b6040519080825280602002602001820160405280156125b1578160200160208202803683370190505b50905060006125be611073565b9050600060015b8281116126385760008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff808916911603612626578084838151811061260d5761260d6150a0565b60209081029190910101528161262281614fff565b9250505b8061263081614fff565b9150506125c5565b509195945050505050565b50919050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146126ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561273457600080fd5b505af11580156123c5573d6000803e3d6000fd5b33803b156127d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e7460448201527f6572616374207769746820746865206661726d000000000000000000000000006064820152608401610c67565b601c546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286b919061515a565b90506015548110156128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f796f75206e656564206d6f726520454c4f4e4f4e4521000000000000000000006044820152606401610c67565b6013546128e9906203f48061504a565b4210612951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f454c4f4e4f4e45206d696e74206973206f7665722100000000000000000000006044820152606401610c67565b336000908152601b602052604090205460ff16156129cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f616c7265616479206d696e7465640000000000000000000000000000000000006044820152606401610c67565b6129d9600080600033613483565b50336000908152601b6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556011805491612a2083614fff565b909155505060128054906000610d7e83614fff565b606060028054610b6790614f83565b606060078054610b6790614f83565b60005474010000000000000000000000000000000000000000900460ff1615612ad8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b612ae23386613b0c565b612aeb57600080fd5b612af485612fee565b15612afe57600080fd5b600c54612b219073ffffffffffffffffffffffffffffffffffffffff16866137a2565b600c546040517f7e5d9bb70000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064810184905233608482015273ffffffffffffffffffffffffffffffffffffffff83811660a483015290911690637e5d9bb79060c401600060405180830381600087803b158015612bb057600080fd5b505af1158015612bc4573d6000803e3d6000fd5b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff831603612c4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c67565b33600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600080600080600080600080600080600a8b81548110612d0757612d076150a0565b9060005260206000200190508060000160189054906101000a900463ffffffff1663ffffffff16600014159950428160000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115985080600001601c9054906101000a900461ffff1661ffff1697508060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1696508060000160189054906101000a900463ffffffff1663ffffffff1695508060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1694508060000160109054906101000a900463ffffffff1663ffffffff1693508060000160149054906101000a900463ffffffff1663ffffffff16925080600001601e9054906101000a900461ffff1661ffff169150509193959799909294969850565b612e47338361392d565b612ed3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c67565b6123c584848484613ff0565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16612f93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610c67565b6000612f9d612a44565b90506000815111612fbd5760405180602001604052806000815250611aa3565b80612fc784614093565b604051602001612fd8929190615173565b6040516020818303038152906040529392505050565b6000808211612ffc57600080fd5b600a828154811061300f5761300f6150a0565b6000918252602090912001547801000000000000000000000000000000000000000000000000900463ffffffff16151592915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146130c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b80825114613130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420636f756e74206f66206d696e74696e6700000000000000006044820152606401610c67565b60005b8251811015610fe8576000838281518110613150576131506150a0565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036131a9575060005473ffffffffffffffffffffffffffffffffffffffff165b601080549060006131b983614fff565b91905055506131cc600080600084613483565b505080806131d990614fff565b915050613133565b60005473ffffffffffffffffffffffffffffffffffffffff163314613262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b601693909355426017556018919091556019805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155601a8054929093169116179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314613346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b611b6a600882600e614914565b60005473ffffffffffffffffffffffffffffffffffffffff1633146133d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b73ffffffffffffffffffffffffffffffffffffffff8116613477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c67565b61348081613dfa565b50565b60008463ffffffff16851461349757600080fd5b8363ffffffff1684146134a957600080fd5b8261ffff1683146134b957600080fd5b60006134c660028561508c565b9050600d8161ffff1611156134d95750600d5b6040805160e08101825267ffffffffffffffff428116825260006020830181815263ffffffff808c169585019586528a8116606086019081526080860184815261ffff808a1660a089019081528d821660c08a01908152600a8054600181018255988190528a517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8909901805498519c51965195519351925185167e01000000000000000000000000000000000000000000000000000000000000027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff939095167c0100000000000000000000000000000000000000000000000000000000027fffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff948916780100000000000000000000000000000000000000000000000002949094167fffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff96891674010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff988a1670010000000000000000000000000000000002989098167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9e8d1668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909b169b909c169a909a17989098179b909b16989098179390931791909116949094171793909316919091179055915490918116811461371f57600080fd5b604082810151606080850151835173ffffffffffffffffffffffffffffffffffffffff8a1681526020810186905263ffffffff9384168186015292169082015290517f428b559deb78ae264f175a82b90ecac7f28acc5c0bbce329463bcf94aa5ffd539181900360800190a161379585826141c8565b925050505b949350505050565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906137fc82611cd2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d6919061515a565b9050806fffffffffffffffffffffffffffffffff1681146138f657600080fd5b600061390360028361508c565b61390d908361504a565b9050662386f26fc10000811015610b525750662386f26fc1000092915050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff166139de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c67565b60006139e983611cd2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613a5857508373ffffffffffffffffffffffffffffffffffffffff16613a4084610d87565b73ffffffffffffffffffffffffffffffffffffffff16145b8061379a575073ffffffffffffffffffffffffffffffffffffffff80821660009081526006602090815260408083209388168352929052205460ff1661379a565b613aa4838383614390565b6000908152600b6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000816080015163ffffffff16600014158015610b525750506020015167ffffffffffffffff4281169116111590565b60008273ffffffffffffffffffffffffffffffffffffffff16613b2e83611cd2565b73ffffffffffffffffffffffffffffffffffffffff16149392505050565b6000816080015163ffffffff166000148015610b525750506020015167ffffffffffffffff4281169116111590565b6007611b6a82826151f0565b6000818403613b985750600061379a565b8454700100000000000000000000000000000000900463ffffffff16821480613bdf5750845474010000000000000000000000000000000000000000900463ffffffff1682145b15613bec5750600061379a565b8254700100000000000000000000000000000000900463ffffffff16841480613c335750825474010000000000000000000000000000000000000000900463ffffffff1684145b15613c405750600061379a565b8254700100000000000000000000000000000000900463ffffffff161580613c8157508454700100000000000000000000000000000000900463ffffffff16155b15613c8e5750600161379a565b845483547001000000000000000000000000000000009182900463ffffffff90811692909104161480613cf8575084548354700100000000000000000000000000000000900463ffffffff9081167401000000000000000000000000000000000000000090920416145b15613d055750600061379a565b8454835474010000000000000000000000000000000000000000900463ffffffff908116700100000000000000000000000000000000909204161480613d73575084548354740100000000000000000000000000000000000000009182900463ffffffff9081169290910416145b15613d805750600061379a565b506001949350505050565b600081815260036020526040808220548483529082205473ffffffffffffffffffffffffffffffffffffffff918216911680821480611be857506000858152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff908116908316149250505092915050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600a8281548110613e8457613e846150a0565b9060005260206000200190506000600a8481548110613ea557613ea56150a0565b600091825260209091200180547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000063ffffffff8616021781559050613f04826145f7565b613f0d816145f7565b6000848152600b602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915585835290822080549091169055600f805491613f6083614fff565b9091555050600084815260036020908152604091829020548354835173ffffffffffffffffffffffffffffffffffffffff909216825291810187905291820185905268010000000000000000900467ffffffffffffffff1660608201527f8d386972618b2508abab1a415558214e499e5f02f175d1fa315d0fdd7022b23b9060800160405180910390a150505050565b613ffb848484613a99565b61400784848484614724565b6123c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c67565b6060816000036140d657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561410057806140ea81614fff565b91506140f99050600a8361508c565b91506140da565b60008167ffffffffffffffff81111561411b5761411b614cc8565b6040519080825280601f01601f191660200182016040528015614145576020820181803683370190505b5090505b841561379a5761415a600183615037565b9150614167600a8661530a565b61417290603061504a565b60f81b818381518110614187576141876150a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506141c1600a8661508c565b9450614149565b801561424b5773ffffffffffffffffffffffffffffffffffffffff821661424b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c67565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16156142d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c67565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040812080546001929061430d90849061504a565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8273ffffffffffffffffffffffffffffffffffffffff166143b082611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614614453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610c67565b73ffffffffffffffffffffffffffffffffffffffff82166144f5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c67565b6145006000826137a2565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600460205260408120805460019290614536908490615037565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040812080546001929061457190849061504a565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b805442906008907c0100000000000000000000000000000000000000000000000000000000900461ffff16600e8110614632576146326150a0565b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1661465e919061504a565b81547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff929092169190910217808255600d7c010000000000000000000000000000000000000000000000000000000090910461ffff1610156134805780546001908290601c906147079084907c0100000000000000000000000000000000000000000000000000000000900461ffff166150cf565b92506101000a81548161ffff021916908361ffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561490c576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061479b90339089908890889060040161531e565b6020604051808303816000875af19250505080156147f4575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526147f191810190615367565b60015b6148c1573d808015614822576040519150601f19603f3d011682016040523d82523d6000602084013e614827565b606091505b5080516000036148b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c67565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061379a565b50600161379a565b6002830191839082156149a65791602002820160005b8382111561497457833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030261492a565b80156149a45782816101000a81549063ffffffff0219169055600401602081600301049283019260010302614974565b505b506149b29291506149b6565b5090565b5b808211156149b257600081556001016149b7565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461348057600080fd5b600060208284031215614a0b57600080fd5b8135611aa3816149cb565b60005b83811015614a31578181015183820152602001614a19565b50506000910152565b60008151808452614a52816020860160208601614a16565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611aa36020830184614a3a565b73ffffffffffffffffffffffffffffffffffffffff8116811461348057600080fd5b600060208284031215614acb57600080fd5b8135611aa381614a97565b600060208284031215614ae857600080fd5b5035919050565b60008060408385031215614b0257600080fd5b8235614b0d81614a97565b946020939093013593505050565b600080600060608486031215614b3057600080fd5b8335614b3b81614a97565b92506020840135614b4b81614a97565b929592945050506040919091013590565b60008060208385031215614b6f57600080fd5b823567ffffffffffffffff80821115614b8757600080fd5b818501915085601f830112614b9b57600080fd5b813581811115614baa57600080fd5b866020828501011115614bbc57600080fd5b60209290920196919550909350505050565b60008060408385031215614be157600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015614c2857835183529284019291840191600101614c0c565b50909695505050505050565b600080600080600060a08688031215614c4c57600080fd5b853594506020860135935060408601359250606086013591506080860135614c7381614a97565b809150509295509295909350565b801515811461348057600080fd5b60008060408385031215614ca257600080fd5b8235614cad81614a97565b91506020830135614cbd81614c81565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614d3e57614d3e614cc8565b604052919050565b60008060008060808587031215614d5c57600080fd5b8435614d6781614a97565b9350602085810135614d7881614a97565b935060408601359250606086013567ffffffffffffffff80821115614d9c57600080fd5b818801915088601f830112614db057600080fd5b813581811115614dc257614dc2614cc8565b614df2847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614cf7565b91508082528984828501011115614e0857600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060408385031215614e3b57600080fd5b823567ffffffffffffffff80821115614e5357600080fd5b818501915085601f830112614e6757600080fd5b8135602082821115614e7b57614e7b614cc8565b8160051b9250614e8c818401614cf7565b8281529284018101928181019089851115614ea657600080fd5b948201945b84861015614ed05785359350614ec084614a97565b8382529482019490820190614eab565b9997909101359750505050505050565b60008060008060808587031215614ef657600080fd5b84359350602085013592506040850135614f0f81614a97565b91506060850135614f1f81614a97565b939692955090935050565b60006101c0808385031215614f3e57600080fd5b838184011115614f4d57600080fd5b509092915050565b60008060408385031215614f6857600080fd5b8235614f7381614a97565b91506020830135614cbd81614a97565b600181811c90821680614f9757607f821691505b602082108103612643577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361503057615030614fd0565b5060010190565b81810381811115610b5257610b52614fd0565b80820180821115610b5257610b52614fd0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261509b5761509b61505d565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b61ffff8181168382160190808211156150ea576150ea614fd0565b5092915050565b60008161510057615100614fd0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b8082028115828204841417610b5257610b52614fd0565b60006020828403121561514f57600080fd5b8151611aa381614c81565b60006020828403121561516c57600080fd5b5051919050565b60008351615185818460208801614a16565b835190830190615199818360208801614a16565b01949350505050565b601f821115610fe857600081815260208120601f850160051c810160208610156151c95750805b601f850160051c820191505b818110156151e8578281556001016151d5565b505050505050565b815167ffffffffffffffff81111561520a5761520a614cc8565b61521e816152188454614f83565b846151a2565b602080601f831160018114615271576000841561523b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556151e8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156152be5788860151825594840194600190910190840161529f565b50858210156152fa57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000826153195761531961505d565b500690565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261535d6080830184614a3a565b9695505050505050565b60006020828403121561537957600080fd5b8151611aa3816149cb56fea2646970667358221220a5d5cff765a94c33f2ce903d96e4ccfe4736b5e21494f45cecede46c7608012764736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010726f636b6574646173682e67616d652f00000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseUri (string): rocketdash.game/

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [2] : 726f636b6574646173682e67616d652f00000000000000000000000000000000


Deployed Bytecode Sourcemap

78826:6019:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42383:305;;;;;;;;;;-1:-1:-1;42383:305:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;42383:305:0;;;;;;;;79224:23;;;;;;;;;;;;;;;;;;;784:25:1;;;772:2;757:18;79224:23:0;638:177:1;79104:32:0;;;;;;;;;;;;;;;;79181:34;;;;;;;;;;;;;;;;43328:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;82050:446::-;;;;;;;;;;-1:-1:-1;82050:446:0;;;;;:::i;:::-;;:::i;:::-;;44887:221;;;;;;;;;;-1:-1:-1;44887:221:0;;;;;:::i;:::-;;:::i;:::-;;;2407:42:1;2395:55;;;2377:74;;2365:2;2350:18;44887:221:0;2231:226:1;44417:404:0;;;;;;;;;;-1:-1:-1;44417:404:0;;;;;:::i;:::-;;:::i;78914:51::-;;;;;;;;;;;;78960:5;78914:51;;66284:94;;;;;;;;;;-1:-1:-1;66284:94:0;;;;;:::i;:::-;;:::i;63333:35::-;;;;;;;;;;;;;;;;61329:94;;;;;;;;;;;;;:::i;78972:54::-;;;;;;;;;;;;79020:6;78972:54;;81064:417;;;:::i;45777:339::-;;;;;;;;;;-1:-1:-1;45777:339:0;;;;;:::i;:::-;;:::i;57643:409::-;;;;;;;;;;-1:-1:-1;57643:409:0;;;;;:::i;:::-;;:::i;:::-;;;3417:10:1;3405:23;;;3387:42;;3375:2;3360:18;57643:409:0;3243:192:1;7298:119:0;;;;;;;;;;;;;:::i;46187:185::-;;;;;;;;;;-1:-1:-1;46187:185:0;;;;;:::i;:::-;;:::i;74991:1500::-;;;;;;;;;;-1:-1:-1;74991:1500:0;;;;;:::i;:::-;;:::i;65948:251::-;;;;;;;;;;-1:-1:-1;65948:251:0;;;;;:::i;:::-;;:::i;66960:239::-;;;;;;;;;;-1:-1:-1;66960:239:0;;;;;:::i;:::-;;:::i;63228:26::-;;;;;;;;;;;;;;;;54649:115;;;;;;;;;;-1:-1:-1;54649:115:0;;;;;:::i;:::-;;:::i;6240:86::-;;;;;;;;;;-1:-1:-1;6287:4:0;6311:7;;;;;;6240:86;;70445:547;;;;;;;;;;-1:-1:-1;70445:547:0;;;;;:::i;:::-;;:::i;84366:386::-;;;;;;;;;;;;;:::i;43022:239::-;;;;;;;;;;-1:-1:-1;43022:239:0;;;;;:::i;:::-;;:::i;80070:91::-;;;;;;;;;;;;;:::i;76991:295::-;;;;;;;;;;-1:-1:-1;76991:295:0;;;;;:::i;:::-;;:::i;42752:208::-;;;;;;;;;;-1:-1:-1;42752:208:0;;;;;:::i;:::-;;:::i;4448:103::-;;;;;;;;;;;;;:::i;72722:1581::-;;;;;;:::i;:::-;;:::i;7040:117::-;;;;;;;;;;;;;:::i;61892:903::-;;;;;;;;;;-1:-1:-1;61892:903:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63152:34::-;;;;;;;;;;;;;;;;3797:87;;;;;;;;;;-1:-1:-1;3843:7:0;3870:6;;;3797:87;;78717:102;;;;;;;;;;;;;:::i;80169:480::-;;;;;;;;;;;;;:::i;43497:104::-;;;;;;;;;;;;;:::i;55337:89::-;;;;;;;;;;;;;:::i;77406:1102::-;;;;;;;;;;-1:-1:-1;77406:1102:0;;;;;:::i;:::-;;:::i;45180:295::-;;;;;;;;;;-1:-1:-1;45180:295:0;;;;;:::i;:::-;;:::i;83273:1004::-;;;;;;;;;;-1:-1:-1;83273:1004:0;;;;;:::i;:::-;;:::i;:::-;;;;6347:14:1;;6340:22;6322:41;;6406:14;;6399:22;6394:2;6379:18;;6372:50;6438:18;;;6431:34;;;;6496:2;6481:18;;6474:34;;;;6539:3;6524:19;;6517:35;;;;6583:3;6568:19;;6561:35;6627:3;6612:19;;6605:35;6671:3;6656:19;;6649:35;6715:3;6700:19;;6693:35;6309:3;6294:19;83273:1004:0;5963:771:1;46443:328:0;;;;;;;;;;-1:-1:-1;46443:328:0;;;;;:::i;:::-;;:::i;43672:334::-;;;;;;;;;;-1:-1:-1;43672:334:0;;;;;:::i;:::-;;:::i;67361:269::-;;;;;;;;;;-1:-1:-1;67361:269:0;;;;;:::i;:::-;;:::i;81489:476::-;;;;;;;;;;-1:-1:-1;81489:476:0;;;;;:::i;:::-;;:::i;80701:355::-;;;;;;;;;;-1:-1:-1;80701:355:0;;;;;:::i;:::-;;:::i;62801:111::-;;;;;;;;;;-1:-1:-1;62801:111:0;;;;;:::i;:::-;;:::i;58782:35::-;;;;;;;;;;-1:-1:-1;58782:35:0;;;;;;;;45546:164;;;;;;;;;;-1:-1:-1;45546:164:0;;;;;:::i;:::-;45667:25;;;;45643:4;45667:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45546:164;79143:31;;;;;;;;;;;;;;;;4706:201;;;;;;;;;;-1:-1:-1;4706:201:0;;;;;:::i;:::-;;:::i;58532:66::-;;;;;;;;;;-1:-1:-1;58532:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42383:305;42485:4;42522:40;;;42537:25;42522:40;;:105;;-1:-1:-1;42579:48:0;;;42594:33;42579:48;42522:105;:158;;;-1:-1:-1;35721:25:0;35706:40;;;;42644:36;42502:178;42383:305;-1:-1:-1;;42383:305:0:o;43328:100::-;43382:13;43415:5;43408:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43328:100;:::o;82050:446::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;;;;;;;;;82132:16:::1;82151:37;82165:1;82168::::0;82171::::1;82182:4;82151:13;:37::i;:::-;82216:11;::::0;82132:56;;-1:-1:-1;82199:40:0::1;::::0;82216:11:::1;;82132:56:::0;82199:8:::1;:40::i;:::-;82252:11;::::0;::::1;;:25;82292:8:::0;82315:23:::1;:21;:23::i;:::-;82252:205;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;12106:25:1::0;;;;12147:18;;;12140:34;82353:1:0::1;12190:18:1::0;;;12183:34;79020:6:0::1;12233:18:1::0;;;12226:34;82413:4:0::1;12337:19:1::0;;;12330:44;12279:42;12411:15;;12390:19;;;12383:44;12078:19;;82252:205:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;82470:16:0::1;:18:::0;;;-1:-1:-1;82470:16:0;-1:-1:-1;82470:16:0::1;:18;::::0;::::1;:::i;:::-;;;;;;82119:377;82050:446:::0;:::o;44887:221::-;44963:7;48370:16;;;:7;:16;;;;;;:30;:16;44983:73;;;;;;;13029:2:1;44983:73:0;;;13011:21:1;13068:2;13048:18;;;13041:30;13107:34;13087:18;;;13080:62;13178:14;13158:18;;;13151:42;13210:19;;44983:73:0;12827:408:1;44983:73:0;-1:-1:-1;45076:24:0;;;;:15;:24;;;;;;;;;44887:221::o;44417:404::-;44498:13;44514:16;44522:7;44514;:16::i;:::-;44498:32;;44555:5;44549:11;;:2;:11;;;44541:57;;;;;;;13442:2:1;44541:57:0;;;13424:21:1;13481:2;13461:18;;;13454:30;13520:34;13500:18;;;13493:62;13591:3;13571:18;;;13564:31;13612:19;;44541:57:0;13240:397:1;44541:57:0;2744:10;44633:21;;;;;:62;;-1:-1:-1;44658:37:0;44675:5;2744:10;45546:164;:::i;44658:37::-;44611:168;;;;;;;13844:2:1;44611:168:0;;;13826:21:1;13883:2;13863:18;;;13856:30;13922:34;13902:18;;;13895:62;13993:26;13973:18;;;13966:54;14037:19;;44611:168:0;13642:420:1;44611:168:0;44792:21;44801:2;44805:7;44792:8;:21::i;:::-;44487:334;44417:404;;:::o;66284:94::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;66352:12:::1;:18:::0;66284:94::o;61329:::-;61397:7;:14;61373:4;;61397:18;;61414:1;;61397:18;:::i;:::-;61390:25;;61329:94;:::o;81064:417::-;81125:10;26302:19;;:23;79942:100;;;;;;;14402:2:1;79942:100:0;;;14384:21:1;14441:2;14421:18;;;14414:30;14480:34;14460:18;;;14453:62;14551:21;14531:18;;;14524:49;14590:19;;79942:100:0;14200:415:1;79942:100:0;81185:10:::1;;81174:8;;:21;;;;:::i;:::-;81156:15;:39;81148:64;;;::::0;::::1;::::0;;14952:2:1;81148:64:0::1;::::0;::::1;14934:21:1::0;14991:2;14971:18;;;14964:30;15030:14;15010:18;;;15003:42;15062:18;;81148:64:0::1;14750:336:1::0;81148:64:0::1;81244:9;;81231;:22;;81223:60;;;::::0;::::1;::::0;;15293:2:1;81223:60:0::1;::::0;::::1;15275:21:1::0;15332:2;15312:18;;;15305:30;15371:27;15351:18;;;15344:55;15416:18;;81223:60:0::1;15091:349:1::0;81223:60:0::1;81294:34;81308:1;81311::::0;81314::::1;81317:10;81294:13;:34::i;:::-;-1:-1:-1::0;81339:16:0::1;:18:::0;;;:16:::1;:18;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;81368:12:0::1;::::0;-1:-1:-1;81383:13:0::1;81395:1;81383:9;:13;:::i;:::-;81407:14;::::0;:29:::1;::::0;81368:28;;-1:-1:-1;81407:14:0::1;;::::0;:29;::::1;;;::::0;81368:28;;81407:14:::1;:29:::0;:14;:29;81368:28;81407:14;:29;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;81447:11:0::1;::::0;:26:::1;::::0;:11:::1;::::0;;::::1;::::0;:26;::::1;;;::::0;81468:4;;81447:11:::1;:26:::0;:11;:26;81468:4;81447:11;:26;::::1;;;;;;;;;;;;;::::0;::::1;;;;45777:339:::0;45972:41;2744:10;46005:7;45972:18;:41::i;:::-;45964:103;;;;;;;15961:2:1;45964:103:0;;;15943:21:1;16000:2;15980:18;;;15973:30;16039:34;16019:18;;;16012:62;16110:19;16090:18;;;16083:47;16147:19;;45964:103:0;15759:413:1;45964:103:0;46080:28;46090:4;46096:2;46100:7;46080:9;:28::i;57643:409::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7298:119::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;6287:4;6311:7;;;;;;6835:41:::1;;;::::0;::::1;::::0;;16379:2:1;6835:41:0::1;::::0;::::1;16361:21:1::0;16418:2;16398:18;;;16391:30;16457:22;16437:18;;;16430:50;16497:18;;6835:41:0::1;16177:344:1::0;6835:41:0::1;7368:5:::2;7358:15:::0;;;::::2;::::0;;7389:20:::2;::::0;7398:10:::2;2377:74:1::0;;7389:20:0::2;::::0;2365:2:1;2350:18;7389:20:0::2;;;;;;;;7298:119::o:0;46187:185::-;46325:39;46342:4;46348:2;46352:7;46325:39;;;;;;;;;;;;:16;:39::i;74991:1500::-;75097:7;6311;;;;;;;6565:9;6557:38;;;;;;;16728:2:1;6557:38:0;;;16710:21:1;16767:2;16747:18;;;16740:30;16806:18;16786;;;16779:46;16842:18;;6557:38:0;16526:340:1;6557:38:0;75184:28:::1;75215:7;75223:16;75215:25;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;75321:23:::0;;75215:25;;-1:-1:-1;75321:23:0::1;;:28:::0;;75313:37:::1;;;::::0;::::1;;75413:31;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;::::1;;;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;:16:::1;:31::i;:::-;75405:40;;;::::0;::::1;;75548:30:::0;;75621:7:::1;:25:::0;;75548:30;;;::::1;;;::::0;75521:24:::1;::::0;75621:7;75548:30;;75621:25;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;75750:24;;75621:25;::::1;75789::::0;;75621;;-1:-1:-1;75750:24:0::1;::::0;;;;::::1;::::0;::::1;::::0;75789:25;;::::1;;:52:::0;-1:-1:-1;75785:122:0::1;;;-1:-1:-1::0;75870:25:0;;;;::::1;;;75785:122;75954:13;75970:25:::0;;;:7:::1;:25;::::0;;;;;76057:30;;75970:25:::1;::::0;;::::1;::::0;75954:13;76025:86:::1;::::0;75970:25;;76057:30;;::::1;;;76089:13;:9:::0;75970:25;76089:13:::1;:::i;:::-;76025:86;;76105:5;76025:13;:86::i;:::-;76124:37:::0;;;::::1;::::0;;76242:20:::1;:22:::0;;76006:105;;-1:-1:-1;76131:30:0::1;76242:22;::::0;::::1;:::i;:::-;;;;;;76355:10;76347:28;;:69;76410:4;76403:6;;76390:12;;:19;;;;:::i;:::-;:24;;;;:::i;:::-;76376:12;;:39;;;;:::i;:::-;76347:69;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;76475:8:0;74991:1500;-1:-1:-1;;;;;;;74991:1500:0:o;65948:251::-;6287:4;6311:7;;;;;;6565:9;6557:38;;;;;;;16728:2:1;6557:38:0;;;16710:21:1;16767:2;16747:18;;;16740:30;16806:18;16786;;;16779:46;16842:18;;6557:38:0;16526:340:1;6557:38:0;66086:36:::1;66092:10;66104:17;66086:5;:36::i;:::-;66078:45;;;::::0;::::1;;66134:49;::::0;;;:30:::1;:49;::::0;;;;:57;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;65948:251::o;66960:239::-;67051:4;67093:1;67081:9;:13;67073:22;;;;;;67106;67131:7;67139:9;67131:18;;;;;;;;:::i;:::-;;;;;;;;;;67167:24;;;;;;;;67131:18;;;;67167:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67131:18;-1:-1:-1;67167:24:0;;:15;:24::i;:::-;67160:31;66960:239;-1:-1:-1;;;66960:239:0:o;54649:115::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;54730:26:::1;54742:13;;54730:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;54730:11:0::1;::::0;-1:-1:-1;;;54730:26:0:i:1;:::-;54649:115:::0;;:::o;70445:547::-;70569:4;70618:1;70599:16;:20;70591:29;;;;;;70659:1;70639:17;:21;70631:30;;;;;;70672:28;70703:7;70711:16;70703:25;;;;;;;;:::i;:::-;;;;;;;;70672:56;;70739:29;70771:7;70779:17;70771:26;;;;;;;;:::i;:::-;;;;;;;;70739:58;;70815:89;70837:13;70852:16;70870:14;70886:17;70815:21;:89::i;:::-;:169;;;;;70921:63;70948:17;70967:16;70921:26;:63::i;:::-;70808:176;70445:547;-1:-1:-1;;;;;70445:547:0:o;84366:386::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;84613:12:::1;::::0;84585:20:::1;::::0;84441:21:::1;::::0;84423:15:::1;::::0;84585:24:::1;::::0;84608:1:::1;84585:24;:::i;:::-;84584:41;;;;:::i;:::-;84561:64;;84652:12;84642:7;:22;84638:107;;;84689:10;84681:52;84710:22;84720:12:::0;84710:7;:22:::1;:::i;:::-;84681:52;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;43022:239:::0;43094:7;43130:16;;;:7;:16;;;;;;;;;43157:73;;;;;;;17809:2:1;43157:73:0;;;17791:21:1;17848:2;17828:18;;;17821:30;17887:34;17867:18;;;17860:62;17958:11;17938:18;;;17931:39;17987:19;;43157:73:0;17607:405:1;80070:91:0;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;80138:15:::1;80127:8;:26:::0;80070:91::o;76991:295::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;77070:34:::1;77124:8;77070:63;;77154:17;:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77146:47;;;::::0;::::1;;77247:11;:31:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;76991:295:0:o;42752:208::-;42824:7;42852:19;;;42844:74;;;;;;;18469:2:1;42844:74:0;;;18451:21:1;18508:2;18488:18;;;18481:30;18547:34;18527:18;;;18520:62;18618:12;18598:18;;;18591:40;18648:19;;42844:74:0;18267:406:1;42844:74:0;-1:-1:-1;42936:16:0;;;;;;:9;:16;;;;;;;42752:208::o;4448:103::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;4513:30:::1;4540:1;4513:18;:30::i;:::-;4448:103::o:0;72722:1581::-;6287:4;6311:7;;;;;;6565:9;6557:38;;;;;;;16728:2:1;6557:38:0;;;16710:21:1;16767:2;16747:18;;;16740:30;16806:18;16786;;;16779:46;16842:18;;6557:38:0;16526:340:1;6557:38:0;72926:12:::1;;72913:9;:25;;72905:34;;;::::0;::::1;;73007:35;73013:10;73025:16;73007:5;:35::i;:::-;72999:44;;;::::0;::::1;;73311:63;73338:17;73357:16;73311:26;:63::i;:::-;73303:72;;;::::0;::::1;;73448:28;73479:7;73487:16;73479:25;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;73624:30:::1;::::0;;::::1;::::0;::::1;::::0;;73479:25;;;::::1;73624:30:::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;;;73479:25;-1:-1:-1;73624:30:0::1;::::0;:15:::1;:30::i;:::-;73616:39;;;::::0;::::1;;73729:29;73761:7;73769:17;73761:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;73908:31:::1;::::0;;::::1;::::0;::::1;::::0;;73761:26;;;::::1;73908:31:::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;;;73761:26;-1:-1:-1;73908:31:0::1;::::0;:15:::1;:31::i;:::-;73900:40;;;::::0;::::1;;74024:152;74060:13;74088:16;74119:14;74148:17;74024:21;:152::i;:::-;74016:161;;;::::0;::::1;;74248:47;74259:16;74277:17;74248:10;:47::i;:::-;72862:1441;;72722:1581:::0;;:::o;7040:117::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;6287:4;6311:7;;;;;;6565:9:::1;6557:38;;;::::0;::::1;::::0;;16728:2:1;6557:38:0::1;::::0;::::1;16710:21:1::0;16767:2;16747:18;;;16740:30;16806:18;16786;;;16779:46;16842:18;;6557:38:0::1;16526:340:1::0;6557:38:0::1;7101:7:::2;:14:::0;;;::::2;::::0;::::2;::::0;;7131:18:::2;::::0;7138:10:::2;2377:74:1::0;;7131:18:0::2;::::0;2365:2:1;2350:18;7131::0::2;2231:226:1::0;61892:903:0;61953:28;61994:18;62015:17;62025:6;62015:9;:17::i;:::-;61994:38;;62049:10;62063:1;62049:15;62045:743;;-1:-1:-1;;62126:16:0;;;62140:1;62126:16;;;;;;;;;62119:23;-1:-1:-1;61892:903:0:o;62045:743::-;62175:23;62215:10;62201:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62201:25:0;;62175:51;;62241:20;62264:13;:11;:13::i;:::-;62241:36;-1:-1:-1;62292:19:0;62530:1;62514:233;62545:12;62533:8;:24;62514:233;;62594:17;;;;:7;:17;;;;;;:27;;;;:17;;:27;62590:142;;62668:8;62646:6;62653:11;62646:19;;;;;;;;:::i;:::-;;;;;;;;;;:30;62699:13;;;;:::i;:::-;;;;62590:142;62559:10;;;;:::i;:::-;;;;62514:233;;;-1:-1:-1;62770:6:0;;61892:903;-1:-1:-1;;;;;61892:903:0:o;62045:743::-;61983:812;61892:903;;;:::o;78717:102::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;78782:11:::1;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;80169:480:::0;80218:10;26302:19;;:23;79942:100;;;;;;;14402:2:1;79942:100:0;;;14384:21:1;14441:2;14421:18;;;14414:30;14480:34;14460:18;;;14453:62;14551:21;14531:18;;;14524:49;14590:19;;79942:100:0;14200:415:1;79942:100:0;80255:8:::1;::::0;:30:::1;::::0;;;;80274:10:::1;80255:30;::::0;::::1;2377:74:1::0;80241:11:0::1;::::0;80255:8:::1;;::::0;:18:::1;::::0;2350::1;;80255:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80241:44;;80311:18;;80304:3;:25;;80296:60;;;::::0;::::1;::::0;;19069:2:1;80296:60:0::1;::::0;::::1;19051:21:1::0;19108:2;19088:18;;;19081:30;19147:24;19127:18;;;19120:52;19189:18;;80296:60:0::1;18867:346:1::0;80296:60:0::1;80393:8;::::0;:17:::1;::::0;80404:6:::1;80393:17;:::i;:::-;80375:15;:35;80367:69;;;::::0;::::1;::::0;;19420:2:1;80367:69:0::1;::::0;::::1;19402:21:1::0;19459:2;19439:18;;;19432:30;19498:23;19478:18;;;19471:51;19539:18;;80367:69:0::1;19218:345:1::0;80367:69:0::1;80466:10;80456:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;80455:22;80447:49;;;::::0;::::1;::::0;;19770:2:1;80447:49:0::1;::::0;::::1;19752:21:1::0;19809:2;19789:18;;;19782:30;19848:16;19828:18;;;19821:44;19882:18;;80447:49:0::1;19568:338:1::0;80447:49:0::1;80507:34;80521:1;80524::::0;80527::::1;80530:10;80507:13;:34::i;:::-;-1:-1:-1::0;80562:10:0::1;80552:21;::::0;;;:9:::1;:21;::::0;;;;:28;;;::::1;80576:4;80552:28;::::0;;80591:16:::1;:18:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;80620:19:0::1;:21:::0;;;:19:::1;:21;::::0;::::1;:::i;43497:104::-:0;43553:13;43586:7;43579:14;;;;;:::i;55337:89::-;55377:13;55410:8;55403:15;;;;;:::i;77406:1102::-;6287:4;6311:7;;;;;;6565:9;6557:38;;;;;;;16728:2:1;6557:38:0;;;16710:21:1;16767:2;16747:18;;;16740:30;16806:18;16786;;;16779:46;16842:18;;6557:38:0;16526:340:1;6557:38:0;77832:28:::1;77838:10;77850:9;77832:5;:28::i;:::-;77824:37;;;::::0;::::1;;78080:22;78092:9;78080:11;:22::i;:::-;78079:23;78071:32;;;::::0;::::1;;78131:11;::::0;78114:40:::1;::::0;78131:11:::1;;78144:9:::0;78114:8:::1;:40::i;:::-;78307:11;::::0;:193:::1;::::0;;;;::::1;::::0;::::1;12106:25:1::0;;;12147:18;;;12140:34;;;12190:18;;;12183:34;;;12233:18;;;12226:34;;;78451:10:0::1;12337:19:1::0;;;12330:44;78307:11:0::1;12411:15:1::0;;;12390:19;;;12383:44;78307:11:0;;::::1;::::0;:25:::1;::::0;12078:19:1;;78307:193:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;77406:1102:::0;;;;;:::o;45180:295::-;2744:10;45283:24;;;;45275:62;;;;;;;20732:2:1;45275:62:0;;;20714:21:1;20771:2;20751:18;;;20744:30;20810:27;20790:18;;;20783:55;20855:18;;45275:62:0;20530:349:1;45275:62:0;2744:10;45350:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;45419:48;;586:41:1;;;45350:42:0;;2744:10;45419:48;;559:18:1;45419:48:0;;;;;;;45180:295;;:::o;83273:1004::-;83365:17;83393:12;83416:21;83448:20;83479:24;83514:17;83542:23;83576:24;83611:18;83648:22;83673:7;83681:3;83673:12;;;;;;;;:::i;:::-;;;;;;;;83648:37;;83772:7;:24;;;;;;;;;;;;:29;;83800:1;83772:29;;83756:46;;83851:15;83824:7;:23;;;;;;;;;;;;:42;;;;83813:54;;83902:7;:21;;;;;;;;;;;;83894:30;;83878:46;;83958:7;:23;;;;;;;;;;;;83950:32;;83935:47;;84020:7;:24;;;;;;;;;;;;84012:33;;83993:52;;84076:7;:17;;;;;;;;;;;;84068:26;;84056:38;;84131:7;:23;;;;;;;;;;;;84123:32;;84105:50;;84193:7;:24;;;;;;;;;;;;84185:33;;84166:52;;84250:7;:18;;;;;;;;;;;;84242:27;;84229:40;;83637:640;83273:1004;;;;;;;;;;;:::o;46443:328::-;46618:41;2744:10;46651:7;46618:18;:41::i;:::-;46610:103;;;;;;;15961:2:1;46610:103:0;;;15943:21:1;16000:2;15980:18;;;15973:30;16039:34;16019:18;;;16012:62;16110:19;16090:18;;;16083:47;16147:19;;46610:103:0;15759:413:1;46610:103:0;46724:39;46738:4;46744:2;46748:7;46757:5;46724:13;:39::i;43672:334::-;48346:4;48370:16;;;:7;:16;;;;;;43745:13;;48370:30;:16;43771:76;;;;;;;21086:2:1;43771:76:0;;;21068:21:1;21125:2;21105:18;;;21098:30;21164:34;21144:18;;;21137:62;21235:17;21215:18;;;21208:45;21270:19;;43771:76:0;20884:411:1;43771:76:0;43860:21;43884:10;:8;:10::i;:::-;43860:34;;43936:1;43918:7;43912:21;:25;:86;;;;;;;;;;;;;;;;;43964:7;43973:18;:7;:16;:18::i;:::-;43947:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43905:93;43672:334;-1:-1:-1;;;43672:334:0:o;67361:269::-;67449:4;67491:1;67479:9;:13;67471:22;;;;;;67582:7;67590:9;67582:18;;;;;;;;:::i;:::-;;;;;;;;;;:35;;;;;;:40;;;;-1:-1:-1;;67361:269:0:o;81489:476::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;81614:6:::1;81597;:13;:23;81589:59;;;::::0;::::1;::::0;;22003:2:1;81589:59:0::1;::::0;::::1;21985:21:1::0;22042:2;22022:18;;;22015:30;22081:26;22061:18;;;22054:54;22125:18;;81589:59:0::1;21801:348:1::0;81589:59:0::1;81659:6;81676:282;81691:6;:13;81687:1;:17;81676:282;;;81727:19;81749:6;81756:1;81749:9;;;;;;;;:::i;:::-;;;;;;;81727:31;;81800:1;81777:25;;:11;:25;;::::0;81773:87:::1;;-1:-1:-1::0;3843:7:0;3870:6;;;81773:87:::1;81876:17;:19:::0;;;:17:::1;:19;::::0;::::1;:::i;:::-;;;;;;81910:36;81924:1;81927::::0;81930::::1;81934:11;81910:13;:36::i;:::-;;81710:248;81706:3;;;;;:::i;:::-;;;;81676:282;;80701:355:::0;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;80874:9:::1;:22:::0;;;;80918:15:::1;80907:8;:26:::0;80944:10:::1;:24:::0;;;;80979:14:::1;:32:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;81022:11:::1;:26:::0;;;;;::::1;::::0;::::1;;::::0;;80701:355::o;62801:111::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;62884:20:::1;:8;62895:9:::0;62884:20:::1;;:::i;4706:201::-:0;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;4795:22:::1;::::0;::::1;4787:73;;;::::0;::::1;::::0;;22356:2:1;4787:73:0::1;::::0;::::1;22338:21:1::0;22395:2;22375:18;;;22368:30;22434:34;22414:18;;;22407:62;22505:8;22485:18;;;22478:36;22531:19;;4787:73:0::1;22154:402:1::0;4787:73:0::1;4871:28;4890:8;4871:18;:28::i;:::-;4706:201:::0;:::o;59654:1543::-;59846:4;59913:16;59898:33;;59878:16;:53;59870:62;;;;;;59987:17;59972:34;;59951:17;:55;59943:64;;;;;;60056:11;60041:28;;60026:11;:43;60018:52;;;;;;60152:20;60182:15;60196:1;60182:11;:15;:::i;:::-;60152:46;;60229:2;60213:13;:18;;;60209:69;;;-1:-1:-1;60264:2:0;60209:69;60314:338;;;;;;;;;60354:15;60314:338;;;;60290:21;60314:338;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60663:7;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60718:14;;60314:338;;60776:28;;60761:43;;60753:52;;;;;;60931:23;;;;;60978:24;;;;;60856:158;;22822:42:1;22810:55;;22792:74;;22897:2;22882:18;;22875:34;;;60923:32:0;;;;22925:18:1;;;22918:34;60970:33:0;;22968:18:1;;;22961:34;60856:158:0;;;;;;;22779:3:1;60856:158:0;;;61132:26;61138:6;61146:11;61132:5;:26::i;:::-;61178:11;-1:-1:-1;;;59654:1543:0;;;;;;;:::o;52284:167::-;52359:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;52413:16;52359:24;52413:7;:16::i;:::-;52404:39;;;;;;;;;;;;52284:167;;:::o;82621:509::-;82677:7;82697:16;82716:11;;;;;;;;;;;:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82697:53;;82863:8;82847:26;;82835:8;:38;82827:47;;;;;;82885:17;82917:12;82928:1;82917:8;:12;:::i;:::-;82905:25;;:8;:25;:::i;:::-;82885:45;;78960:5;83005:9;:31;83001:95;;;-1:-1:-1;78960:5:0;83113:9;82621:509;-1:-1:-1;;82621:509:0:o;48575:341::-;48668:4;48370:16;;;:7;:16;;;;;;:30;:16;48685:73;;;;;;;23208:2:1;48685:73:0;;;23190:21:1;23247:2;23227:18;;;23220:30;23286:34;23266:18;;;23259:62;23357:14;23337:18;;;23330:42;23389:19;;48685:73:0;23006:408:1;48685:73:0;48769:13;48785:16;48793:7;48785;:16::i;:::-;48769:32;;48831:5;48820:16;;:7;:16;;;:51;;;;48864:7;48840:31;;:20;48852:7;48840:11;:20::i;:::-;:31;;;48820:51;:87;;;-1:-1:-1;45667:25:0;;;;45643:4;45667:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;48875:32;45546:164;58858:312;58991:34;59007:4;59013:2;59017:7;58991:15;:34::i;:::-;59123:39;;;;:30;:39;;;;;59116:46;;;;;;-1:-1:-1;;58858:312:0:o;66508:211::-;66586:4;66611:14;:31;;;:36;;66646:1;66611:36;;66610:101;;;;-1:-1:-1;;66653:30:0;;;:57;66694:15;66653:57;;;;;;;66508:211::o;76687:139::-;76762:4;76808:9;76787:30;;:17;76795:8;76787:7;:17::i;:::-;:30;;;;76687:139;-1:-1:-1;;;76687:139:0:o;63579:429::-;63650:4;63914:7;:24;;;:29;;63942:1;63914:29;63913:87;;;;-1:-1:-1;;63949:23:0;;;:50;63983:15;63949:50;;;;;;;63579:429::o;54994:100::-;55067:8;:19;55078:8;55067;:19;:::i;68055:1502::-;68293:4;68385:17;68365:16;:37;68361:82;;-1:-1:-1;68426:5:0;68419:12;;68361:82;68506:30;;;;;;;:51;;;:107;;-1:-1:-1;68561:31:0;;;;;;;:52;;68506:107;68502:152;;;-1:-1:-1;68637:5:0;68630:12;;68502:152;68668:31;;;;;;;:51;;;:107;;-1:-1:-1;68723:32:0;;;;;;;:52;;68668:107;68664:152;;;-1:-1:-1;68799:5:0;68792:12;;68664:152;68967:31;;;;;;;:36;;:75;;-1:-1:-1;69007:30:0;;;;;;;:35;68967:75;68963:119;;;-1:-1:-1;69066:4:0;69059:11;;68963:119;69193:30;;69158:31;;69193:30;;;;;;;;;69158:31;;;;;:65;;:135;;-1:-1:-1;69262:31:0;;69227;;;;;69262;69227;;;69262;;;;;69227:66;69158:135;69154:180;;;-1:-1:-1;69317:5:0;69310:12;;69154:180;69384:30;;69348:32;;;;;69384:30;69348:32;;;69384:30;;;;;69348:66;;:137;;-1:-1:-1;69454:31:0;;69418:32;;69454:31;;;;;;;;;69418:32;;;;;:67;69348:137;69344:182;;;-1:-1:-1;69509:5:0;69502:12;;69344:182;-1:-1:-1;69545:4:0;68055:1502;;;;;;:::o;64304:556::-;64416:4;64462:25;;;:7;:25;;;;;;;64528:26;;;;;;;64462:25;;;;;64528:26;64735:41;;;;:116;;-1:-1:-1;64780:49:0;;;;:30;:49;;;;;;:71;:49;;;:71;;;;64727:125;;;;64304:556;;;;:::o;5067:191::-;5141:16;5160:6;;;5177:17;;;;;;;;;;5210:40;;5160:6;;;;;;;5210:40;;5141:16;5210:40;5130:128;5067:191;:::o;71130:1003::-;71280:29;71312:7;71320:17;71312:26;;;;;;;;:::i;:::-;;;;;;;;71280:58;;71349:28;71380:7;71388:16;71380:25;;;;;;;;:::i;:::-;;;;;;;;;;71418:58;;;;;;;;;;;;71380:25;-1:-1:-1;71542:32:0;71559:14;71542:16;:32::i;:::-;71585:31;71602:13;71585:16;:31::i;:::-;71731:48;;;;:30;:48;;;;;;71724:55;;;;;;;;;71797:49;;;;;;71790:56;;;;;;;71942:20;:22;;;;;;:::i;:::-;;;;-1:-1:-1;;72031:25:0;;;;:7;:25;;;;;;;;;;72095:29;;72021:104;;72031:25;;;;26032:74:1;;26122:18;;;26115:34;;;26165:18;;;26158:34;;;72095:29:0;;;;;26223:2:1;26208:18;;26201:59;72021:104:0;;26019:3:1;26004:19;72021:104:0;;;;;;;71212:921;;71130:1003;;:::o;47653:315::-;47810:28;47820:4;47826:2;47830:7;47810:9;:28::i;:::-;47857:48;47880:4;47886:2;47890:7;47899:5;47857:22;:48::i;:::-;47849:111;;;;;;;26473:2:1;47849:111:0;;;26455:21:1;26512:2;26492:18;;;26485:30;26551:34;26531:18;;;26524:62;26622:20;26602:18;;;26595:48;26660:19;;47849:111:0;26271:414:1;365:723:0;421:13;642:5;651:1;642:10;638:53;;-1:-1:-1;;669:10:0;;;;;;;;;;;;;;;;;;365:723::o;638:53::-;716:5;701:12;757:78;764:9;;757:78;;790:8;;;;:::i;:::-;;-1:-1:-1;813:10:0;;-1:-1:-1;821:2:0;813:10;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;867:17:0;;845:39;;895:154;902:10;;895:154;;929:11;939:1;929:11;;:::i;:::-;;-1:-1:-1;998:10:0;1006:2;998:5;:10;:::i;:::-;985:24;;:2;:24;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1026:11:0;1035:2;1026:11;;:::i;:::-;;;895:154;;50252:424;50327:12;;50324:104;;50363:16;;;50355:61;;;;;;;27009:2:1;50355:61:0;;;26991:21:1;;;27028:18;;;27021:30;27087:34;27067:18;;;27060:62;27139:18;;50355:61:0;26807:356:1;50355:61:0;48346:4;48370:16;;;:7;:16;;;;;;:30;:16;:30;50438:58;;;;;;;27370:2:1;50438:58:0;;;27352:21:1;27409:2;27389:18;;;27382:30;27448;27428:18;;;27421:58;27496:18;;50438:58:0;27168:352:1;50438:58:0;50567:13;;;;;;;:9;:13;;;;;:18;;50584:1;;50567:13;:18;;50584:1;;50567:18;:::i;:::-;;;;-1:-1:-1;;50596:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;50635:33;;50596:16;;;50635:33;;50596:16;;50635:33;50252:424;;:::o;51595:571::-;51747:4;51727:24;;:16;51735:7;51727;:16::i;:::-;:24;;;51719:78;;;;;;;27727:2:1;51719:78:0;;;27709:21:1;27766:2;27746:18;;;27739:30;27805:34;27785:18;;;27778:62;27876:11;27856:18;;;27849:39;27905:19;;51719:78:0;27525:405:1;51719:78:0;51816:16;;;51808:65;;;;;;;28137:2:1;51808:65:0;;;28119:21:1;28176:2;28156:18;;;28149:30;28215:34;28195:18;;;28188:62;28286:6;28266:18;;;28259:34;28310:19;;51808:65:0;27935:400:1;51808:65:0;51990:29;52007:1;52011:7;51990:8;:29::i;:::-;52032:15;;;;;;;:9;:15;;;;;:20;;52051:1;;52032:15;:20;;52051:1;;52032:20;:::i;:::-;;;;-1:-1:-1;;52063:13:0;;;;;;;:9;:13;;;;;:18;;52080:1;;52063:13;:18;;52080:1;;52063:18;:::i;:::-;;;;-1:-1:-1;;52092:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;52131:27;;52092:16;;52131:27;;;;;;;51595:571;;;:::o;65129:419::-;65341:21;;65367:15;;65332:8;;65341:21;;;;;65332:31;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;65331:51;;;;;;:::i;:::-;65298:85;;;;;;;;;;;;;;;;;;65484:2;65460:21;;;;;;:26;65456:85;;;65503:26;;65528:1;;65503:26;;:21;;:26;;65528:1;;65503:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;65129:419;:::o;53016:803::-;53171:4;53192:13;;;26302:19;:23;53188:624;;53228:72;;;;;:36;;;;;;:72;;2744:10;;53279:4;;53285:7;;53294:5;;53228:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53228:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53224:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53474:6;:13;53491:1;53474:18;53470:272;;53517:60;;;;;26473:2:1;53517:60:0;;;26455:21:1;26512:2;26492:18;;;26485:30;26551:34;26531:18;;;26524:62;26622:20;26602:18;;;26595:48;26660:19;;53517:60:0;26271:414:1;53470:272:0;53692:6;53686:13;53677:6;53673:2;53669:15;53662:38;53224:533;53351:55;;53361:45;53351:55;;-1:-1:-1;53344:62:0;;53188:624;-1:-1:-1;53796:4:0;53789:11;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;820:250::-;905:1;915:113;929:6;926:1;923:13;915:113;;;1005:11;;;999:18;986:11;;;979:39;951:2;944:10;915:113;;;-1:-1:-1;;1062:1:1;1044:16;;1037:27;820:250::o;1075:330::-;1117:3;1155:5;1149:12;1182:6;1177:3;1170:19;1198:76;1267:6;1260:4;1255:3;1251:14;1244:4;1237:5;1233:16;1198:76;:::i;:::-;1319:2;1307:15;1324:66;1303:88;1294:98;;;;1394:4;1290:109;;1075:330;-1:-1:-1;;1075:330:1:o;1410:220::-;1559:2;1548:9;1541:21;1522:4;1579:45;1620:2;1609:9;1605:18;1597:6;1579:45;:::i;1635:154::-;1721:42;1714:5;1710:54;1703:5;1700:65;1690:93;;1779:1;1776;1769:12;1794:247;1853:6;1906:2;1894:9;1885:7;1881:23;1877:32;1874:52;;;1922:1;1919;1912:12;1874:52;1961:9;1948:23;1980:31;2005:5;1980:31;:::i;2046:180::-;2105:6;2158:2;2146:9;2137:7;2133:23;2129:32;2126:52;;;2174:1;2171;2164:12;2126:52;-1:-1:-1;2197:23:1;;2046:180;-1:-1:-1;2046:180:1:o;2462:315::-;2530:6;2538;2591:2;2579:9;2570:7;2566:23;2562:32;2559:52;;;2607:1;2604;2597:12;2559:52;2646:9;2633:23;2665:31;2690:5;2665:31;:::i;:::-;2715:5;2767:2;2752:18;;;;2739:32;;-1:-1:-1;;;2462:315:1:o;2782:456::-;2859:6;2867;2875;2928:2;2916:9;2907:7;2903:23;2899:32;2896:52;;;2944:1;2941;2934:12;2896:52;2983:9;2970:23;3002:31;3027:5;3002:31;:::i;:::-;3052:5;-1:-1:-1;3109:2:1;3094:18;;3081:32;3122:33;3081:32;3122:33;:::i;:::-;2782:456;;3174:7;;-1:-1:-1;;;3228:2:1;3213:18;;;;3200:32;;2782:456::o;3440:592::-;3511:6;3519;3572:2;3560:9;3551:7;3547:23;3543:32;3540:52;;;3588:1;3585;3578:12;3540:52;3628:9;3615:23;3657:18;3698:2;3690:6;3687:14;3684:34;;;3714:1;3711;3704:12;3684:34;3752:6;3741:9;3737:22;3727:32;;3797:7;3790:4;3786:2;3782:13;3778:27;3768:55;;3819:1;3816;3809:12;3768:55;3859:2;3846:16;3885:2;3877:6;3874:14;3871:34;;;3901:1;3898;3891:12;3871:34;3946:7;3941:2;3932:6;3928:2;3924:15;3920:24;3917:37;3914:57;;;3967:1;3964;3957:12;3914:57;3998:2;3990:11;;;;;4020:6;;-1:-1:-1;3440:592:1;;-1:-1:-1;;;;3440:592:1:o;4037:248::-;4105:6;4113;4166:2;4154:9;4145:7;4141:23;4137:32;4134:52;;;4182:1;4179;4172:12;4134:52;-1:-1:-1;;4205:23:1;;;4275:2;4260:18;;;4247:32;;-1:-1:-1;4037:248:1:o;4290:632::-;4461:2;4513:21;;;4583:13;;4486:18;;;4605:22;;;4432:4;;4461:2;4684:15;;;;4658:2;4643:18;;;4432:4;4727:169;4741:6;4738:1;4735:13;4727:169;;;4802:13;;4790:26;;4871:15;;;;4836:12;;;;4763:1;4756:9;4727:169;;;-1:-1:-1;4913:3:1;;4290:632;-1:-1:-1;;;;;;4290:632:1:o;4927:521::-;5022:6;5030;5038;5046;5054;5107:3;5095:9;5086:7;5082:23;5078:33;5075:53;;;5124:1;5121;5114:12;5075:53;5160:9;5147:23;5137:33;;5217:2;5206:9;5202:18;5189:32;5179:42;;5268:2;5257:9;5253:18;5240:32;5230:42;;5319:2;5308:9;5304:18;5291:32;5281:42;;5373:3;5362:9;5358:19;5345:33;5387:31;5412:5;5387:31;:::i;:::-;5437:5;5427:15;;;4927:521;;;;;;;;:::o;5453:118::-;5539:5;5532:13;5525:21;5518:5;5515:32;5505:60;;5561:1;5558;5551:12;5576:382;5641:6;5649;5702:2;5690:9;5681:7;5677:23;5673:32;5670:52;;;5718:1;5715;5708:12;5670:52;5757:9;5744:23;5776:31;5801:5;5776:31;:::i;:::-;5826:5;-1:-1:-1;5883:2:1;5868:18;;5855:32;5896:30;5855:32;5896:30;:::i;:::-;5945:7;5935:17;;;5576:382;;;;;:::o;6739:184::-;6791:77;6788:1;6781:88;6888:4;6885:1;6878:15;6912:4;6909:1;6902:15;6928:334;6999:2;6993:9;7055:2;7045:13;;7060:66;7041:86;7029:99;;7158:18;7143:34;;7179:22;;;7140:62;7137:88;;;7205:18;;:::i;:::-;7241:2;7234:22;6928:334;;-1:-1:-1;6928:334:1:o;7267:1167::-;7362:6;7370;7378;7386;7439:3;7427:9;7418:7;7414:23;7410:33;7407:53;;;7456:1;7453;7446:12;7407:53;7495:9;7482:23;7514:31;7539:5;7514:31;:::i;:::-;7564:5;-1:-1:-1;7588:2:1;7627:18;;;7614:32;7655:33;7614:32;7655:33;:::i;:::-;7707:7;-1:-1:-1;7761:2:1;7746:18;;7733:32;;-1:-1:-1;7816:2:1;7801:18;;7788:32;7839:18;7869:14;;;7866:34;;;7896:1;7893;7886:12;7866:34;7934:6;7923:9;7919:22;7909:32;;7979:7;7972:4;7968:2;7964:13;7960:27;7950:55;;8001:1;7998;7991:12;7950:55;8037:2;8024:16;8059:2;8055;8052:10;8049:36;;;8065:18;;:::i;:::-;8107:112;8215:2;8146:66;8139:4;8135:2;8131:13;8127:86;8123:95;8107:112;:::i;:::-;8094:125;;8242:2;8235:5;8228:17;8282:7;8277:2;8272;8268;8264:11;8260:20;8257:33;8254:53;;;8303:1;8300;8293:12;8254:53;8358:2;8353;8349;8345:11;8340:2;8333:5;8329:14;8316:45;8402:1;8397:2;8392;8385:5;8381:14;8377:23;8370:34;;8423:5;8413:15;;;;;7267:1167;;;;;;;:::o;8439:1091::-;8532:6;8540;8593:2;8581:9;8572:7;8568:23;8564:32;8561:52;;;8609:1;8606;8599:12;8561:52;8649:9;8636:23;8678:18;8719:2;8711:6;8708:14;8705:34;;;8735:1;8732;8725:12;8705:34;8773:6;8762:9;8758:22;8748:32;;8818:7;8811:4;8807:2;8803:13;8799:27;8789:55;;8840:1;8837;8830:12;8789:55;8876:2;8863:16;8898:4;8921:2;8917;8914:10;8911:36;;;8927:18;;:::i;:::-;8973:2;8970:1;8966:10;8956:20;;8996:28;9020:2;9016;9012:11;8996:28;:::i;:::-;9058:15;;;9128:11;;;9124:20;;;9089:12;;;;9156:19;;;9153:39;;;9188:1;9185;9178:12;9153:39;9212:11;;;;9232:217;9248:6;9243:3;9240:15;9232:217;;;9328:3;9315:17;9302:30;;9345:31;9370:5;9345:31;:::i;:::-;9389:18;;;9265:12;;;;9427;;;;9232:217;;;9468:5;9505:18;;;;9492:32;;-1:-1:-1;;;;;;;8439:1091:1:o;9535:541::-;9637:6;9645;9653;9661;9714:3;9702:9;9693:7;9689:23;9685:33;9682:53;;;9731:1;9728;9721:12;9682:53;9767:9;9754:23;9744:33;;9824:2;9813:9;9809:18;9796:32;9786:42;;9878:2;9867:9;9863:18;9850:32;9891:31;9916:5;9891:31;:::i;:::-;9941:5;-1:-1:-1;9998:2:1;9983:18;;9970:32;10011:33;9970:32;10011:33;:::i;:::-;9535:541;;;;-1:-1:-1;9535:541:1;;-1:-1:-1;;9535:541:1:o;10081:273::-;10165:6;10196:3;10240:2;10228:9;10219:7;10215:23;10211:32;10208:52;;;10256:1;10253;10246:12;10208:52;10295:7;10290:2;10279:9;10275:18;10272:31;10269:51;;;10316:1;10313;10306:12;10269:51;-1:-1:-1;10339:9:1;;10081:273;-1:-1:-1;;10081:273:1:o;10615:388::-;10683:6;10691;10744:2;10732:9;10723:7;10719:23;10715:32;10712:52;;;10760:1;10757;10750:12;10712:52;10799:9;10786:23;10818:31;10843:5;10818:31;:::i;:::-;10868:5;-1:-1:-1;10925:2:1;10910:18;;10897:32;10938:33;10897:32;10938:33;:::i;11008:437::-;11087:1;11083:12;;;;11130;;;11151:61;;11205:4;11197:6;11193:17;11183:27;;11151:61;11258:2;11250:6;11247:14;11227:18;11224:38;11221:218;;11295:77;11292:1;11285:88;11396:4;11393:1;11386:15;11424:4;11421:1;11414:15;12438:184;12490:77;12487:1;12480:88;12587:4;12584:1;12577:15;12611:4;12608:1;12601:15;12627:195;12666:3;12697:66;12690:5;12687:77;12684:103;;12767:18;;:::i;:::-;-1:-1:-1;12814:1:1;12803:13;;12627:195::o;14067:128::-;14134:9;;;14155:11;;;14152:37;;;14169:18;;:::i;14620:125::-;14685:9;;;14706:10;;;14703:36;;;14719:18;;:::i;15445:184::-;15497:77;15494:1;15487:88;15594:4;15591:1;15584:15;15618:4;15615:1;15608:15;15634:120;15674:1;15700;15690:35;;15705:18;;:::i;:::-;-1:-1:-1;15739:9:1;;15634:120::o;16871:184::-;16923:77;16920:1;16913:88;17020:4;17017:1;17010:15;17044:4;17041:1;17034:15;17060:168;17127:6;17153:10;;;17165;;;17149:27;;17188:11;;;17185:37;;;17202:18;;:::i;:::-;17185:37;17060:168;;;;:::o;17233:196::-;17272:3;17300:5;17290:39;;17309:18;;:::i;:::-;-1:-1:-1;17356:66:1;17345:78;;17233:196::o;17434:168::-;17507:9;;;17538;;17555:15;;;17549:22;;17535:37;17525:71;;17576:18;;:::i;18017:245::-;18084:6;18137:2;18125:9;18116:7;18112:23;18108:32;18105:52;;;18153:1;18150;18143:12;18105:52;18185:9;18179:16;18204:28;18226:5;18204:28;:::i;18678:184::-;18748:6;18801:2;18789:9;18780:7;18776:23;18772:32;18769:52;;;18817:1;18814;18807:12;18769:52;-1:-1:-1;18840:16:1;;18678:184;-1:-1:-1;18678:184:1:o;21300:496::-;21479:3;21517:6;21511:13;21533:66;21592:6;21587:3;21580:4;21572:6;21568:17;21533:66;:::i;:::-;21662:13;;21621:16;;;;21684:70;21662:13;21621:16;21731:4;21719:17;;21684:70;:::i;:::-;21770:20;;21300:496;-1:-1:-1;;;;21300:496:1:o;23545:545::-;23647:2;23642:3;23639:11;23636:448;;;23683:1;23708:5;23704:2;23697:17;23753:4;23749:2;23739:19;23823:2;23811:10;23807:19;23804:1;23800:27;23794:4;23790:38;23859:4;23847:10;23844:20;23841:47;;;-1:-1:-1;23882:4:1;23841:47;23937:2;23932:3;23928:12;23925:1;23921:20;23915:4;23911:31;23901:41;;23992:82;24010:2;24003:5;24000:13;23992:82;;;24055:17;;;24036:1;24025:13;23992:82;;;23996:3;;;23545:545;;;:::o;24326:1471::-;24452:3;24446:10;24479:18;24471:6;24468:30;24465:56;;;24501:18;;:::i;:::-;24530:97;24620:6;24580:38;24612:4;24606:11;24580:38;:::i;:::-;24574:4;24530:97;:::i;:::-;24682:4;;24746:2;24735:14;;24763:1;24758:782;;;;25584:1;25601:6;25598:89;;;-1:-1:-1;25653:19:1;;;25647:26;25598:89;24232:66;24223:1;24219:11;;;24215:84;24211:89;24201:100;24307:1;24303:11;;;24198:117;25700:81;;24728:1063;;24758:782;23492:1;23485:14;;;23529:4;23516:18;;24806:66;24794:79;;;24971:236;24985:7;24982:1;24979:14;24971:236;;;25074:19;;;25068:26;25053:42;;25166:27;;;;25134:1;25122:14;;;;25001:19;;24971:236;;;24975:3;25235:6;25226:7;25223:19;25220:261;;;25296:19;;;25290:26;25397:66;25379:1;25375:14;;;25391:3;25371:24;25367:97;25363:102;25348:118;25333:134;;25220:261;-1:-1:-1;;;;;25527:1:1;25511:14;;;25507:22;25494:36;;-1:-1:-1;24326:1471:1:o;26690:112::-;26722:1;26748;26738:35;;26753:18;;:::i;:::-;-1:-1:-1;26787:9:1;;26690:112::o;28340:512::-;28534:4;28563:42;28644:2;28636:6;28632:15;28621:9;28614:34;28696:2;28688:6;28684:15;28679:2;28668:9;28664:18;28657:43;;28736:6;28731:2;28720:9;28716:18;28709:34;28779:3;28774:2;28763:9;28759:18;28752:31;28800:46;28841:3;28830:9;28826:19;28818:6;28800:46;:::i;:::-;28792:54;28340:512;-1:-1:-1;;;;;;28340:512:1:o;28857:249::-;28926:6;28979:2;28967:9;28958:7;28954:23;28950:32;28947:52;;;28995:1;28992;28985:12;28947:52;29027:9;29021:16;29046:30;29070:5;29046:30;:::i

Swarm Source

ipfs://a5d5cff765a94c33f2ce903d96e4ccfe4736b5e21494f45cecede46c76080127

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.