Token Rugmies

Overview ERC721

Total Supply:
323 RUG

Holders:
140 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Rugmies

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, GNU GPLv3 license
File 1 of 15 : Rugmies.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

import "Strings.sol";
import "Context.sol";
import "Ownable.sol";
import "Address.sol";
import "IERC721Receiver.sol";
import "IERC721.sol";
import "IERC721Enumerable.sol";
import "IERC721Metadata.sol";
import "ERC721.sol";
import "ERC721Enumerable.sol";
import "ERC2981PerTokenRoyalties.sol";



contract Rugmies is ERC721Enumerable, Ownable, ERC2981PerTokenRoyalties {
    using Strings for uint256;

    event WinnerPicked( uint256 _tokenId, address _owner, uint256 _it);

    struct Winner {
        uint256 drawNumber;
        address winner;
        uint256 tokenId;
    }
    

    string public baseURI;
    string public baseExtension = ".json";
    uint256 public cost = 1 ether;
    uint256 public maxSupply = 7777;
    uint256 public drawNumber = 0;
    uint256 private contractRoyalties = 2000; //20%

    string public pollName;


    bool public paused = true;
    bool public airDropActive = false;
    bool public pollState = false;

    address[] private airDropAddresses;
    string[] public pollOptions;

    mapping(string => bool) pollOptionsMap;
    mapping(string => uint256) public votes;
    mapping(address => string) private votedAddresses;
    mapping(string => bool) private defaultpollOptions;
    mapping(address => uint256) private addressMints;
    mapping(address => uint256) private addressMintedBalance;
    mapping(uint256 => Winner[]) private winnerLog;
    mapping(uint256 => uint256) private _winners;


    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI
    ) ERC721(_name, _symbol) {
        setBaseURI(_initBaseURI);
    }

    // internal
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable, ERC2981PerTokenRoyalties) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    receive() external payable {
    }

    /*
    @function mint(_mintAmount)
    @description - Mints _mintAmount of Rugmies for sender.

    @param <uint256> _mintAmount - The number of Rugmies to mint.
    */
    function mint(uint256 _mintAmount) public payable {
        require(!paused, "Minting is paused!");
        require(_mintAmount > 0, "You must mint at least 1 Rugmie!");

        uint256 supply = totalSupply();
        require(supply + _mintAmount <= maxSupply, "All Rugmies have been minted (lol)");
        require(msg.value >= cost * _mintAmount, "ERROR: Please send more AVAX");


        for (uint256 i = 1; i <= _mintAmount; i++) {
            uint256 tokenId = supply + 1;
            _safeMint(msg.sender, tokenId);
            _setTokenRoyalty(tokenId, owner(), contractRoyalties);

            addressMints[msg.sender]++;
            supply = totalSupply();
        }
    }

    /*
    @function isWhitelisted(_user)
    @description - Returns a True/False if owner address is whitelisted
    */

    function isWhitelisted(address _user) public view returns (bool) {
        return true;
    }

    /*
    @function walletOfOwner(_owner)
    @description - Returns tokenIds per wallet address of owner
    */
    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    /*
    @function tokenURI(tokenId)
    @description - Gets the tokenId's URI
    */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
            : "";
    }
  
    /*
    @function setCost(newCost)
    @description - Sets the cost per NFT
    */
    function setCost(uint256 newCost) public onlyOwner {
        cost = newCost;
    }

    /*
    @function setBaseURI(newBaseURI)
    @description - Sets base URI (string)
    */
    function setBaseURI(string memory newBaseURI) public onlyOwner {
        baseURI = newBaseURI;
    }

    /*
    @function setBaseExtension(newBaseExtension)
    @description - Sets base extension (string)
    */
    function setBaseExtension(string memory newBaseExtension) public onlyOwner {
        baseExtension = newBaseExtension;
    }

    /*
    @function pause(state)
    @description - Pauses the contract (True/False)
    */
    function pause(bool state) public onlyOwner {
        paused = state;
    }

    /*
    @function rug(noOfRuggers, seed, devShare)
    @param <uint> noOfRuggers - The number of winners
    @param <uint> seed - random seed
    @param <uint devShare - share of profits to send to owner
    @returns <address> - The winner
    */
    function rug(uint256 noOfRuggers, uint seed, uint devShare) public onlyOwner {
        require(paused, "ERROR: Minting must be paused to rug");
        require(devShare <= 20, "Error: Don't take more than 20% you ass");
        require(devShare >= 0, "Error: c'mon man");
        require(noOfRuggers > 0, "Error: Must have at least one rugger");

        uint256 contractBalance = address(this).balance;
        uint256 rugShare = 100 - devShare;
        uint256 rugPayment = contractBalance / 100 * rugShare / noOfRuggers;

        (bool successWithdraw, ) = payable(owner()).call{value: address(this).balance / 100 * devShare}("");
        require(successWithdraw);

        address[] memory winners = selectWinners(noOfRuggers, seed);
        require(noOfRuggers == winners.length, "Error: winner count not picked properly");
        
        for (uint256 i = 0; i < noOfRuggers; i++) {
            (bool successPayment, ) = payable(winners[i]).call{value: rugPayment}("");
            require(successPayment);
        }
    }

  
    /*
    @function selectWinners(noOfWinners)
    @description - Selects giveaway winners.
    @param <uint> noOfWinners - The number of winners
    @param <uint> seed - random seed
    @returns <address> - The winner
    */
    function selectWinners(uint256 noOfWinners, uint seed) internal returns (address[] memory) {
        require(paused, "ERROR: Minting must be paused to rug");
        require(address(this).balance > 0, "ERROR: We're too poor"); 
        require(noOfWinners <= 50, "ERROR: Too many winners selected");

        address[] memory winners = new address[](noOfWinners);

        address winningAddr = msg.sender;
        for (uint256 i = 0; i < noOfWinners; i++) {
            winningAddr = selectAWinner(
                0,
                winningAddr,
                seed + i
            );
            winners[i] = winningAddr;
        }

        drawNumber++;
        return winners;
    }

    /*
    @function selectAWinner()
    @param <uint> no - The number of winners
    @returns <address> - The winner
    */
    function selectAWinner(
        uint256 it,
        address randomAddr,
        uint256 randomNo
    ) internal returns (address) {

        uint256 winningToken = rand(randomAddr, randomNo);
        address winnerAddress = ERC721.ownerOf(winningToken);
        uint256 lastWon = _winners[winningToken];

        bool alreadyWon = (lastWon == block.timestamp);

        Winner memory win;

        if ((it < 5) && alreadyWon) {
            uint256 newIt = it + 1;
            return
                selectAWinner(
                    newIt,
                    winnerAddress,
                    winningToken + newIt
                );
        } else if ((it >= 5) && alreadyWon) {
            emit WinnerPicked(winningToken, winnerAddress,it);
            return winnerAddress;
        } else {
            win.winner = winnerAddress;
            win.tokenId = winningToken;
            win.drawNumber = drawNumber;
            winnerLog[drawNumber].push(win);

            _winners[winningToken] = block.timestamp;
        }
        emit WinnerPicked(winningToken, winnerAddress,it);
        return winnerAddress;
    }

    function rand(address randomAddress, uint256 randomNo)
        internal
        view
        returns (uint256)
    {
        uint256 seed = uint256(
            keccak256(
                abi.encodePacked(
                    (block.timestamp - randomNo) +
                        block.difficulty +
                        ((
                            uint256(keccak256(abi.encodePacked(block.coinbase)))
                        ) / (block.timestamp)) +
                        block.gaslimit +
                        ((uint256(keccak256(abi.encodePacked(randomAddress)))) /
                            (block.timestamp)) +
                        block.number
                )
            )
        );

        uint256 supply = totalSupply();
        return (seed - ((seed / supply) * supply)) + 1;
    }

    /*
    @function pickRandomRug(seed)
    @description - Picks a random rug token for giveaways
    @param <uint> seed - seed to help with randomness
    */
    function pickRandomRug( uint seed ) public onlyOwner returns(uint256) {
        uint256 winningToken = rand(msg.sender, seed);
        address winnerAddress = ERC721.ownerOf(winningToken);

        emit WinnerPicked(winningToken, winnerAddress, 0);
        return winningToken;
    }

    /*
    @function setAirDropStatus(value)
    @description - Sets the status of airdrop to true/false
    @param <bool> value - true/false
    */
    function setAirDropStatus(bool value) public onlyOwner {
        airDropActive = value;
    }


    /*
      @function airDrop(to)
      @description - Air drop an nft to address
      @param <address> to - The address to airdrop nft
    */
    function airDrop(address to) public onlyOwner {
        uint256 supply = totalSupply();
        require(airDropActive, "ERROR: Air drop is not active");
        require(supply < maxSupply, "Max supply exceeded");
        airDropAddresses.push(to);

        uint256 tokenId = supply + 1;

        _safeMint(to, tokenId);
        addressMintedBalance[to]++;

    }

   /*
      @function getWinnersForDraw(drawNo)
      @description - Gets all the winners for a given draw
    */
    function getWinnersForDraw(uint256 drawNo) public view returns (Winner[] memory) {
        return winnerLog[drawNo];
    }

    /*
    @function clearWinnersForDraw(drawNo)
    @description - clears out all the winner logs for that draw. This is for when the array gets large!
    */
    function clearWinnersForDraw(uint256 drawNo) public onlyOwner {
        for (uint256 i = 0; i < 50; i++) {
            delete winnerLog[drawNo][i];
        }
    }

    /*
    @function castVote(value)
    @description - Casts a vote if you own a bear
    @param <string> memory - The option chosen
    */
    function castVote(string memory option) public {
        require(pollState, "ERROR: No poll to vote on right now");
        require(pollOptionsMap[option], "ERROR: Invalid voting option");
        require(
            keccak256(abi.encodePacked(votedAddresses[msg.sender])) !=
                keccak256(abi.encodePacked(pollName)),
            "ERROR: You have already voted in this poll!"
        );

        uint256 noVotes = balanceOf(msg.sender);

        require(
            noVotes > 0,
            "ERROR: You have no voting rights. Go rug yourself!"
        );
        votes[option] += noVotes;
        votedAddresses[msg.sender] = pollName;
    }

    /*
    @function addPollOption(option)
    @description - Adds an option for voting
    @param <string> memory - The option to add
    */
    function addPollOption(string memory option) public onlyOwner {
        pollOptionsMap[option] = true;
        pollOptions.push(option);
    }

    /*
    @function clearPollOptions()
    @description - Clears the current poll
    */
    function clearPollOptions() public onlyOwner {
        for (uint256 i = 0; i < pollOptions.length; i++) {
            votes[pollOptions[i]] = 0;
            pollOptionsMap[pollOptions[i]] = false;
            delete pollOptions[i];
        }
    }

    /*
    @function setPollName(name)
    @description - Sets the poll name/quesstion
    @param <string> memory - The name/question of the poll
    */
    function setPollName(string memory name) public onlyOwner {
        pollName = name;
    }

    /*
    @function getVoteCountForOption(option)
    @description - Gets the number of votes for a poll option
    @param <string> memory - The option to get the poll counts for
    */
    function getVoteCountForOption(string memory option) public view returns (uint256) {
        return votes[option];
    }

    /*
    @function togglePollVoting(state)
    @description - Turns the poll on/off
    @param <string> memory - The value true/false
    */
    function setPollState(bool state) public onlyOwner {
        pollState = state;
    }

    /*
    @function getPollOptions(state)
    @description - returns the array of poll options
    */
    function getPollOptions() public view returns (string[] memory) {
        return pollOptions;
    }

    /*
    @function clearPoll()
    @description - clears poll, options and votes
    */
    function clearPoll() public onlyOwner {
        clearPollOptions();
        pollState = false;
        pollName = "";
    }

}

File 2 of 15 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @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);
    }
}

File 3 of 15 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 4 of 15 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "Context.sol";

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

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

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

    /**
     * @dev 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);
    }
}

File 5 of 15 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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);
            }
        }
    }
}

File 6 of 15 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 7 of 15 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "IERC165.sol";

/**
 * @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`, 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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 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);

    /**
     * @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;
}

File 8 of 15 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 9 of 15 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 10 of 15 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "IERC721.sol";

/**
 * @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);
}

File 11 of 15 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "IERC721.sol";
import "IERC721Receiver.sol";
import "IERC721Metadata.sol";
import "Address.sol";
import "Context.sol";
import "Strings.sol";
import "ERC165.sol";

/**
 * @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 ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    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) private _owners;

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

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

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

    /**
     * @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 "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.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 {
        _setApprovalForAll(_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 = ERC721.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 {
        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 = ERC721.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(ERC721.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(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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.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 {}
}

File 12 of 15 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "IERC165.sol";

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

File 13 of 15 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "ERC721.sol";
import "IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 14 of 15 : ERC2981PerTokenRoyalties.sol
pragma solidity ^0.8.0;

import "IERC165.sol";
import "ERC165.sol";
import "IERC2981Royalties.sol";

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981PerTokenRoyalties is ERC165, IERC2981Royalties {
    struct Royalty {
        address recipient;
        uint256 value;
    }

    mapping(uint256 => Royalty) internal _royalties;

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /// @dev Sets token royalties
    /// @param id the token id fir which we register the royalties
    /// @param recipient recipient of the royalties
    /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function _setTokenRoyalty(
        uint256 id,
        address recipient,
        uint256 value
    ) internal {
        require(value <= 10000, "ERC2981Royalties: Too high");

        _royalties[id] = Royalty(recipient, value);
    }

    /// @inheritdoc	IERC2981Royalties
    function royaltyInfo(uint256 tokenId, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        Royalty memory royalty = _royalties[tokenId];
        return (royalty.recipient, (value * royalty.value) / 10000);
    }
}

File 15 of 15 : IERC2981Royalties.sol
pragma solidity ^0.8.0;

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _value - the sale price of the NFT asset specified by _tokenId
    /// @return _receiver - address of who should be sent the royalty payment
    /// @return _royaltyAmount - the royalty payment amount for value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}

Settings
{
  "evmVersion": "istanbul",
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "libraries": {
    "Rugmies.sol": {}
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_it","type":"uint256"}],"name":"WinnerPicked","type":"event"},{"inputs":[{"internalType":"string","name":"option","type":"string"}],"name":"addPollOption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airDropActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"option","type":"string"}],"name":"castVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearPoll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearPollOptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"drawNo","type":"uint256"}],"name":"clearWinnersForDraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"drawNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPollOptions","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"option","type":"string"}],"name":"getVoteCountForOption","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"drawNo","type":"uint256"}],"name":"getWinnersForDraw","outputs":[{"components":[{"internalType":"uint256","name":"drawNumber","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct Rugmies.Winner[]","name":"","type":"tuple[]"}],"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":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","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":[{"internalType":"bool","name":"state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"pickRandomRug","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pollName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pollOptions","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pollState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"noOfRuggers","type":"uint256"},{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"devShare","type":"uint256"}],"name":"rug","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":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setAirDropStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"setPollName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setPollState","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":[{"internalType":"string","name":"","type":"string"}],"name":"votes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526005608081905264173539b7b760d91b60a09081526200002891600d9190620001b3565b50670de0b6b3a7640000600e55611e61600f5560006010556107d06011556013805462ffffff191660011790553480156200006257600080fd5b5060405162003edc38038062003edc833981016040819052620000859162000326565b8251839083906200009e906000906020850190620001b3565b508051620000b4906001906020840190620001b3565b505050620000d1620000cb620000e560201b60201c565b620000e9565b620000dc816200013b565b505050620003f4565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b031633146200019a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620001af90600c906020840190620001b3565b5050565b828054620001c190620003b7565b90600052602060002090601f016020900481019282620001e5576000855562000230565b82601f106200020057805160ff191683800117855562000230565b8280016001018555821562000230579182015b828111156200023057825182559160200191906001019062000213565b506200023e92915062000242565b5090565b5b808211156200023e576000815560010162000243565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200028157600080fd5b81516001600160401b03808211156200029e576200029e62000259565b604051601f8301601f19908116603f01168101908282118183101715620002c957620002c962000259565b81604052838152602092508683858801011115620002e657600080fd5b600091505b838210156200030a5785820183015181830184015290820190620002eb565b838211156200031c5760008385830101525b9695505050505050565b6000806000606084860312156200033c57600080fd5b83516001600160401b03808211156200035457600080fd5b62000362878388016200026f565b945060208601519150808211156200037957600080fd5b62000387878388016200026f565b935060408601519150808211156200039e57600080fd5b50620003ad868287016200026f565b9150509250925092565b600181811c90821680620003cc57607f821691505b60208210811415620003ee57634e487b7160e01b600052602260045260246000fd5b50919050565b613ad880620004046000396000f3fe6080604052600436106103035760003560e01c80636352211e11610190578063b99ef1fa116100dc578063d80ffb2011610095578063e985e9c51161006f578063e985e9c514610916578063f2fde38b1461095f578063fa2777261461097f578063ffe2de821461099f57600080fd5b8063d80ffb20146108be578063da3ef23f146108d4578063e654c335146108f457600080fd5b8063b99ef1fa14610806578063bf5cf54a1461083e578063c668286214610853578063c87b56dd14610868578063cd18d5a414610888578063d5abeb01146108a857600080fd5b80638f58d353116101495780639cc2d993116101235780639cc2d99314610793578063a0712d68146107b3578063a22cb465146107c6578063b88d4fde146107e657600080fd5b80638f58d3531461074957806394fcac1b1461076957806395d89b411461077e57600080fd5b80636352211e146106a157806364d3f69c146106c15780636c0360eb146106e157806370a08231146106f6578063715018a6146107165780638da5cb5b1461072b57600080fd5b80632f745c591161024f578063438b63001161020857806355f804b3116101e257806355f804b3146106275780635994b5e1146106475780635b234462146106675780635c975abb1461068757600080fd5b8063438b6300146105ba57806344a0d68a146105e75780634f6ccce71461060757600080fd5b80632f745c59146104fa5780633233d5371461051a57806332e204eb1461053a578063342fdb521461055a5780633af32abf1461057957806342842e0e1461059a57600080fd5b806313faede6116102bc5780631959ac07116102965780631959ac071461045b57806323b872dd1461047b5780632a55205a1461049b5780632a9b746c146104da57600080fd5b806313faede61461040d57806318160ddd14610431578063187697651461044657600080fd5b806301ffc9a71461030f57806302329a291461034457806306fdde0314610366578063081812fc14610388578063095ea7b3146103c057806311560b32146103e057600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5061032f61032a3660046132a1565b6109bf565b60405190151581526020015b60405180910390f35b34801561035057600080fd5b5061036461035f3660046132ce565b6109d0565b005b34801561037257600080fd5b5061037b610a16565b60405161033b9190613341565b34801561039457600080fd5b506103a86103a3366004613354565b610aa8565b6040516001600160a01b03909116815260200161033b565b3480156103cc57600080fd5b506103646103db366004613384565b610b3d565b3480156103ec57600080fd5b506104006103fb366004613354565b610c53565b60405161033b91906133ae565b34801561041957600080fd5b50610423600e5481565b60405190815260200161033b565b34801561043d57600080fd5b50600854610423565b34801561045257600080fd5b5061037b610ce8565b34801561046757600080fd5b50610364610476366004613354565b610d76565b34801561048757600080fd5b50610364610496366004613410565b610e0a565b3480156104a757600080fd5b506104bb6104b636600461344c565b610e3b565b604080516001600160a01b03909316835260208301919091520161033b565b3480156104e657600080fd5b506103646104f53660046134fa565b610e94565b34801561050657600080fd5b50610423610515366004613384565b610f33565b34801561052657600080fd5b506104236105353660046134fa565b610fc9565b34801561054657600080fd5b506103646105553660046132ce565b610ff1565b34801561056657600080fd5b5060135461032f90610100900460ff1681565b34801561058557600080fd5b5061032f610594366004613543565b50600190565b3480156105a657600080fd5b506103646105b5366004613410565b611035565b3480156105c657600080fd5b506105da6105d5366004613543565b611050565b60405161033b919061355e565b3480156105f357600080fd5b50610364610602366004613354565b6110f2565b34801561061357600080fd5b50610423610622366004613354565b611121565b34801561063357600080fd5b506103646106423660046134fa565b6111b4565b34801561065357600080fd5b506103646106623660046132ce565b6111f1565b34801561067357600080fd5b5061037b610682366004613354565b611237565b34801561069357600080fd5b5060135461032f9060ff1681565b3480156106ad57600080fd5b506103a86106bc366004613354565b611262565b3480156106cd57600080fd5b506103646106dc3660046134fa565b6112d9565b3480156106ed57600080fd5b5061037b611316565b34801561070257600080fd5b50610423610711366004613543565b611323565b34801561072257600080fd5b506103646113aa565b34801561073757600080fd5b50600a546001600160a01b03166103a8565b34801561075557600080fd5b5060135461032f9062010000900460ff1681565b34801561077557600080fd5b506103646113e0565b34801561078a57600080fd5b5061037b6114e4565b34801561079f57600080fd5b506103646107ae3660046134fa565b6114f3565b6103646107c1366004613354565b611755565b3480156107d257600080fd5b506103646107e13660046135a2565b611938565b3480156107f257600080fd5b506103646108013660046135d5565b611943565b34801561081257600080fd5b506104236108213660046134fa565b805160208183018101805160178252928201919093012091525481565b34801561084a57600080fd5b5061036461197b565b34801561085f57600080fd5b5061037b6119d7565b34801561087457600080fd5b5061037b610883366004613354565b6119e4565b34801561089457600080fd5b506103646108a3366004613543565b611ac2565b3480156108b457600080fd5b50610423600f5481565b3480156108ca57600080fd5b5061042360105481565b3480156108e057600080fd5b506103646108ef3660046134fa565b611c2a565b34801561090057600080fd5b50610909611c67565b60405161033b9190613651565b34801561092257600080fd5b5061032f6109313660046136b3565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561096b57600080fd5b5061036461097a366004613543565b611d40565b34801561098b57600080fd5b5061042361099a366004613354565b611dd8565b3480156109ab57600080fd5b506103646109ba3660046136dd565b611e73565b60006109ca82612143565b92915050565b600a546001600160a01b03163314610a035760405162461bcd60e51b81526004016109fa90613709565b60405180910390fd5b6013805460ff1916911515919091179055565b606060008054610a259061373e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a519061373e565b8015610a9e5780601f10610a7357610100808354040283529160200191610a9e565b820191906000526020600020905b815481529060010190602001808311610a8157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b215760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109fa565b506000908152600460205260409020546001600160a01b031690565b6000610b4882611262565b9050806001600160a01b0316836001600160a01b03161415610bb65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109fa565b336001600160a01b0382161480610bd25750610bd28133610931565b610c445760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109fa565b610c4e8383612168565b505050565b6060601c6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610cdd5760008481526020908190206040805160608101825260038602909201805483526001808201546001600160a01b031684860152600290910154918301919091529083529092019101610c88565b505050509050919050565b60128054610cf59061373e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d219061373e565b8015610d6e5780601f10610d4357610100808354040283529160200191610d6e565b820191906000526020600020905b815481529060010190602001808311610d5157829003601f168201915b505050505081565b600a546001600160a01b03163314610da05760405162461bcd60e51b81526004016109fa90613709565b60005b6032811015610e06576000828152601c60205260409020805482908110610dcc57610dcc613779565b6000918252602082206003909102018181556001810180546001600160a01b03191690556002015580610dfe816137a5565b915050610da3565b5050565b610e1433826121d6565b610e305760405162461bcd60e51b81526004016109fa906137c0565b610c4e8383836122cd565b6000828152600b60209081526040808320815180830190925280546001600160a01b0316808352600190910154928201839052839261271090610e7e9087613811565b610e889190613846565b92509250509250929050565b600a546001600160a01b03163314610ebe5760405162461bcd60e51b81526004016109fa90613709565b6001601682604051610ed0919061385a565b90815260405160209181900382019020805460ff191692151592909217909155601580546001810182556000919091528251610e06927f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4759092019184019061313d565b6000610f3e83611323565b8210610fa05760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109fa565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000601782604051610fdb919061385a565b9081526020016040518091039020549050919050565b600a546001600160a01b0316331461101b5760405162461bcd60e51b81526004016109fa90613709565b601380549115156101000261ff0019909216919091179055565b610c4e83838360405180602001604052806000815250611943565b6060600061105d83611323565b905060008167ffffffffffffffff81111561107a5761107a61346e565b6040519080825280602002602001820160405280156110a3578160200160208202803683370190505b50905060005b828110156110ea576110bb8582610f33565b8282815181106110cd576110cd613779565b6020908102919091010152806110e2816137a5565b9150506110a9565b509392505050565b600a546001600160a01b0316331461111c5760405162461bcd60e51b81526004016109fa90613709565b600e55565b600061112c60085490565b821061118f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109fa565b600882815481106111a2576111a2613779565b90600052602060002001549050919050565b600a546001600160a01b031633146111de5760405162461bcd60e51b81526004016109fa90613709565b8051610e0690600c90602084019061313d565b600a546001600160a01b0316331461121b5760405162461bcd60e51b81526004016109fa90613709565b60138054911515620100000262ff000019909216919091179055565b6015818154811061124757600080fd5b906000526020600020016000915090508054610cf59061373e565b6000818152600260205260408120546001600160a01b0316806109ca5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109fa565b600a546001600160a01b031633146113035760405162461bcd60e51b81526004016109fa90613709565b8051610e0690601290602084019061313d565b600c8054610cf59061373e565b60006001600160a01b03821661138e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109fa565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146113d45760405162461bcd60e51b81526004016109fa90613709565b6113de6000612478565b565b600a546001600160a01b0316331461140a5760405162461bcd60e51b81526004016109fa90613709565b60005b6015548110156114e157600060176015838154811061142e5761142e613779565b906000526020600020016040516114459190613910565b908152602001604051809103902081905550600060166015838154811061146e5761146e613779565b906000526020600020016040516114859190613910565b908152604051908190036020019020805491151560ff1990921691909117905560158054829081106114b9576114b9613779565b9060005260206000200160006114cf91906131c1565b806114d9816137a5565b91505061140d565b50565b606060018054610a259061373e565b60135462010000900460ff166115575760405162461bcd60e51b815260206004820152602360248201527f4552524f523a204e6f20706f6c6c20746f20766f7465206f6e207269676874206044820152626e6f7760e81b60648201526084016109fa565b601681604051611567919061385a565b9081526040519081900360200190205460ff166115c65760405162461bcd60e51b815260206004820152601c60248201527f4552524f523a20496e76616c696420766f74696e67206f7074696f6e0000000060448201526064016109fa565b60126040516020016115d89190613910565b60408051601f1981840301815282825280516020918201203360009081526018835292909220919261160b929101613910565b6040516020818303038152906040528051906020012014156116835760405162461bcd60e51b815260206004820152602b60248201527f4552524f523a20596f75206861766520616c726561647920766f74656420696e60448201526a207468697320706f6c6c2160a81b60648201526084016109fa565b600061168e33611323565b9050600081116116fb5760405162461bcd60e51b815260206004820152603260248201527f4552524f523a20596f752068617665206e6f20766f74696e67207269676874736044820152712e20476f2072756720796f757273656c662160701b60648201526084016109fa565b8060178360405161170c919061385a565b90815260200160405180910390206000828254611729919061391c565b90915550503360009081526018602052604090206012805461174a9061373e565b610c4e9291906131fb565b60135460ff161561179d5760405162461bcd60e51b81526020600482015260126024820152714d696e74696e67206973207061757365642160701b60448201526064016109fa565b600081116117ed5760405162461bcd60e51b815260206004820181905260248201527f596f75206d757374206d696e74206174206c656173742031205275676d69652160448201526064016109fa565b60006117f860085490565b600f54909150611808838361391c565b11156118615760405162461bcd60e51b815260206004820152602260248201527f416c6c205275676d6965732068617665206265656e206d696e74656420286c6f6044820152616c2960f01b60648201526084016109fa565b81600e5461186f9190613811565b3410156118be5760405162461bcd60e51b815260206004820152601c60248201527f4552524f523a20506c656173652073656e64206d6f726520415641580000000060448201526064016109fa565b60015b828111610c4e5760006118d583600161391c565b90506118e133826124ca565b6118ff816118f7600a546001600160a01b031690565b6011546124e4565b336000908152601a6020526040812080549161191a836137a5565b90915550506008549250508080611930906137a5565b9150506118c1565b610e0633838361257e565b61194d33836121d6565b6119695760405162461bcd60e51b81526004016109fa906137c0565b6119758484848461264d565b50505050565b600a546001600160a01b031633146119a55760405162461bcd60e51b81526004016109fa90613709565b6119ad6113e0565b6013805462ff0000191690556040805160208101918290526000908190526114e19160129161313d565b600d8054610cf59061373e565b6000818152600260205260409020546060906001600160a01b0316611a635760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109fa565b6000611a6d612680565b90506000815111611a8d5760405180602001604052806000815250611abb565b80611a978461268f565b600d604051602001611aab93929190613934565b6040516020818303038152906040525b9392505050565b600a546001600160a01b03163314611aec5760405162461bcd60e51b81526004016109fa90613709565b6000611af760085490565b601354909150610100900460ff16611b515760405162461bcd60e51b815260206004820152601d60248201527f4552524f523a204169722064726f70206973206e6f742061637469766500000060448201526064016109fa565b600f548110611b985760405162461bcd60e51b815260206004820152601360248201527213585e081cdd5c1c1b1e48195e18d959591959606a1b60448201526064016109fa565b601480546001808201835560009283527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec90910180546001600160a01b0319166001600160a01b038616179055611bf090839061391c565b9050611bfc83826124ca565b6001600160a01b0383166000908152601b60205260408120805491611c20836137a5565b9190505550505050565b600a546001600160a01b03163314611c545760405162461bcd60e51b81526004016109fa90613709565b8051610e0690600d90602084019061313d565b60606015805480602002602001604051908101604052809291908181526020016000905b82821015611d37578382906000526020600020018054611caa9061373e565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd69061373e565b8015611d235780601f10611cf857610100808354040283529160200191611d23565b820191906000526020600020905b815481529060010190602001808311611d0657829003601f168201915b505050505081526020019060010190611c8b565b50505050905090565b600a546001600160a01b03163314611d6a5760405162461bcd60e51b81526004016109fa90613709565b6001600160a01b038116611dcf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109fa565b6114e181612478565b600a546000906001600160a01b03163314611e055760405162461bcd60e51b81526004016109fa90613709565b6000611e11338461278d565b90506000611e1e82611262565b604080518481526001600160a01b038316602082015260008183015290519192507fad586bf2cfefa63512aa5a1106545ee05dc5376edec8841ef54a636f4a036a2d919081900360600190a15090505b919050565b600a546001600160a01b03163314611e9d5760405162461bcd60e51b81526004016109fa90613709565b60135460ff16611ebf5760405162461bcd60e51b81526004016109fa90613971565b6014811115611f205760405162461bcd60e51b815260206004820152602760248201527f4572726f723a20446f6e27742074616b65206d6f7265207468616e2032302520604482015266796f752061737360c81b60648201526084016109fa565b60008311611f7c5760405162461bcd60e51b8152602060048201526024808201527f4572726f723a204d7573742068617665206174206c65617374206f6e6520727560448201526333b3b2b960e11b60648201526084016109fa565b476000611f8a8360646139b5565b905060008582611f9b606486613846565b611fa59190613811565b611faf9190613846565b90506000611fc5600a546001600160a01b031690565b6001600160a01b031685611fda606447613846565b611fe49190613811565b604051600081818185875af1925050503d8060008114612020576040519150601f19603f3d011682016040523d82523d6000602084013e612025565b606091505b505090508061203357600080fd5b600061203f88886128c7565b9050805188146120a15760405162461bcd60e51b815260206004820152602760248201527f4572726f723a2077696e6e657220636f756e74206e6f74207069636b65642070604482015266726f7065726c7960c81b60648201526084016109fa565b60005b888110156121385760008282815181106120c0576120c0613779565b60200260200101516001600160a01b03168560405160006040518083038185875af1925050503d8060008114612112576040519150601f19603f3d011682016040523d82523d6000602084013e612117565b606091505b505090508061212557600080fd5b5080612130816137a5565b9150506120a4565b505050505050505050565b60006001600160e01b0319821663152a902d60e11b14806109ca57506109ca82612a4b565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061219d82611262565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661224f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109fa565b600061225a83611262565b9050806001600160a01b0316846001600160a01b031614806122955750836001600160a01b031661228a84610aa8565b6001600160a01b0316145b806122c557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166122e082611262565b6001600160a01b0316146123485760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109fa565b6001600160a01b0382166123aa5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109fa565b6123b5838383612a70565b6123c0600082612168565b6001600160a01b03831660009081526003602052604081208054600192906123e99084906139b5565b90915550506001600160a01b038216600090815260036020526040812080546001929061241790849061391c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610e06828260405180602001604052806000815250612b28565b6127108111156125365760405162461bcd60e51b815260206004820152601a60248201527f45524332393831526f79616c746965733a20546f6f206869676800000000000060448201526064016109fa565b6040805180820182526001600160a01b03938416815260208082019384526000958652600b90529320925183546001600160a01b031916921691909117825551600190910155565b816001600160a01b0316836001600160a01b031614156125e05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109fa565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6126588484846122cd565b61266484848484612b5b565b6119755760405162461bcd60e51b81526004016109fa906139cc565b6060600c8054610a259061373e565b6060816126b35750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126dd57806126c7816137a5565b91506126d69050600a83613846565b91506126b7565b60008167ffffffffffffffff8111156126f8576126f861346e565b6040519080825280601f01601f191660200182016040528015612722576020820181803683370190505b5090505b84156122c5576127376001836139b5565b9150612744600a86613a1e565b61274f90603061391c565b60f81b81838151811061276457612764613779565b60200101906001600160f81b031916908160001a905350612786600a86613846565b9450612726565b6040516bffffffffffffffffffffffff19606084901b1660208201526000908190439042906034016040516020818303038152906040528051906020012060001c6127d89190613846565b6040516bffffffffffffffffffffffff194160601b166020820152459042906034016040516020818303038152906040528051906020012060001c61281d9190613846565b4461282888426139b5565b612832919061391c565b61283c919061391c565b612846919061391c565b612850919061391c565b61285a919061391c565b60405160200161286c91815260200190565b6040516020818303038152906040528051906020012060001c9050600061289260085490565b90508061289f8184613846565b6128a99190613811565b6128b390836139b5565b6128be90600161391c565b95945050505050565b60135460609060ff166128ec5760405162461bcd60e51b81526004016109fa90613971565b600047116129345760405162461bcd60e51b815260206004820152601560248201527422a92927a91d102bb293b932903a37b7903837b7b960591b60448201526064016109fa565b60328311156129855760405162461bcd60e51b815260206004820181905260248201527f4552524f523a20546f6f206d616e792077696e6e6572732073656c656374656460448201526064016109fa565b60008367ffffffffffffffff8111156129a0576129a061346e565b6040519080825280602002602001820160405280156129c9578160200160208202803683370190505b5090503360005b85811015612a2c576129ed6000836129e8848961391c565b612c59565b915081838281518110612a0257612a02613779565b6001600160a01b039092166020928302919091019091015280612a24816137a5565b9150506129d0565b5060108054906000612a3d836137a5565b909155509195945050505050565b60006001600160e01b0319821663780e9d6360e01b14806109ca57506109ca82612e0f565b6001600160a01b038316612acb57612ac681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612aee565b816001600160a01b0316836001600160a01b031614612aee57612aee8382612e5f565b6001600160a01b038216612b0557610c4e81612efc565b826001600160a01b0316826001600160a01b031614610c4e57610c4e8282612fab565b612b328383612fef565b612b3f6000848484612b5b565b610c4e5760405162461bcd60e51b81526004016109fa906139cc565b60006001600160a01b0384163b15612c4e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b9f903390899088908890600401613a32565b6020604051808303816000875af1925050508015612bda575060408051601f3d908101601f19168201909252612bd791810190613a6f565b60015b612c34573d808015612c08576040519150601f19603f3d011682016040523d82523d6000602084013e612c0d565b606091505b508051612c2c5760405162461bcd60e51b81526004016109fa906139cc565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122c5565b506001949350505050565b600080612c66848461278d565b90506000612c7382611262565b6000838152601d60209081526040808320548151606081018352848152928301849052908201929092529192509042821490600589108015612cb25750815b15612ce2576000612cc48a600161391c565b9050612cd581866129e8828a61391c565b9650505050505050611abb565b60058910158015612cf05750815b15612d4b57604080518681526001600160a01b03861660208201529081018a90527fad586bf2cfefa63512aa5a1106545ee05dc5376edec8841ef54a636f4a036a2d9060600160405180910390a18395505050505050611abb565b6001600160a01b03848116602083810182815260408086018a81526010548088526000908152601c85528281208054600180820183559183528683208a51600390920201908155945190850180546001600160a01b031916919098161790965551600290920191909155888452601d8252928390204290558251888152908101919091529081018a90527fad586bf2cfefa63512aa5a1106545ee05dc5376edec8841ef54a636f4a036a2d9060600160405180910390a15091979650505050505050565b60006001600160e01b031982166380ac58cd60e01b1480612e4057506001600160e01b03198216635b5e139f60e01b145b806109ca57506301ffc9a760e01b6001600160e01b03198316146109ca565b60006001612e6c84611323565b612e7691906139b5565b600083815260076020526040902054909150808214612ec9576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612f0e906001906139b5565b60008381526009602052604081205460088054939450909284908110612f3657612f36613779565b906000526020600020015490508060088381548110612f5757612f57613779565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612f8f57612f8f613a8c565b6001900381819060005260206000200160009055905550505050565b6000612fb683611323565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166130455760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109fa565b6000818152600260205260409020546001600160a01b0316156130aa5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109fa565b6130b660008383612a70565b6001600160a01b03821660009081526003602052604081208054600192906130df90849061391c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546131499061373e565b90600052602060002090601f01602090048101928261316b57600085556131b1565b82601f1061318457805160ff19168380011785556131b1565b828001600101855582156131b1579182015b828111156131b1578251825591602001919060010190613196565b506131bd929150613276565b5090565b5080546131cd9061373e565b6000825580601f106131dd575050565b601f0160209004906000526020600020908101906114e19190613276565b8280546132079061373e565b90600052602060002090601f01602090048101928261322957600085556131b1565b82601f1061323a57805485556131b1565b828001600101855582156131b157600052602060002091601f016020900482015b828111156131b157825482559160010191906001019061325b565b5b808211156131bd5760008155600101613277565b6001600160e01b0319811681146114e157600080fd5b6000602082840312156132b357600080fd5b8135611abb8161328b565b80358015158114611e6e57600080fd5b6000602082840312156132e057600080fd5b611abb826132be565b60005b838110156133045781810151838201526020016132ec565b838111156119755750506000910152565b6000815180845261332d8160208601602086016132e9565b601f01601f19169290920160200192915050565b602081526000611abb6020830184613315565b60006020828403121561336657600080fd5b5035919050565b80356001600160a01b0381168114611e6e57600080fd5b6000806040838503121561339757600080fd5b6133a08361336d565b946020939093013593505050565b602080825282518282018190526000919060409081850190868401855b8281101561340357815180518552868101516001600160a01b03168786015285015185850152606090930192908501906001016133cb565b5091979650505050505050565b60008060006060848603121561342557600080fd5b61342e8461336d565b925061343c6020850161336d565b9150604084013590509250925092565b6000806040838503121561345f57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561349f5761349f61346e565b604051601f8501601f19908116603f011681019082821181831017156134c7576134c761346e565b816040528093508581528686860111156134e057600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561350c57600080fd5b813567ffffffffffffffff81111561352357600080fd5b8201601f8101841361353457600080fd5b6122c584823560208401613484565b60006020828403121561355557600080fd5b611abb8261336d565b6020808252825182820181905260009190848201906040850190845b818110156135965783518352928401929184019160010161357a565b50909695505050505050565b600080604083850312156135b557600080fd5b6135be8361336d565b91506135cc602084016132be565b90509250929050565b600080600080608085870312156135eb57600080fd5b6135f48561336d565b93506136026020860161336d565b925060408501359150606085013567ffffffffffffffff81111561362557600080fd5b8501601f8101871361363657600080fd5b61364587823560208401613484565b91505092959194509250565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156136a657603f19888603018452613694858351613315565b94509285019290850190600101613678565b5092979650505050505050565b600080604083850312156136c657600080fd5b6136cf8361336d565b91506135cc6020840161336d565b6000806000606084860312156136f257600080fd5b505081359360208301359350604090920135919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061375257607f821691505b6020821081141561377357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156137b9576137b961378f565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600081600019048311821515161561382b5761382b61378f565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261385557613855613830565b500490565b6000825161386c8184602087016132e9565b9190910192915050565b8054600090600181811c908083168061389057607f831692505b60208084108214156138b257634e487b7160e01b600052602260045260246000fd5b8180156138c657600181146138d757613904565b60ff19861689528489019650613904565b60008881526020902060005b868110156138fc5781548b8201529085019083016138e3565b505084890196505b50505050505092915050565b6000611abb8284613876565b6000821982111561392f5761392f61378f565b500190565b600084516139468184602089016132e9565b84519083019061395a8183602089016132e9565b61396681830186613876565b979650505050505050565b60208082526024908201527f4552524f523a204d696e74696e67206d7573742062652070617573656420746f6040820152632072756760e01b606082015260800190565b6000828210156139c7576139c761378f565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082613a2d57613a2d613830565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613a6590830184613315565b9695505050505050565b600060208284031215613a8157600080fd5b8151611abb8161328b565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220adc5d571a0031ee6885e3d505ecf566717ffffba5c99c1c58d1db8f0f7926cc864736f6c634300080b0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000075275676d6965730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035255470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f6431733567673072797a323673762e636c6f756466726f6e742e6e65742f6d657461646174612f0000000000000000000000000000000000

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000075275676d6965730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035255470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f6431733567673072797a323673762e636c6f756466726f6e742e6e65742f6d657461646174612f0000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Rugmies
Arg [1] : _symbol (string): RUG
Arg [2] : _initBaseURI (string): https://d1s5gg0ryz26sv.cloudfront.net/metadata/

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [4] : 5275676d69657300000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 5255470000000000000000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000002f
Arg [8] : 68747470733a2f2f6431733567673072797a323673762e636c6f756466726f6e
Arg [9] : 742e6e65742f6d657461646174612f0000000000000000000000000000000000


Deployed ByteCode Sourcemap

365:13247:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1829:195;;;;;;;;;;-1:-1:-1;1829:195:13;;;;;:::i;:::-;;:::i;:::-;;;565:14:15;;558:22;540:41;;528:2;513:18;1829:195:13;;;;;;;;4816:75;;;;;;;;;;-1:-1:-1;4816:75:13;;;;;:::i;:::-;;:::i;:::-;;2394:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3905:217::-;;;;;;;;;;-1:-1:-1;3905:217:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2042:32:15;;;2024:51;;2012:2;1997:18;3905:217:4;1878:203:15;3443:401:4;;;;;;;;;;-1:-1:-1;3443:401:4;;;;;:::i;:::-;;:::i;10499:122:13:-;;;;;;;;;;-1:-1:-1;10499:122:13;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;727:29::-;;;;;;;;;;;;;;;;;;;3541:25:15;;;3529:2;3514:18;727:29:13;3395:177:15;1610:111:5;;;;;;;;;;-1:-1:-1;1697:10:5;:17;1610:111;;887:22:13;;;;;;;;;;;;;:::i;10787:163::-;;;;;;;;;;-1:-1:-1;10787:163:13;;;;;:::i;:::-;;:::i;4632:330:4:-;;;;;;;;;;-1:-1:-1;4632:330:4;;;;;:::i;:::-;;:::i;1195:292:3:-;;;;;;;;;;-1:-1:-1;1195:292:3;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4355:32:15;;;4337:51;;4419:2;4404:18;;4397:34;;;;4310:18;1195:292:3;4163:274:15;11901:142:13;;;;;;;;;;-1:-1:-1;11901:142:13;;;;;:::i;:::-;;:::i;1286:253:5:-;;;;;;;;;;-1:-1:-1;1286:253:5;;;;;:::i;:::-;;:::i;12828:120:13:-;;;;;;;;;;-1:-1:-1;12828:120:13;;;;;:::i;:::-;;:::i;9772:93::-;;;;;;;;;;-1:-1:-1;9772:93:13;;;;;:::i;:::-;;:::i;948:33::-;;;;;;;;;;-1:-1:-1;948:33:13;;;;;;;;;;;3054:93;;;;;;;;;;-1:-1:-1;3054:93:13;;;;;:::i;:::-;-1:-1:-1;3136:4:13;;3054:93;5028:179:4;;;;;;;;;;-1:-1:-1;5028:179:4;;;;;:::i;:::-;;:::i;3267:351:13:-;;;;;;;;;;-1:-1:-1;3267:351:13;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4195:82::-;;;;;;;;;;-1:-1:-1;4195:82:13;;;;;:::i;:::-;;:::i;1793:230:5:-;;;;;;;;;;-1:-1:-1;1793:230:5;;;;;:::i;:::-;;:::i;4376:100:13:-;;;;;;;;;;-1:-1:-1;4376:100:13;;;;;:::i;:::-;;:::i;13097:85::-;;;;;;;;;;-1:-1:-1;13097:85:13;;;;;:::i;:::-;;:::i;1063:27::-;;;;;;;;;;-1:-1:-1;1063:27:13;;;;;:::i;:::-;;:::i;917:25::-;;;;;;;;;;-1:-1:-1;917:25:13;;;;;;;;2097:235:4;;;;;;;;;;-1:-1:-1;2097:235:4;;;;;:::i;:::-;;:::i;12545:90:13:-;;;;;;;;;;-1:-1:-1;12545:90:13;;;;;:::i;:::-;;:::i;657:21::-;;;;;;;;;;;;;:::i;1835:205:4:-;;;;;;;;;;-1:-1:-1;1835:205:4;;;;;:::i;:::-;;:::i;1659:101:12:-;;;;;;;;;;;;;:::i;1027:85::-;;;;;;;;;;-1:-1:-1;1099:6:12;;-1:-1:-1;;;;;1099:6:12;1027:85;;987:29:13;;;;;;;;;;-1:-1:-1;987:29:13;;;;;;;;;;;12139:247;;;;;;;;;;;;;:::i;2556:102:4:-;;;;;;;;;;;;;:::i;11097:656:13:-;;;;;;;;;;-1:-1:-1;11097:656:13;;;;;:::i;:::-;;:::i;2243:683::-;;;;;;:::i;:::-;;:::i;4189:153:4:-;;;;;;;;;;-1:-1:-1;4189:153:4;;;;;:::i;:::-;;:::i;5273:320::-;;;;;;;;;;-1:-1:-1;5273:320:4;;;;;:::i;:::-;;:::i;1141:39:13:-;;;;;;;;;;-1:-1:-1;1141:39:13;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;13486:123;;;;;;;;;;;;;:::i;684:37::-;;;;;;;;;;;;;:::i;3712:389::-;;;;;;;;;;-1:-1:-1;3712:389:13;;;;;:::i;:::-;;:::i;10017:362::-;;;;;;;;;;-1:-1:-1;10017:362:13;;;;;:::i;:::-;;:::i;762:31::-;;;;;;;;;;;;;;;;799:29;;;;;;;;;;;;;;;;4593:124;;;;;;;;;;-1:-1:-1;4593:124:13;;;;;:::i;:::-;;:::i;13291:99::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4408:162:4:-;;;;;;;;;;-1:-1:-1;4408:162:4;;;;;:::i;:::-;-1:-1:-1;;;;;4528:25:4;;;4505:4;4528:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4408:162;1909:198:12;;;;;;;;;;-1:-1:-1;1909:198:12;;;;;:::i;:::-;;:::i;9334:283:13:-;;;;;;;;;;-1:-1:-1;9334:283:13;;;;;:::i;:::-;;:::i;5147:1029::-;;;;;;;;;;-1:-1:-1;5147:1029:13;;;;;:::i;:::-;;:::i;1829:195::-;1958:4;1981:36;2005:11;1981:23;:36::i;:::-;1974:43;1829:195;-1:-1:-1;;1829:195:13:o;4816:75::-;1099:6:12;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;;;;;;;;;4870:6:13::1;:14:::0;;-1:-1:-1;;4870:14:13::1;::::0;::::1;;::::0;;;::::1;::::0;;4816:75::o;2394:98:4:-;2448:13;2480:5;2473:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2394:98;:::o;3905:217::-;3981:7;7153:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7153:16:4;4000:73;;;;-1:-1:-1;;;4000:73:4;;9768:2:15;4000:73:4;;;9750:21:15;9807:2;9787:18;;;9780:30;9846:34;9826:18;;;9819:62;-1:-1:-1;;;9897:18:15;;;9890:42;9949:19;;4000:73:4;9566:408:15;4000:73:4;-1:-1:-1;4091:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4091:24:4;;3905:217::o;3443:401::-;3523:13;3539:23;3554:7;3539:14;:23::i;:::-;3523:39;;3586:5;-1:-1:-1;;;;;3580:11:4;:2;-1:-1:-1;;;;;3580:11:4;;;3572:57;;;;-1:-1:-1;;;3572:57:4;;10181:2:15;3572:57:4;;;10163:21:15;10220:2;10200:18;;;10193:30;10259:34;10239:18;;;10232:62;-1:-1:-1;;;10310:18:15;;;10303:31;10351:19;;3572:57:4;9979:397:15;3572:57:4;719:10:1;-1:-1:-1;;;;;3661:21:4;;;;:62;;-1:-1:-1;3686:37:4;3703:5;719:10:1;4408:162:4;:::i;3686:37::-;3640:165;;;;-1:-1:-1;;;3640:165:4;;10583:2:15;3640:165:4;;;10565:21:15;10622:2;10602:18;;;10595:30;10661:34;10641:18;;;10634:62;10732:26;10712:18;;;10705:54;10776:19;;3640:165:4;10381:420:15;3640:165:4;3816:21;3825:2;3829:7;3816:8;:21::i;:::-;3513:331;3443:401;;:::o;10499:122:13:-;10563:15;10597:9;:17;10607:6;10597:17;;;;;;;;;;;10590:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10590:24:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10499:122;;;:::o;887:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10787:163::-;1099:6:12;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;10864:9:13::1;10859:85;10883:2;10879:1;:6;10859:85;;;10913:17;::::0;;;:9:::1;:17;::::0;;;;:20;;10931:1;;10913:20;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;10906:27:::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;10906:27:13::1;::::0;;::::1;;::::0;10887:3;::::1;::::0;::::1;:::i;:::-;;;;10859:85;;;;10787:163:::0;:::o;4632:330:4:-;4821:41;719:10:1;4854:7:4;4821:18;:41::i;:::-;4813:103;;;;-1:-1:-1;;;4813:103:4;;;;;;;:::i;:::-;4927:28;4937:4;4943:2;4947:7;4927:9;:28::i;1195:292:3:-;1312:16;1392:19;;;:10;:19;;;;;;;;1367:44;;;;;;;;;;-1:-1:-1;;;;;1367:44:3;;;;;;;;;;;;;;;1312:16;;1474:5;;1449:21;;:5;:21;:::i;:::-;1448:31;;;;:::i;:::-;1421:59;;;;;1195:292;;;;;:::o;11901:142:13:-;1099:6:12;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;11998:4:13::1;11973:14;11988:6;11973:22;;;;;;:::i;:::-;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;:29;;-1:-1:-1;;11973:29:13::1;::::0;::::1;;::::0;;;::::1;::::0;;;12012:11:::1;:24:::0;;-1:-1:-1;12012:24:13;::::1;::::0;;-1:-1:-1;12012:24:13;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;:::i;1286:253:5:-:0;1383:7;1418:23;1435:5;1418:16;:23::i;:::-;1410:5;:31;1402:87;;;;-1:-1:-1;;;1402:87:5;;12541:2:15;1402:87:5;;;12523:21:15;12580:2;12560:18;;;12553:30;12619:34;12599:18;;;12592:62;-1:-1:-1;;;12670:18:15;;;12663:41;12721:19;;1402:87:5;12339:407:15;1402:87:5;-1:-1:-1;;;;;;1506:19:5;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1286:253::o;12828:120:13:-;12902:7;12928:5;12934:6;12928:13;;;;;;:::i;:::-;;;;;;;;;;;;;;12921:20;;12828:120;;;:::o;9772:93::-;1099:6:12;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;9837:13:13::1;:21:::0;;;::::1;;;;-1:-1:-1::0;;9837:21:13;;::::1;::::0;;;::::1;::::0;;9772:93::o;5028:179:4:-;5161:39;5178:4;5184:2;5188:7;5161:39;;;;;;;;;;;;:16;:39::i;3267:351:13:-;3327:16;3355:23;3381:17;3391:6;3381:9;:17::i;:::-;3355:43;;3408:25;3450:15;3436:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3436:30:13;;3408:58;;3481:9;3476:111;3496:15;3492:1;:19;3476:111;;;3546:30;3566:6;3574:1;3546:19;:30::i;:::-;3532:8;3541:1;3532:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;3513:3;;;;:::i;:::-;;;;3476:111;;;-1:-1:-1;3603:8:13;3267:351;-1:-1:-1;;;3267:351:13:o;4195:82::-;1099:6:12;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;4256:4:13::1;:14:::0;4195:82::o;1793:230:5:-;1868:7;1903:30;1697:10;:17;;1610:111;1903:30;1895:5;:38;1887:95;;;;-1:-1:-1;;;1887:95:5;;12953:2:15;1887:95:5;;;12935:21:15;12992:2;12972:18;;;12965:30;13031:34;13011:18;;;13004:62;-1:-1:-1;;;13082:18:15;;;13075:42;13134:19;;1887:95:5;12751:408:15;1887:95:5;1999:10;2010:5;1999:17;;;;;;;;:::i;:::-;;;;;;;;;1992:24;;1793:230;;;:::o;4376:100:13:-;1099:6:12;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;4449:20:13;;::::1;::::0;:7:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;13097:85::-:0;1099:6:12;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;13158:9:13::1;:17:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;13158:17:13;;::::1;::::0;;;::::1;::::0;;13097:85::o;1063:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2097:235:4:-;2169:7;2204:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2204:16:4;2238:19;2230:73;;;;-1:-1:-1;;;2230:73:4;;13366:2:15;2230:73:4;;;13348:21:15;13405:2;13385:18;;;13378:30;13444:34;13424:18;;;13417:62;-1:-1:-1;;;13495:18:15;;;13488:39;13544:19;;2230:73:4;13164:405:15;12545:90:13;1099:6:12;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;12613:15:13;;::::1;::::0;:8:::1;::::0;:15:::1;::::0;::::1;::::0;::::1;:::i;657:21::-:0;;;;;;;:::i;1835:205:4:-;1907:7;-1:-1:-1;;;;;1934:19:4;;1926:74;;;;-1:-1:-1;;;1926:74:4;;13776:2:15;1926:74:4;;;13758:21:15;13815:2;13795:18;;;13788:30;13854:34;13834:18;;;13827:62;-1:-1:-1;;;13905:18:15;;;13898:40;13955:19;;1926:74:4;13574:406:15;1926:74:4;-1:-1:-1;;;;;;2017:16:4;;;;;:9;:16;;;;;;;1835:205::o;1659:101:12:-;1099:6;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;1723:30:::1;1750:1;1723:18;:30::i;:::-;1659:101::o:0;12139:247:13:-;1099:6:12;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;12199:9:13::1;12194:186;12218:11;:18:::0;12214:22;::::1;12194:186;;;12281:1;12257:5;12263:11;12275:1;12263:14;;;;;;;;:::i;:::-;;;;;;;;12257:21;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;;12329:5;12296:14;12311:11;12323:1;12311:14;;;;;;;;:::i;:::-;;;;;;;;12296:30;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:38;;;::::1;;-1:-1:-1::0;;12296:38:13;;::::1;::::0;;;::::1;::::0;;12355:11:::1;:14:::0;;12367:1;;12355:14;::::1;;;;;:::i;:::-;;;;;;;;;12348:21;;;;:::i;:::-;12238:3:::0;::::1;::::0;::::1;:::i;:::-;;;;12194:186;;;;12139:247::o:0;2556:102:4:-;2612:13;2644:7;2637:14;;;;;:::i;11097:656:13:-;11162:9;;;;;;;11154:57;;;;-1:-1:-1;;;11154:57:13;;15493:2:15;11154:57:13;;;15475:21:15;15532:2;15512:18;;;15505:30;15571:34;15551:18;;;15544:62;-1:-1:-1;;;15622:18:15;;;15615:33;15665:19;;11154:57:13;15291:399:15;11154:57:13;11229:14;11244:6;11229:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;11221:63;;;;-1:-1:-1;;;11221:63:13;;15897:2:15;11221:63:13;;;15879:21:15;15936:2;15916:18;;;15909:30;15975;15955:18;;;15948:58;16023:18;;11221:63:13;15695:352:15;11221:63:13;11417:8;11400:26;;;;;;;;:::i;:::-;;;;-1:-1:-1;;11400:26:13;;;;;;;;;11390:37;;11400:26;11390:37;;;;11357:10;11342:26;;;;:14;:26;;;;;;11390:37;;11325:44;;11342:26;11325:44;;:::i;:::-;;;;;;;;;;;;;11315:55;;;;;;:112;;11294:202;;;;-1:-1:-1;;;11294:202:13;;16254:2:15;11294:202:13;;;16236:21:15;16293:2;16273:18;;;16266:30;16332:34;16312:18;;;16305:62;-1:-1:-1;;;16383:18:15;;;16376:41;16434:19;;11294:202:13;16052:407:15;11294:202:13;11507:15;11525:21;11535:10;11525:9;:21::i;:::-;11507:39;;11588:1;11578:7;:11;11557:108;;;;-1:-1:-1;;;11557:108:13;;16666:2:15;11557:108:13;;;16648:21:15;16705:2;16685:18;;;16678:30;16744:34;16724:18;;;16717:62;-1:-1:-1;;;16795:18:15;;;16788:48;16853:19;;11557:108:13;16464:414:15;11557:108:13;11692:7;11675:5;11681:6;11675:13;;;;;;:::i;:::-;;;;;;;;;;;;;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;11724:10:13;11709:26;;;;:14;:26;;;;;11738:8;11709:37;;;;;:::i;:::-;;;;;;:::i;2243:683::-;2312:6;;;;2311:7;2303:38;;;;-1:-1:-1;;;2303:38:13;;17218:2:15;2303:38:13;;;17200:21:15;17257:2;17237:18;;;17230:30;-1:-1:-1;;;17276:18:15;;;17269:48;17334:18;;2303:38:13;17016:342:15;2303:38:13;2373:1;2359:11;:15;2351:60;;;;-1:-1:-1;;;2351:60:13;;17565:2:15;2351:60:13;;;17547:21:15;;;17584:18;;;17577:30;17643:34;17623:18;;;17616:62;17695:18;;2351:60:13;17363:356:15;2351:60:13;2422:14;2439:13;1697:10:5;:17;;1610:111;2439:13:13;2494:9;;2422:30;;-1:-1:-1;2470:20:13;2479:11;2422:30;2470:20;:::i;:::-;:33;;2462:80;;;;-1:-1:-1;;;2462:80:13;;17926:2:15;2462:80:13;;;17908:21:15;17965:2;17945:18;;;17938:30;18004:34;17984:18;;;17977:62;-1:-1:-1;;;18055:18:15;;;18048:32;18097:19;;2462:80:13;17724:398:15;2462:80:13;2580:11;2573:4;;:18;;;;:::i;:::-;2560:9;:31;;2552:72;;;;-1:-1:-1;;;2552:72:13;;18329:2:15;2552:72:13;;;18311:21:15;18368:2;18348:18;;;18341:30;18407;18387:18;;;18380:58;18455:18;;2552:72:13;18127:352:15;2552:72:13;2653:1;2636:284;2661:11;2656:1;:16;2636:284;;2693:15;2711:10;:6;2720:1;2711:10;:::i;:::-;2693:28;;2735:30;2745:10;2757:7;2735:9;:30::i;:::-;2779:53;2796:7;2805;1099:6:12;;-1:-1:-1;;;;;1099:6:12;;1027:85;2805:7:13;2814:17;;2779:16;:53::i;:::-;2860:10;2847:24;;;;:12;:24;;;;;:26;;;;;;:::i;:::-;;;;-1:-1:-1;;1697:10:5;:17;2887:22:13;;2679:241;2674:3;;;;;:::i;:::-;;;;2636:284;;4189:153:4;4283:52;719:10:1;4316:8:4;4326;4283:18;:52::i;5273:320::-;5442:41;719:10:1;5475:7:4;5442:18;:41::i;:::-;5434:103;;;;-1:-1:-1;;;5434:103:4;;;;;;;:::i;:::-;5547:39;5561:4;5567:2;5571:7;5580:5;5547:13;:39::i;:::-;5273:320;;;;:::o;13486:123:13:-;1099:6:12;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;13534:18:13::1;:16;:18::i;:::-;13562:9;:17:::0;;-1:-1:-1;;13562:17:13::1;::::0;;13589:13:::1;::::0;;::::1;::::0;::::1;::::0;;;;13574:5:::1;13589:13:::0;;;;::::1;::::0;:8:::1;::::0;:13:::1;:::i;684:37::-:0;;;;;;;:::i;3712:389::-;7130:4:4;7153:16;;;:7;:16;;;;;;3785:13:13;;-1:-1:-1;;;;;7153:16:4;3810:76:13;;;;-1:-1:-1;;;3810:76:13;;18686:2:15;3810:76:13;;;18668:21:15;18725:2;18705:18;;;18698:30;18764:34;18744:18;;;18737:62;-1:-1:-1;;;18815:18:15;;;18808:45;18870:19;;3810:76:13;18484:411:15;3810:76:13;3897:28;3928:10;:8;:10::i;:::-;3897:41;;3986:1;3961:14;3955:28;:32;:139;;;;;;;;;;;;;;;;;4026:14;4042:18;:7;:16;:18::i;:::-;4062:13;4009:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3955:139;3948:146;3712:389;-1:-1:-1;;;3712:389:13:o;10017:362::-;1099:6:12;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;10073:14:13::1;10090:13;1697:10:5::0;:17;;1610:111;10090:13:13::1;10121;::::0;10073:30;;-1:-1:-1;10121:13:13::1;::::0;::::1;;;10113:55;;;::::0;-1:-1:-1;;;10113:55:13;;19657:2:15;10113:55:13::1;::::0;::::1;19639:21:15::0;19696:2;19676:18;;;19669:30;19735:31;19715:18;;;19708:59;19784:18;;10113:55:13::1;19455:353:15::0;10113:55:13::1;10195:9;;10186:6;:18;10178:50;;;::::0;-1:-1:-1;;;10178:50:13;;20015:2:15;10178:50:13::1;::::0;::::1;19997:21:15::0;20054:2;20034:18;;;20027:30;-1:-1:-1;;;20073:18:15;;;20066:49;20132:18;;10178:50:13::1;19813:343:15::0;10178:50:13::1;10238:16;:25:::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;10238:25:13;;;;;;::::1;::::0;;-1:-1:-1;;;;;;10238:25:13::1;-1:-1:-1::0;;;;;10238:25:13;::::1;;::::0;;10292:10:::1;::::0;:6;;:10:::1;:::i;:::-;10274:28;;10313:22;10323:2;10327:7;10313:9;:22::i;:::-;-1:-1:-1::0;;;;;10345:24:13;::::1;;::::0;;;:20:::1;:24;::::0;;;;:26;;;::::1;::::0;::::1;:::i;:::-;;;;;;10063:316;;10017:362:::0;:::o;4593:124::-;1099:6:12;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;4678:32:13;;::::1;::::0;:13:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;13291:99::-:0;13338:15;13372:11;13365:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13291:99;:::o;1909:198:12:-;1099:6;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;1997:22:12;::::1;1989:73;;;::::0;-1:-1:-1;;;1989:73:12;;20363:2:15;1989:73:12::1;::::0;::::1;20345:21:15::0;20402:2;20382:18;;;20375:30;20441:34;20421:18;;;20414:62;-1:-1:-1;;;20492:18:15;;;20485:36;20538:19;;1989:73:12::1;20161:402:15::0;1989:73:12::1;2072:28;2091:8;2072:18;:28::i;9334:283:13:-:0;1099:6:12;;9395:7:13;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;9414:20:13::1;9437:22;9442:10;9454:4;9437;:22::i;:::-;9414:45;;9469:21;9493:28;9508:12;9493:14;:28::i;:::-;9537:44;::::0;;20778:25:15;;;-1:-1:-1;;;;;20839:32:15;;20834:2;20819:18;;20812:60;-1:-1:-1;20888:18:15;;;20881:34;9537:44:13;;20839:32:15;;-1:-1:-1;9537:44:13::1;::::0;;;;;20766:2:15;9537:44:13;;::::1;-1:-1:-1::0;9598:12:13;-1:-1:-1;1309:1:12::1;9334:283:13::0;;;:::o;5147:1029::-;1099:6:12;;-1:-1:-1;;;;;1099:6:12;719:10:1;1239:23:12;1231:68;;;;-1:-1:-1;;;1231:68:12;;;;;;;:::i;:::-;5242:6:13::1;::::0;::::1;;5234:55;;;;-1:-1:-1::0;;;5234:55:13::1;;;;;;;:::i;:::-;5319:2;5307:8;:14;;5299:66;;;::::0;-1:-1:-1;;;5299:66:13;;21533:2:15;5299:66:13::1;::::0;::::1;21515:21:15::0;21572:2;21552:18;;;21545:30;21611:34;21591:18;;;21584:62;-1:-1:-1;;;21662:18:15;;;21655:37;21709:19;;5299:66:13::1;21331:403:15::0;5299:66:13::1;5449:1;5435:11;:15;5427:64;;;::::0;-1:-1:-1;;;5427:64:13;;22286:2:15;5427:64:13::1;::::0;::::1;22268:21:15::0;22325:2;22305:18;;;22298:30;22364:34;22344:18;;;22337:62;-1:-1:-1;;;22415:18:15;;;22408:34;22459:19;;5427:64:13::1;22084:400:15::0;5427:64:13::1;5528:21;5502:23;5578:14;5584:8:::0;5578:3:::1;:14;:::i;:::-;5559:33:::0;-1:-1:-1;5602:18:13::1;5658:11:::0;5559:33;5623:21:::1;5641:3;5623:15:::0;:21:::1;:::i;:::-;:32;;;;:::i;:::-;:46;;;;:::i;:::-;5602:67;;5681:20;5715:7;1099:6:12::0;;-1:-1:-1;;;;;1099:6:12;;1027:85;5715:7:13::1;-1:-1:-1::0;;;;;5707:21:13::1;5766:8:::0;5736:27:::1;5760:3;5736:21;:27;:::i;:::-;:38;;;;:::i;:::-;5707:72;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5680:99;;;5797:15;5789:24;;;::::0;::::1;;5824;5851:32;5865:11;5878:4;5851:13;:32::i;:::-;5824:59;;5916:7;:14;5901:11;:29;5893:81;;;::::0;-1:-1:-1;;;5893:81:13;;23031:2:15;5893:81:13::1;::::0;::::1;23013:21:15::0;23070:2;23050:18;;;23043:30;23109:34;23089:18;;;23082:62;-1:-1:-1;;;23160:18:15;;;23153:37;23207:19;;5893:81:13::1;22829:403:15::0;5893:81:13::1;5998:9;5993:177;6017:11;6013:1;:15;5993:177;;;6050:19;6083:7;6091:1;6083:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;6075:24:13::1;6107:10;6075:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6049:73;;;6144:14;6136:23;;;::::0;::::1;;-1:-1:-1::0;6030:3:13;::::1;::::0;::::1;:::i;:::-;;;;5993:177;;;;5224:952;;;;;5147:1029:::0;;;:::o;413:273:3:-;538:4;-1:-1:-1;;;;;;577:50:3;;-1:-1:-1;;;577:50:3;;:102;;;643:36;667:11;643:23;:36::i;10916:171:4:-;10990:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;10990:29:4;-1:-1:-1;;;;;10990:29:4;;;;;;;;:24;;11043:23;10990:24;11043:14;:23::i;:::-;-1:-1:-1;;;;;11034:46:4;;;;;;;;;;;10916:171;;:::o;7348:344::-;7441:4;7153:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7153:16:4;7457:73;;;;-1:-1:-1;;;7457:73:4;;23439:2:15;7457:73:4;;;23421:21:15;23478:2;23458:18;;;23451:30;23517:34;23497:18;;;23490:62;-1:-1:-1;;;23568:18:15;;;23561:42;23620:19;;7457:73:4;23237:408:15;7457:73:4;7540:13;7556:23;7571:7;7556:14;:23::i;:::-;7540:39;;7608:5;-1:-1:-1;;;;;7597:16:4;:7;-1:-1:-1;;;;;7597:16:4;;:51;;;;7641:7;-1:-1:-1;;;;;7617:31:4;:20;7629:7;7617:11;:20::i;:::-;-1:-1:-1;;;;;7617:31:4;;7597:51;:87;;;-1:-1:-1;;;;;;4528:25:4;;;4505:4;4528:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7652:32;7589:96;7348:344;-1:-1:-1;;;;7348:344:4:o;10245:560::-;10399:4;-1:-1:-1;;;;;10372:31:4;:23;10387:7;10372:14;:23::i;:::-;-1:-1:-1;;;;;10372:31:4;;10364:85;;;;-1:-1:-1;;;10364:85:4;;23852:2:15;10364:85:4;;;23834:21:15;23891:2;23871:18;;;23864:30;23930:34;23910:18;;;23903:62;-1:-1:-1;;;23981:18:15;;;23974:39;24030:19;;10364:85:4;23650:405:15;10364:85:4;-1:-1:-1;;;;;10467:16:4;;10459:65;;;;-1:-1:-1;;;10459:65:4;;24262:2:15;10459:65:4;;;24244:21:15;24301:2;24281:18;;;24274:30;24340:34;24320:18;;;24313:62;-1:-1:-1;;;24391:18:15;;;24384:34;24435:19;;10459:65:4;24060:400:15;10459:65:4;10535:39;10556:4;10562:2;10566:7;10535:20;:39::i;:::-;10636:29;10653:1;10657:7;10636:8;:29::i;:::-;-1:-1:-1;;;;;10676:15:4;;;;;;:9;:15;;;;;:20;;10695:1;;10676:15;:20;;10695:1;;10676:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10706:13:4;;;;;;:9;:13;;;;;:18;;10723:1;;10706:13;:18;;10723:1;;10706:18;:::i;:::-;;;;-1:-1:-1;;10734:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10734:21:4;-1:-1:-1;;;;;10734:21:4;;;;;;;;;10771:27;;10734:16;;10771:27;;;;;;;10245:560;;;:::o;2261:187:12:-;2353:6;;;-1:-1:-1;;;;;2369:17:12;;;-1:-1:-1;;;;;;2369:17:12;;;;;;;2401:40;;2353:6;;;2369:17;2353:6;;2401:40;;2334:16;;2401:40;2324:124;2261:187;:::o;8022:108:4:-;8097:26;8107:2;8111:7;8097:26;;;;;;;;;;;;:9;:26::i;917:234:3:-;1055:5;1046;:14;;1038:53;;;;-1:-1:-1;;;1038:53:3;;24667:2:15;1038:53:3;;;24649:21:15;24706:2;24686:18;;;24679:30;24745:28;24725:18;;;24718:56;24791:18;;1038:53:3;24465:350:15;1038:53:3;1119:25;;;;;;;;-1:-1:-1;;;;;1119:25:3;;;;;;;;;;;;-1:-1:-1;1102:14:3;;;:10;:14;;;;:42;;;;-1:-1:-1;;;;;;1102:42:3;;;;;;;;;;-1:-1:-1;1102:42:3;;;;917:234::o;11222:307:4:-;11372:8;-1:-1:-1;;;;;11363:17:4;:5;-1:-1:-1;;;;;11363:17:4;;;11355:55;;;;-1:-1:-1;;;11355:55:4;;25022:2:15;11355:55:4;;;25004:21:15;25061:2;25041:18;;;25034:30;25100:27;25080:18;;;25073:55;25145:18;;11355:55:4;24820:349:15;11355:55:4;-1:-1:-1;;;;;11420:25:4;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11420:46:4;;;;;;;;;;11481:41;;540::15;;;11481::4;;513:18:15;11481:41:4;;;;;;;11222:307;;;:::o;6455:::-;6606:28;6616:4;6622:2;6626:7;6606:9;:28::i;:::-;6652:48;6675:4;6681:2;6685:7;6694:5;6652:22;:48::i;:::-;6644:111;;;;-1:-1:-1;;;6644:111:4;;;;;;;:::i;1717:106:13:-;1777:13;1809:7;1802:14;;;;;:::i;328:703:14:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:14;;;;;;;;;;;;-1:-1:-1;;;627:10:14;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:14;;-1:-1:-1;773:2:14;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:14;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:14;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:14;;;;;;;;-1:-1:-1;972:11:14;981:2;972:11;;:::i;:::-;;;844:150;;8358:810:13;8900:31;;-1:-1:-1;;25859:2:15;25855:15;;;25851:53;8900:31:13;;;25839:66:15;8460:7:13;;;;9010:12;;8966:15;;25921:12:15;;8900:31:13;;;;;;;;;;;;8890:42;;;;;;8882:51;;8881:101;;;;:::i;:::-;8731:32;;-1:-1:-1;;8748:14:13;25859:2:15;25855:15;25851:53;8731:32:13;;;25839:66:15;8839:14:13;;8795:15;;25921:12:15;;8731:32:13;;;;;;;;;;;;8721:43;;;;;;8713:52;;8683:128;;;;:::i;:::-;8639:16;8585:26;8603:8;8585:15;:26;:::i;:::-;8584:71;;;;:::i;:::-;:228;;;;:::i;:::-;:269;;;;:::i;:::-;:399;;;;:::i;:::-;:438;;;;:::i;:::-;8546:494;;;;;;26323:19:15;;26367:2;26358:12;;26194:182;8546:494:13;;;;;;;;;;;;;8519:535;;;;;;8498:566;;8483:581;;9075:14;9092:13;1697:10:5;:17;;1610:111;9092:13:13;9075:30;-1:-1:-1;9075:30:13;9132:13;9075:30;9132:4;:13;:::i;:::-;9131:24;;;;:::i;:::-;9123:33;;:4;:33;:::i;:::-;9122:39;;9160:1;9122:39;:::i;:::-;9115:46;8358:810;-1:-1:-1;;;;;8358:810:13:o;6412:688::-;6521:6;;6485:16;;6521:6;;6513:55;;;;-1:-1:-1;;;6513:55:13;;;;;;;:::i;:::-;6610:1;6586:21;:25;6578:59;;;;-1:-1:-1;;;6578:59:13;;26583:2:15;6578:59:13;;;26565:21:15;26622:2;26602:18;;;26595:30;-1:-1:-1;;;26641:18:15;;;26634:51;26702:18;;6578:59:13;26381:345:15;6578:59:13;6671:2;6656:11;:17;;6648:62;;;;-1:-1:-1;;;6648:62:13;;26933:2:15;6648:62:13;;;26915:21:15;;;26952:18;;;26945:30;27011:34;26991:18;;;26984:62;27063:18;;6648:62:13;26731:356:15;6648:62:13;6721:24;6762:11;6748:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6748:26:13;-1:-1:-1;6721:53:13;-1:-1:-1;6807:10:13;6785:19;6827:220;6851:11;6847:1;:15;6827:220;;;6897:101;6928:1;6947:11;6976:8;6983:1;6976:4;:8;:::i;:::-;6897:13;:101::i;:::-;6883:115;;7025:11;7012:7;7020:1;7012:10;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7012:24:13;;;:10;;;;;;;;;;;:24;6864:3;;;;:::i;:::-;;;;6827:220;;;-1:-1:-1;7057:10:13;:12;;;:10;:12;;;:::i;:::-;;;;-1:-1:-1;7086:7:13;;6412:688;-1:-1:-1;;;;;6412:688:13:o;985:222:5:-;1087:4;-1:-1:-1;;;;;;1110:50:5;;-1:-1:-1;;;1110:50:5;;:90;;;1164:36;1188:11;1164:23;:36::i;2619:572::-;-1:-1:-1;;;;;2818:18:5;;2814:183;;2852:40;2884:7;4000:10;:17;;3973:24;;;;:15;:24;;;;;:44;;;4027:24;;;;;;;;;;;;3897:161;2852:40;2814:183;;;2921:2;-1:-1:-1;;;;;2913:10:5;:4;-1:-1:-1;;;;;2913:10:5;;2909:88;;2939:47;2972:4;2978:7;2939:32;:47::i;:::-;-1:-1:-1;;;;;3010:16:5;;3006:179;;3042:45;3079:7;3042:36;:45::i;3006:179::-;3114:4;-1:-1:-1;;;;;3108:10:5;:2;-1:-1:-1;;;;;3108:10:5;;3104:81;;3134:40;3162:2;3166:7;3134:27;:40::i;8351:311:4:-;8476:18;8482:2;8486:7;8476:5;:18::i;:::-;8525:54;8556:1;8560:2;8564:7;8573:5;8525:22;:54::i;:::-;8504:151;;;;-1:-1:-1;;;8504:151:4;;;;;;;:::i;12082:778::-;12232:4;-1:-1:-1;;;;;12252:13:4;;1087:20:0;1133:8;12248:606:4;;12287:72;;-1:-1:-1;;;12287:72:4;;-1:-1:-1;;;;;12287:36:4;;;;;:72;;719:10:1;;12338:4:4;;12344:7;;12353:5;;12287:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12287:72:4;;;;;;;;-1:-1:-1;;12287:72:4;;;;;;;;;;;;:::i;:::-;;;12283:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12526:13:4;;12522:266;;12568:60;;-1:-1:-1;;;12568:60:4;;;;;;;:::i;12522:266::-;12740:6;12734:13;12725:6;12721:2;12717:15;12710:38;12283:519;-1:-1:-1;;;;;;12409:51:4;-1:-1:-1;;;12409:51:4;;-1:-1:-1;12402:58:4;;12248:606;-1:-1:-1;12839:4:4;12082:778;;;;;;:::o;7231:1121:13:-;7352:7;7372:20;7395:26;7400:10;7412:8;7395:4;:26::i;:::-;7372:49;;7431:21;7455:28;7470:12;7455:14;:28::i;:::-;7493:15;7511:22;;;:8;:22;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;7431:52:13;;-1:-1:-1;7511:22:13;7574:15;7563:26;;;7639:1;7634:2;:6;7633:22;;;;;7645:10;7633:22;7629:628;;;7671:13;7687:6;:2;7692:1;7687:6;:::i;:::-;7671:22;-1:-1:-1;7730:135:13;7671:22;7792:13;7827:20;7671:22;7827:12;:20;:::i;7730:135::-;7707:158;;;;;;;;;;7629:628;7893:1;7887:2;:7;;7886:23;;;;;7899:10;7886:23;7882:375;;;7930:44;;;20778:25:15;;;-1:-1:-1;;;;;20839:32:15;;20834:2;20819:18;;20812:60;20888:18;;;20881:34;;;7930:44:13;;20766:2:15;20751:18;7930:44:13;;;;;;;7995:13;7988:20;;;;;;;;;7882:375;-1:-1:-1;;;;;8039:26:13;;;:10;;;;:26;;;8079:11;;;;:26;;;8136:10;;8119:27;;;-1:-1:-1;8160:21:13;;;:9;:21;;;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8160:31:13;;;;;;;;;;;;;;;;;;8206:22;;;:8;:22;;;;;;8231:15;8206:40;;8271:44;;20778:25:15;;;20819:18;;;20812:60;;;;20888:18;;;20881:34;;;8271:44:13;;20766:2:15;20751:18;8271:44:13;;;;;;;-1:-1:-1;8332:13:13;;7231:1121;-1:-1:-1;;;;;;;7231:1121:13:o;1476:300:4:-;1578:4;-1:-1:-1;;;;;;1613:40:4;;-1:-1:-1;;;1613:40:4;;:104;;-1:-1:-1;;;;;;;1669:48:4;;-1:-1:-1;;;1669:48:4;1613:104;:156;;;-1:-1:-1;;;;;;;;;;935:40:2;;;1733:36:4;827:155:2;4675:970:5;4937:22;4987:1;4962:22;4979:4;4962:16;:22::i;:::-;:26;;;;:::i;:::-;4998:18;5019:26;;;:17;:26;;;;;;4937:51;;-1:-1:-1;5149:28:5;;;5145:323;;-1:-1:-1;;;;;5215:18:5;;5193:19;5215:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5264:30;;;;;;:44;;;5380:30;;:17;:30;;;;;:43;;;5145:323;-1:-1:-1;5561:26:5;;;;:17;:26;;;;;;;;5554:33;;;-1:-1:-1;;;;;5604:18:5;;;;;:12;:18;;;;;:34;;;;;;;5597:41;4675:970::o;5933:1061::-;6207:10;:17;6182:22;;6207:21;;6227:1;;6207:21;:::i;:::-;6238:18;6259:24;;;:15;:24;;;;;;6627:10;:26;;6182:46;;-1:-1:-1;6259:24:5;;6182:46;;6627:26;;;;;;:::i;:::-;;;;;;;;;6605:48;;6689:11;6664:10;6675;6664:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6768:28;;;:15;:28;;;;;;;:41;;;6937:24;;;;;6930:31;6971:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6004:990;;;5933:1061;:::o;3485:217::-;3569:14;3586:20;3603:2;3586:16;:20::i;:::-;-1:-1:-1;;;;;3616:16:5;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3660:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3485:217:5:o;8984:372:4:-;-1:-1:-1;;;;;9063:16:4;;9055:61;;;;-1:-1:-1;;;9055:61:4;;28524:2:15;9055:61:4;;;28506:21:15;;;28543:18;;;28536:30;28602:34;28582:18;;;28575:62;28654:18;;9055:61:4;28322:356:15;9055:61:4;7130:4;7153:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7153:16:4;:30;9126:58;;;;-1:-1:-1;;;9126:58:4;;28885:2:15;9126:58:4;;;28867:21:15;28924:2;28904:18;;;28897:30;28963;28943:18;;;28936:58;29011:18;;9126:58:4;28683:352:15;9126:58:4;9195:45;9224:1;9228:2;9232:7;9195:20;:45::i;:::-;-1:-1:-1;;;;;9251:13:4;;;;;;:9;:13;;;;;:18;;9268:1;;9251:13;:18;;9268:1;;9251:18;:::i;:::-;;;;-1:-1:-1;;9279:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9279:21:4;-1:-1:-1;;;;;9279:21:4;;;;;;;;9316:33;;9279:16;;;9316:33;;9279:16;;9316:33;8984:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:15;-1:-1:-1;;;;;;88:32:15;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:160::-;657:20;;713:13;;706:21;696:32;;686:60;;742:1;739;732:12;757:180;813:6;866:2;854:9;845:7;841:23;837:32;834:52;;;882:1;879;872:12;834:52;905:26;921:9;905:26;:::i;942:258::-;1014:1;1024:113;1038:6;1035:1;1032:13;1024:113;;;1114:11;;;1108:18;1095:11;;;1088:39;1060:2;1053:10;1024:113;;;1155:6;1152:1;1149:13;1146:48;;;-1:-1:-1;;1190:1:15;1172:16;;1165:27;942:258::o;1205:::-;1247:3;1285:5;1279:12;1312:6;1307:3;1300:19;1328:63;1384:6;1377:4;1372:3;1368:14;1361:4;1354:5;1350:16;1328:63;:::i;:::-;1445:2;1424:15;-1:-1:-1;;1420:29:15;1411:39;;;;1452:4;1407:50;;1205:258;-1:-1:-1;;1205:258:15:o;1468:220::-;1617:2;1606:9;1599:21;1580:4;1637:45;1678:2;1667:9;1663:18;1655:6;1637:45;:::i;1693:180::-;1752:6;1805:2;1793:9;1784:7;1780:23;1776:32;1773:52;;;1821:1;1818;1811:12;1773:52;-1:-1:-1;1844:23:15;;1693:180;-1:-1:-1;1693:180:15:o;2086:173::-;2154:20;;-1:-1:-1;;;;;2203:31:15;;2193:42;;2183:70;;2249:1;2246;2239:12;2264:254;2332:6;2340;2393:2;2381:9;2372:7;2368:23;2364:32;2361:52;;;2409:1;2406;2399:12;2361:52;2432:29;2451:9;2432:29;:::i;:::-;2422:39;2508:2;2493:18;;;;2480:32;;-1:-1:-1;;;2264:254:15:o;2523:867::-;2742:2;2794:21;;;2864:13;;2767:18;;;2886:22;;;2713:4;;2742:2;2927;;2945:18;;;;2986:15;;;2713:4;3029:335;3043:6;3040:1;3037:13;3029:335;;;3102:13;;3140:9;;3128:22;;3194:11;;;3188:18;-1:-1:-1;;;;;3184:44:15;3170:12;;;3163:66;3269:11;;3263:18;3249:12;;;3242:40;3311:4;3302:14;;;;3339:15;;;;3225:1;3058:9;3029:335;;;-1:-1:-1;3381:3:15;;2523:867;-1:-1:-1;;;;;;;2523:867:15:o;3577:328::-;3654:6;3662;3670;3723:2;3711:9;3702:7;3698:23;3694:32;3691:52;;;3739:1;3736;3729:12;3691:52;3762:29;3781:9;3762:29;:::i;:::-;3752:39;;3810:38;3844:2;3833:9;3829:18;3810:38;:::i;:::-;3800:48;;3895:2;3884:9;3880:18;3867:32;3857:42;;3577:328;;;;;:::o;3910:248::-;3978:6;3986;4039:2;4027:9;4018:7;4014:23;4010:32;4007:52;;;4055:1;4052;4045:12;4007:52;-1:-1:-1;;4078:23:15;;;4148:2;4133:18;;;4120:32;;-1:-1:-1;3910:248:15:o;4442:127::-;4503:10;4498:3;4494:20;4491:1;4484:31;4534:4;4531:1;4524:15;4558:4;4555:1;4548:15;4574:632;4639:5;4669:18;4710:2;4702:6;4699:14;4696:40;;;4716:18;;:::i;:::-;4791:2;4785:9;4759:2;4845:15;;-1:-1:-1;;4841:24:15;;;4867:2;4837:33;4833:42;4821:55;;;4891:18;;;4911:22;;;4888:46;4885:72;;;4937:18;;:::i;:::-;4977:10;4973:2;4966:22;5006:6;4997:15;;5036:6;5028;5021:22;5076:3;5067:6;5062:3;5058:16;5055:25;5052:45;;;5093:1;5090;5083:12;5052:45;5143:6;5138:3;5131:4;5123:6;5119:17;5106:44;5198:1;5191:4;5182:6;5174;5170:19;5166:30;5159:41;;;;4574:632;;;;;:::o;5211:451::-;5280:6;5333:2;5321:9;5312:7;5308:23;5304:32;5301:52;;;5349:1;5346;5339:12;5301:52;5389:9;5376:23;5422:18;5414:6;5411:30;5408:50;;;5454:1;5451;5444:12;5408:50;5477:22;;5530:4;5522:13;;5518:27;-1:-1:-1;5508:55:15;;5559:1;5556;5549:12;5508:55;5582:74;5648:7;5643:2;5630:16;5625:2;5621;5617:11;5582:74;:::i;5667:186::-;5726:6;5779:2;5767:9;5758:7;5754:23;5750:32;5747:52;;;5795:1;5792;5785:12;5747:52;5818:29;5837:9;5818:29;:::i;5858:632::-;6029:2;6081:21;;;6151:13;;6054:18;;;6173:22;;;6000:4;;6029:2;6252:15;;;;6226:2;6211:18;;;6000:4;6295:169;6309:6;6306:1;6303:13;6295:169;;;6370:13;;6358:26;;6439:15;;;;6404:12;;;;6331:1;6324:9;6295:169;;;-1:-1:-1;6481:3:15;;5858:632;-1:-1:-1;;;;;;5858:632:15:o;6495:254::-;6560:6;6568;6621:2;6609:9;6600:7;6596:23;6592:32;6589:52;;;6637:1;6634;6627:12;6589:52;6660:29;6679:9;6660:29;:::i;:::-;6650:39;;6708:35;6739:2;6728:9;6724:18;6708:35;:::i;:::-;6698:45;;6495:254;;;;;:::o;6754:667::-;6849:6;6857;6865;6873;6926:3;6914:9;6905:7;6901:23;6897:33;6894:53;;;6943:1;6940;6933:12;6894:53;6966:29;6985:9;6966:29;:::i;:::-;6956:39;;7014:38;7048:2;7037:9;7033:18;7014:38;:::i;:::-;7004:48;;7099:2;7088:9;7084:18;7071:32;7061:42;;7154:2;7143:9;7139:18;7126:32;7181:18;7173:6;7170:30;7167:50;;;7213:1;7210;7203:12;7167:50;7236:22;;7289:4;7281:13;;7277:27;-1:-1:-1;7267:55:15;;7318:1;7315;7308:12;7267:55;7341:74;7407:7;7402:2;7389:16;7384:2;7380;7376:11;7341:74;:::i;:::-;7331:84;;;6754:667;;;;;;;:::o;7426:803::-;7588:4;7617:2;7657;7646:9;7642:18;7687:2;7676:9;7669:21;7710:6;7745;7739:13;7776:6;7768;7761:22;7814:2;7803:9;7799:18;7792:25;;7876:2;7866:6;7863:1;7859:14;7848:9;7844:30;7840:39;7826:53;;7914:2;7906:6;7902:15;7935:1;7945:255;7959:6;7956:1;7953:13;7945:255;;;8052:2;8048:7;8036:9;8028:6;8024:22;8020:36;8015:3;8008:49;8080:40;8113:6;8104;8098:13;8080:40;:::i;:::-;8070:50;-1:-1:-1;8178:12:15;;;;8143:15;;;;7981:1;7974:9;7945:255;;;-1:-1:-1;8217:6:15;;7426:803;-1:-1:-1;;;;;;;7426:803:15:o;8234:260::-;8302:6;8310;8363:2;8351:9;8342:7;8338:23;8334:32;8331:52;;;8379:1;8376;8369:12;8331:52;8402:29;8421:9;8402:29;:::i;:::-;8392:39;;8450:38;8484:2;8473:9;8469:18;8450:38;:::i;8499:316::-;8576:6;8584;8592;8645:2;8633:9;8624:7;8620:23;8616:32;8613:52;;;8661:1;8658;8651:12;8613:52;-1:-1:-1;;8684:23:15;;;8754:2;8739:18;;8726:32;;-1:-1:-1;8805:2:15;8790:18;;;8777:32;;8499:316;-1:-1:-1;8499:316:15:o;8820:356::-;9022:2;9004:21;;;9041:18;;;9034:30;9100:34;9095:2;9080:18;;9073:62;9167:2;9152:18;;8820:356::o;9181:380::-;9260:1;9256:12;;;;9303;;;9324:61;;9378:4;9370:6;9366:17;9356:27;;9324:61;9431:2;9423:6;9420:14;9400:18;9397:38;9394:161;;;9477:10;9472:3;9468:20;9465:1;9458:31;9512:4;9509:1;9502:15;9540:4;9537:1;9530:15;9394:161;;9181:380;;;:::o;10806:127::-;10867:10;10862:3;10858:20;10855:1;10848:31;10898:4;10895:1;10888:15;10922:4;10919:1;10912:15;10938:127;10999:10;10994:3;10990:20;10987:1;10980:31;11030:4;11027:1;11020:15;11054:4;11051:1;11044:15;11070:135;11109:3;-1:-1:-1;;11130:17:15;;11127:43;;;11150:18;;:::i;:::-;-1:-1:-1;11197:1:15;11186:13;;11070:135::o;11210:413::-;11412:2;11394:21;;;11451:2;11431:18;;;11424:30;11490:34;11485:2;11470:18;;11463:62;-1:-1:-1;;;11556:2:15;11541:18;;11534:47;11613:3;11598:19;;11210:413::o;11628:168::-;11668:7;11734:1;11730;11726:6;11722:14;11719:1;11716:21;11711:1;11704:9;11697:17;11693:45;11690:71;;;11741:18;;:::i;:::-;-1:-1:-1;11781:9:15;;11628:168::o;11801:127::-;11862:10;11857:3;11853:20;11850:1;11843:31;11893:4;11890:1;11883:15;11917:4;11914:1;11907:15;11933:120;11973:1;11999;11989:35;;12004:18;;:::i;:::-;-1:-1:-1;12038:9:15;;11933:120::o;12058:276::-;12189:3;12227:6;12221:13;12243:53;12289:6;12284:3;12277:4;12269:6;12265:17;12243:53;:::i;:::-;12312:16;;;;;12058:276;-1:-1:-1;;12058:276:15:o;14111:973::-;14196:12;;14161:3;;14251:1;14271:18;;;;14324;;;;14351:61;;14405:4;14397:6;14393:17;14383:27;;14351:61;14431:2;14479;14471:6;14468:14;14448:18;14445:38;14442:161;;;14525:10;14520:3;14516:20;14513:1;14506:31;14560:4;14557:1;14550:15;14588:4;14585:1;14578:15;14442:161;14619:18;14646:104;;;;14764:1;14759:319;;;;14612:466;;14646:104;-1:-1:-1;;14679:24:15;;14667:37;;14724:16;;;;-1:-1:-1;14646:104:15;;14759:319;14058:1;14051:14;;;14095:4;14082:18;;14853:1;14867:165;14881:6;14878:1;14875:13;14867:165;;;14959:14;;14946:11;;;14939:35;15002:16;;;;14896:10;;14867:165;;;14871:3;;15061:6;15056:3;15052:16;15045:23;;14612:466;;;;;;;14111:973;;;;:::o;15089:197::-;15217:3;15242:38;15276:3;15268:6;15242:38;:::i;16883:128::-;16923:3;16954:1;16950:6;16947:1;16944:13;16941:39;;;16960:18;;:::i;:::-;-1:-1:-1;16996:9:15;;16883:128::o;18900:550::-;19124:3;19162:6;19156:13;19178:53;19224:6;19219:3;19212:4;19204:6;19200:17;19178:53;:::i;:::-;19294:13;;19253:16;;;;19316:57;19294:13;19253:16;19350:4;19338:17;;19316:57;:::i;:::-;19389:55;19434:8;19427:5;19423:20;19415:6;19389:55;:::i;:::-;19382:62;18900:550;-1:-1:-1;;;;;;;18900:550:15:o;20926:400::-;21128:2;21110:21;;;21167:2;21147:18;;;21140:30;21206:34;21201:2;21186:18;;21179:62;-1:-1:-1;;;21272:2:15;21257:18;;21250:34;21316:3;21301:19;;20926:400::o;22489:125::-;22529:4;22557:1;22554;22551:8;22548:34;;;22562:18;;:::i;:::-;-1:-1:-1;22599:9:15;;22489:125::o;25174:414::-;25376:2;25358:21;;;25415:2;25395:18;;;25388:30;25454:34;25449:2;25434:18;;25427:62;-1:-1:-1;;;25520:2:15;25505:18;;25498:48;25578:3;25563:19;;25174:414::o;25593:112::-;25625:1;25651;25641:35;;25656:18;;:::i;:::-;-1:-1:-1;25690:9:15;;25593:112::o;27092:489::-;-1:-1:-1;;;;;27361:15:15;;;27343:34;;27413:15;;27408:2;27393:18;;27386:43;27460:2;27445:18;;27438:34;;;27508:3;27503:2;27488:18;;27481:31;;;27286:4;;27529:46;;27555:19;;27547:6;27529:46;:::i;:::-;27521:54;27092:489;-1:-1:-1;;;;;;27092:489:15:o;27586:249::-;27655:6;27708:2;27696:9;27687:7;27683:23;27679:32;27676:52;;;27724:1;27721;27714:12;27676:52;27756:9;27750:16;27775:30;27799:5;27775:30;:::i;28190:127::-;28251:10;28246:3;28242:20;28239:1;28232:31;28282:4;28279:1;28272:15;28306:4;28303:1;28296:15

Swarm Source

ipfs://adc5d571a0031ee6885e3d505ecf566717ffffba5c99c1c58d1db8f0f7926cc8
Loading