ETH Price: $2,625.27 (+7.84%)
 

Overview

Max Total Supply

11,600,000 $GB

Holders

1,518

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 $GB

Value
$0.00
0xb0c336c4821199a3d15026131f3529f2d92ed21f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Grand

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : Grand.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.8.15;

// import "./openzeppelin-contracts/token/ERC20/ERC20.sol";
// import "./openzeppelin-contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

import "./interfaces/IRouter.sol";

contract Grand is ERC20, Ownable {

    IUniswapRouter public router;
    address public pair;

    uint256 constant _totalFullSupply = 50_000_000 * 1e18;
    
    uint256 constant _liquiditySupply         = _totalFullSupply * 10 / 100; // 10% =  5_000_000 * 1e18;
    uint256 public _stakingRewardSupply       = _totalFullSupply * 45 / 100; // 45% = 22_500_000 * 1e18;
    uint256 public _tradingIncentiveSupply    = _totalFullSupply * 20 / 100; // 20% = 10_000_000 * 1e18;
    uint256 public _marketingBudgetSupply     = _totalFullSupply * 10 / 100; // 10% =  5_000_000 * 1e18;
    uint256 public _privateSaleSupply         = _totalFullSupply * 8  / 100; // 8%  =  4_000_000 * 1e18;
    uint256 public _teamTokensSupply          = _totalFullSupply * 7  / 100; // 7%  =  3_500_000 * 1e18;

    uint256 public stakingRewardsMintedAt = 0;
    uint256 public tradingIncentiveMintedAt = 0;
    uint256 public marketingBudgetMintedAt = 0;
    uint256 public privateSaleMintedAt = 0;
    uint256 public teamTokensMintedAt = 0;

    // whitelist max buy amount in whitelist step
    uint256 constant _wlMaxBuyAmount = _liquiditySupply / 100; // 1% of liquidity = 50_000 * 1e18;

    uint256 public maxHoldingAmount =  _liquiditySupply / 50; // 2% of initial liquidity, 0.2% of total supply = 100_000 * 1e18
    
    bool private swapping;
    bool public swapEnabled;
    bool public tradingEnabled;
    
    bool public stakingLaunched;
    bool public tradingIncentiveLaunched;

    uint256 private launchTimestamp;

    address public treasuryWallet;

    uint256 public swapTokensAtAmount;
    uint256 public buyTax;
    uint256 public sellTax;
    uint256[] private taxTimestampSteps;
    uint256[] private buyTaxSteps;
    uint256[] private sellTaxSteps; 

    mapping(address => bool) public whitelisted;
    mapping(address => bool) public blacklisted;
    mapping(address => bool) public isExcludedFromFees;
    mapping(address => bool) private _isExcludedFromMaxWallet;
    mapping(address => bool) public automatedMarketMakerPairs;

    address[] public whitelist_users = [
        0x1A69284e302046AeB25017766A79f89A08e01261,
        0x5119757E2c791A6De4F3a5Bf38b9fDbfACbd1068,
        0xAFD644Cd6FaB74C9Ab9444c3E420029D4E6B717A,
        0x85d659fD40f0354A419947cb3baCCC1DDa938e61,
        0xDB1bA7c360a7c42A9C163A133906AC4B86891853,
        0x2c5d7333d81eB0eeC7f1ab437d0Bf18f371e06b9,
        0x4CB64dFa9985634BF5442DA1c421F8D493380dA3,
        0x366391f9C9a66AC4A2cf2a7E7788E6BeF80CDeCC,
        0x3F4373aFdde3D7dE3AC433AcC7De685338c3980e,
        0x220b522979B9F2Ca0F83663fcfF2ee2426aa449C,
        0x6fcDaa9e3ee14540EeA3cFC40Bea16bC61F1c2b8,
        0xEE08323d41cbA6C0b72f8d952da8d364bc1Ea71d,
        0x6e74205481C0A61650951a463b18EdD7BCb51e5a,
        0x10E3D80E50fd146175BCEA8D25C5be0085e2BE59,
        0xFdC4C32ac821eB7137f23aC55e3E10C7280eBf7d,
        0xc210204c50e78251689DabE7091Be4d2320F00AB,
        0x5A7a61FACE3C7Bf578098Ad80Fe7E7c471B4277C,
        0x9d156bc7c8768294510A4A41883d5A4EB15b15E3,
        0x5671B8dadc4B50e253B52330C558C9DA112C4886,
        0x42FeeC5c7e7D3c725864A2716CA357Fa9993CCC0,
        0x3185EF019BA1C04B8d65eDB64c1c34C3eaE52271,
        0x9c15078EbFcC032D00faCbB4fB9829b60C6e26b4,
        0xdbF66aCD1F816E44CeBA22b93cA245155D879392,
        0x5Baa197fFEd76a44E7F22fc6E050e7D99025D201,
        0xBC35D102F498B6ACDa7ceC5168Fb4B19D9255953,
        0x79D06301491f92AA60B58eEc3cfbB9ef2E0Ea4f6,
        0x9053137E530b881Fb47E9abdC881dE266F313a1F,
        0x0d3C00C1Da6d3f7791E7320A7130556eBDd46767,
        0x0A753312Aa7F500fbd8De099B15A2e2761757615,
        0x289213e63B7E827a19Bc48e6cb132f6D2dD89342,
        0x5fa85E6FEa19F73f92E665c1d4A0d20F0467d33E,
        0xDa4e25fC45e82dcDe872c8eaD40a6F012428E1EE,
        0x8Cfa8Dd7BD8a1316f145c52D842C09EaC212F642,
        0xb1F0801cf68aAC49789e4332690fb4B8b44Cde68,
        0x2719F75F3734475a0157e1257C12596B8Ac2D1E5,
        0xc7f91e6650Fe21791B1f8af864eD019B6853294E,
        0xa9C3eB1b8250Daddf039A010b67a089D8384f648,
        0xAB2ccE9850e7Dc9b86e9EBf465F86B06a4329766,
        0x44CDDD49C6098B77108336FC5f10A4CC9037d764,
        0xCA1bbb512759dE1bE41ab739151553AACFB5073C,
        0x5B8aCeDd3D078AA30703AdE6a1ca8caC944aD181,
        0x99F5D9E4B88403Fe3590481198396c910610203A,
        0xC15e8aE9BC6Bdea3bfdD16b3498c5C4Af9baC670,
        0xc746696E0f4488c81FC222d3547CCC0777eb860D,
        0x7978D693892F2A20F5DF40561F1E0C48b90e1D73,
        0x1fC593215253271e3077798D784311F6B95902E1,
        0x03150902655e881D873622020BABF8678183C7A6,
        0xE12A574dc83664784B0a3d4672bF9D6E55B5014e,
        0xbDFbe0F5858477CABec37784fdd0aB86e0E600d1,
        0xA59c43ceEF4c1981432c35921E9b3778Fce79faA
    ];

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    constructor(address _treasury) ERC20("Grand", "$GB") {

        swapEnabled = true;

        router = IUniswapRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        address _pair = IFactory(router.factory()).createPair(
            address(this),
            router.WETH()
        );
        pair = _pair;
        _setAutomatedMarketMakerPair(pair, true);
        setSwapTokensAtAmount(40000);

        treasuryWallet = _treasury;

        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);

        excludeFromMaxWallet(address(pair), true);
        excludeFromMaxWallet(address(this), true);
        excludeFromMaxWallet(address(router), true);
        excludeFromMaxWallet(owner(), true);

        taxTimestampSteps.push(30 minutes);
        taxTimestampSteps.push(15 minutes);
        taxTimestampSteps.push(15 minutes);

        buyTaxSteps.push(4000);
        buyTaxSteps.push(3000);
        buyTaxSteps.push(1500);

        sellTaxSteps.push(4000);
        sellTaxSteps.push(3000);
        sellTaxSteps.push(1500);

        buyTax = 500;
        sellTax = 500;

        for (uint i = 0; i < whitelist_users.length; i ++) {
            whitelisted[whitelist_users[i]] = true;
        }

        // initial = liquidity + 30% of marketing budget
        uint256 initialMintAmt = _liquiditySupply + _marketingBudgetSupply * 3 / 10;

        // reduce remained _marketingBudgetSupply
        _marketingBudgetSupply = _marketingBudgetSupply * 7 / 10;
        _mint(msg.sender, initialMintAmt); 
    }

    // only owner
    function setSwapEnabled(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
    }

    // only owner
    function enableTrading(bool _enable) external onlyOwner {
        require(tradingEnabled != _enable && launchTimestamp > 0, "Already Set");
        tradingEnabled = _enable;
    }
    
    // only owner
    function launch() external onlyOwner {
        launchTimestamp = block.timestamp;
        tradingEnabled = true;
    }

    // only owner
    /// @dev Set new pairs created due to listing in new DEX
    function setAutomatedMarketMakerPair(address newPair, bool value)
        external
        onlyOwner
    {
        _setAutomatedMarketMakerPair(newPair, value);
    }

    function _setAutomatedMarketMakerPair(address newPair, bool value) private {
        require(
            automatedMarketMakerPairs[newPair] != value,
            "Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[newPair] = value;

        emit SetAutomatedMarketMakerPair(newPair, value);
    }

    // only owner
    function setTreasuryWallet(address newWallet) public onlyOwner {
        treasuryWallet = newWallet;
    }
    // only owner
    function setSwapTokensAtAmount(uint256 amount) public onlyOwner {
        swapTokensAtAmount = amount * 10**18;
    }

    function updateMaxHoldingAmount(uint256 newNum) public onlyOwner {
        require(newNum >= 100000, "Cannot set maxHoldingAmount lower than 100k tokens");
        maxHoldingAmount = newNum * 10**18;
    }

    // only owner
    function setBuyTax(uint256 _tax) external onlyOwner {
        require(_tax <= 2000, "Fee must be <= 20%");
        buyTax = _tax;
    }
    // only owner
    function setSellTax(uint256 _tax) external onlyOwner {
        require(_tax <= 2000, "Fee must be <= 20%");
        sellTax = _tax;
    }
    // only owner
    function setTaxSteps(uint256[] calldata _timestamps, uint256[] calldata _buyTaxes, uint256[] calldata _sellTaxes) external onlyOwner {
        taxTimestampSteps = _timestamps;
        buyTaxSteps = _buyTaxes;
        sellTaxSteps = _sellTaxes;
    }
    // only owner
    function blacklist(address user, bool value) external onlyOwner {
        require(blacklisted[user] != value, "Already Set");
        blacklisted[user] = value;
    }
    // only owner
    function whitelist(address user, bool value) external onlyOwner {
        require(whitelisted[user] != value, "Already Set");
        whitelisted[user] = value;
    }
    // only owner
    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(
            isExcludedFromFees[account] != excluded,
            "Account is already the value of 'excluded'"
        );
        isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function excludeFromMaxWallet(address account, bool excluded)
        public
        onlyOwner
    {
        _isExcludedFromMaxWallet[account] = excluded;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        require(!blacklisted[from] && !blacklisted[to], "Blacklisted");

        if (
            !isExcludedFromFees[from] && !isExcludedFromFees[to] && !swapping
        ) {
            require(tradingEnabled, "Trading not active");
            if (!_isExcludedFromMaxWallet[to]) {
                require(
                    amount + balanceOf(to) <= maxHoldingAmount,
                    "Unable to exceed maxHoldingAmount"
                );
            }
        }

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount && contractTokenBalance > 0;

        if (
            canSwap &&
            !swapping &&
            swapEnabled &&
            automatedMarketMakerPairs[to] &&
            !isExcludedFromFees[from] &&
            !isExcludedFromFees[to]
        ) {
            swapping = true;

            if (sellTax > 0) {
                swapToTreasury(swapTokensAtAmount);
            }

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (isExcludedFromFees[from] || isExcludedFromFees[to]) {
            takeFee = false;
        }

        // if no swap
        if (!automatedMarketMakerPairs[to] && !automatedMarketMakerPairs[from])
            takeFee = false;
        else if (isFirstStepTrade()) {
            // if swap and first step, and if whitelisted user, then no fee
            // buy or sell
            if (whitelisted[to] || whitelisted[from]) {
                takeFee = false;
                // if wl is buying, then check balance
                if (whitelisted[to]) {
                    require(balanceOf(to) + amount <= _wlMaxBuyAmount, "Exceed max buy amount!");
                }
            }
        }

        if (takeFee) {
            uint256 feeAmt;
            if (automatedMarketMakerPairs[to])
                feeAmt = (amount * getSellTax()) / 10000;
            else if (automatedMarketMakerPairs[from])
                feeAmt = (amount * getBuyTax()) / 10000;

            amount = amount - feeAmt;
            super._transfer(from, address(this), feeAmt);
        }
        super._transfer(from, to, amount);
    }

    function swapToTreasury(uint256 tokens) private {
        swapTokensForETH(tokens);

        uint256 EthTaxBalance = address(this).balance;

        // Send ETH to treasury
        uint256 trAmt = EthTaxBalance;

        if (trAmt > 0) {
            (bool success, ) = payable(treasuryWallet).call{value: trAmt}("");
            require(success, "Failed to send ETH to treasury wallet");
        }
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        _approve(address(this), address(router), tokenAmount);

        // make the swap
        // router.swapExactTokensForETH(
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function isFirstStepTrade() internal view returns (bool) {
        uint256 curTick = block.timestamp;
        return curTick <= (launchTimestamp + taxTimestampSteps[0]);
    }

    function getSellTax() internal view returns (uint256) {
        uint256 curTick = block.timestamp;
        uint256 i;
        uint256 tick = launchTimestamp;
        for (i = 0; i < taxTimestampSteps.length; i ++) {
            if (curTick <= tick + taxTimestampSteps[i]) return sellTaxSteps[i];
            tick += taxTimestampSteps[i];
        }
        return sellTax;
    }

    function getBuyTax() internal view returns (uint256) {
        uint256 curTick = block.timestamp;
        uint256 i;
        uint256 tick = launchTimestamp;
        for (i = 0; i < taxTimestampSteps.length; i ++) {
            if (curTick <= tick + taxTimestampSteps[i]) return buyTaxSteps[i];
            tick += taxTimestampSteps[i];
        }
        return buyTax;
    }

    // only owner
    function mintMarketingBudget() external onlyOwner {
        require(launchTimestamp > 0, "token is not launched yet");
        require(_marketingBudgetSupply > 0, "no token to mint");

        uint256 curTick = block.timestamp;
        if (marketingBudgetMintedAt == 0) {
            marketingBudgetMintedAt = launchTimestamp;
        }
        if (marketingBudgetMintedAt + 7 days <= curTick) {
            uint256 mintAmount = _totalFullSupply * 1 / 100; // 10% of _marketingBudgetSupply
            // if mintAmount is bigger than _marketingBudgetSupply, then set it to _marketingBudgetSupply
            if (mintAmount > _marketingBudgetSupply) mintAmount = _marketingBudgetSupply;
            // reduce _marketingBudgetSupply by subtrating mintAmount
            _marketingBudgetSupply = _marketingBudgetSupply - mintAmount;

            _mint(msg.sender, mintAmount); 
            marketingBudgetMintedAt = marketingBudgetMintedAt + 7 days;
        }
    }

    // only owner
    function mintPrivateSale() external onlyOwner {
        require(launchTimestamp > 0, "token is not launched yet");
        require(_privateSaleSupply > 0, "no token to mint");

        uint256 curTick = block.timestamp;
        if (privateSaleMintedAt == 0) {
            // at first, 2 days after tge, mint 30%
            if (launchTimestamp + 2 days <= curTick) {
                uint256 mintAmount = (_totalFullSupply * 8 / 100) * 3 / 10; // 30% first
                _mint(msg.sender, mintAmount); 
                privateSaleMintedAt = launchTimestamp + 2 days;
                _privateSaleSupply = _privateSaleSupply - mintAmount;
            }
        } else {
            if (privateSaleMintedAt + 7 days <= curTick) {
                uint256 mintAmount = (_totalFullSupply * 8 / 100) / 10; // 10% of _privateSaleSupply
                // if mintAmount is bigger than _privateSaleSupply, then set it to _privateSaleSupply
                if (mintAmount > _privateSaleSupply) mintAmount = _privateSaleSupply;
                // reduce _privateSaleSupply by subtrating mintAmount
                _privateSaleSupply = _privateSaleSupply - mintAmount;

                _mint(msg.sender, mintAmount); 
                privateSaleMintedAt = privateSaleMintedAt + 7 days;
            }
        }
    }

    // only owner
    function mintTeamTokens() external onlyOwner {
        require(launchTimestamp > 0, "token is not launched yet");
        require(_teamTokensSupply > 0, "no token to mint");
        require(launchTimestamp + 30 days <= block.timestamp, "1 month should past");
        uint256 curTick = block.timestamp;

        if (teamTokensMintedAt == 0) {
            teamTokensMintedAt = launchTimestamp + 30 days;
        }
        if (teamTokensMintedAt + 7 days <= curTick) {
            uint256 mintAmount = (_totalFullSupply * 7 / 100) / 20; // 5% of _teamTokensSupply
            // if mintAmount is bigger than _teamTokensSupply, then set it to _teamTokensSupply
            if (mintAmount > _teamTokensSupply) mintAmount = _teamTokensSupply;
            // reduce _teamTokensSupply by subtrating mintAmount
            _teamTokensSupply = _teamTokensSupply - mintAmount;

            _mint(msg.sender, mintAmount); 
            teamTokensMintedAt = teamTokensMintedAt + 7 days;
        }
    }

    function launchStaking() external onlyOwner {
        stakingLaunched = true;
    }
    function launchTradingIncentive() external onlyOwner {
        tradingIncentiveLaunched = true;
    }

    // only owner
    function mintStakingRewards() external onlyOwner {
        require(launchTimestamp > 0, "token is not launched yet");
        require(_stakingRewardSupply > 0, "no token to mint");
        require(stakingLaunched, "staking is not launched yet");

        uint256 curTick = block.timestamp;
        if (stakingRewardsMintedAt == 0) {
            // at first, mint 30%
            uint256 mintAmount = (_totalFullSupply * 45 / 100) * 3 / 10; // 30% first
            _mint(msg.sender, mintAmount); 
            stakingRewardsMintedAt = curTick;
            _stakingRewardSupply = _stakingRewardSupply - mintAmount;
        } else {
            if (stakingRewardsMintedAt + 7 days <= curTick) {
                uint256 mintAmount = (_totalFullSupply * 45 / 100) / 10; // 10% of _stakingRewardSupply
                // if mintAmount is bigger than _stakingRewardSupply, then set it to _stakingRewardSupply
                if (mintAmount > _stakingRewardSupply) mintAmount = _stakingRewardSupply;
                // reduce _stakingRewardSupply by subtrating mintAmount
                _stakingRewardSupply = _stakingRewardSupply - mintAmount;

                _mint(msg.sender, mintAmount); 
                stakingRewardsMintedAt = stakingRewardsMintedAt + 7 days;
            }
        }
    }

    // only owner
    function mintTradingIncentive() external onlyOwner {
        require(launchTimestamp > 0, "token is not launched yet");
        require(_tradingIncentiveSupply > 0, "no token to mint");
        require(tradingIncentiveLaunched, "trading incentive is not launched yet");

        uint256 curTick = block.timestamp;
        if (tradingIncentiveMintedAt == 0) {
            // at first, mint 30%
            uint256 mintAmount = (_totalFullSupply * 20 / 100) * 3 / 10; // 30% first
            _mint(msg.sender, mintAmount); 
            tradingIncentiveMintedAt = curTick;
            _tradingIncentiveSupply = _tradingIncentiveSupply - mintAmount;
        } else {
            if (tradingIncentiveMintedAt + 7 days <= curTick) {
                uint256 mintAmount = (_totalFullSupply * 20 / 100) / 10; // 10% of _tradingIncentiveSupply
                // if mintAmount is bigger than _tradingIncentiveSupply, then set it to _tradingIncentiveSupply
                if (mintAmount > _tradingIncentiveSupply) mintAmount = _tradingIncentiveSupply;
                // reduce _tradingIncentiveSupply by subtrating mintAmount
                _tradingIncentiveSupply = _tradingIncentiveSupply - mintAmount;

                _mint(msg.sender, mintAmount); 
                tradingIncentiveMintedAt = tradingIncentiveMintedAt + 7 days;
            }
        }
    }

    receive() external payable {}
}

File 2 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 3 of 7 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens 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 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 4 of 7 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 5 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 6 of 7 : 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 7 of 7 : IRouter.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;

interface IPair {
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function token0() external view returns (address);
}

interface IFactory{
        function createPair(address tokenA, address tokenB) external returns (address pair);
        function getPair(address tokenA, address tokenB) external view returns (address pair);
}

interface IUniswapRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline) external;
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","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":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_marketingBudgetSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_privateSaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_stakingRewardSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_teamTokensSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tradingIncentiveSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchTradingIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingBudgetMintedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxHoldingAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMarketingBudget","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPrivateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStakingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintTeamTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintTradingIncentive","outputs":[],"stateMutability":"nonpayable","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":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSaleMintedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_timestamps","type":"uint256[]"},{"internalType":"uint256[]","name":"_buyTaxes","type":"uint256[]"},{"internalType":"uint256[]","name":"_sellTaxes","type":"uint256[]"}],"name":"setTaxSteps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingRewardsMintedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamTokensMintedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingIncentiveLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingIncentiveMintedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxHoldingAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelist_users","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526064602d6a295be96e6406697200000062000020919062001d8a565b6200002c919062001e1a565b600855606460146a295be96e640669720000006200004b919062001d8a565b62000057919062001e1a565b6009556064600a6a295be96e6406697200000062000076919062001d8a565b62000082919062001e1a565b600a55606460086a295be96e64066972000000620000a1919062001d8a565b620000ad919062001e1a565b600b55606460076a295be96e64066972000000620000cc919062001d8a565b620000d8919062001e1a565b600c556000600d556000600e556000600f556000601055600060115560326064600a6a295be96e6406697200000062000112919062001d8a565b6200011e919062001e1a565b6200012a919062001e1a565b601255604051806106400160405280731a69284e302046aeb25017766a79f89a08e0126173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735119757e2c791a6de4f3a5bf38b9fdbfacbd106873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173afd644cd6fab74c9ab9444c3e420029d4e6b717a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017385d659fd40f0354a419947cb3baccc1dda938e6173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173db1ba7c360a7c42a9c163a133906ac4b8689185373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001732c5d7333d81eb0eec7f1ab437d0bf18f371e06b973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001734cb64dfa9985634bf5442da1c421f8d493380da373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173366391f9c9a66ac4a2cf2a7e7788e6bef80cdecc73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001733f4373afdde3d7de3ac433acc7de685338c3980e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173220b522979b9f2ca0f83663fcff2ee2426aa449c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001736fcdaa9e3ee14540eea3cfc40bea16bc61f1c2b873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173ee08323d41cba6c0b72f8d952da8d364bc1ea71d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001736e74205481c0a61650951a463b18edd7bcb51e5a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017310e3d80e50fd146175bcea8d25c5be0085e2be5973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173fdc4c32ac821eb7137f23ac55e3e10c7280ebf7d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c210204c50e78251689dabe7091be4d2320f00ab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735a7a61face3c7bf578098ad80fe7e7c471b4277c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001739d156bc7c8768294510a4a41883d5a4eb15b15e373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735671b8dadc4b50e253b52330c558c9da112c488673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017342feec5c7e7d3c725864a2716ca357fa9993ccc073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001733185ef019ba1c04b8d65edb64c1c34c3eae5227173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001739c15078ebfcc032d00facbb4fb9829b60c6e26b473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173dbf66acd1f816e44ceba22b93ca245155d87939273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735baa197ffed76a44e7f22fc6e050e7d99025d20173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bc35d102f498b6acda7cec5168fb4b19d925595373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017379d06301491f92aa60b58eec3cfbb9ef2e0ea4f673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001739053137e530b881fb47e9abdc881de266f313a1f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001730d3c00c1da6d3f7791e7320a7130556ebdd4676773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001730a753312aa7f500fbd8de099b15a2e276175761573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173289213e63b7e827a19bc48e6cb132f6d2dd8934273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735fa85e6fea19f73f92e665c1d4a0d20f0467d33e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173da4e25fc45e82dcde872c8ead40a6f012428e1ee73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738cfa8dd7bd8a1316f145c52d842c09eac212f64273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173b1f0801cf68aac49789e4332690fb4b8b44cde6873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001732719f75f3734475a0157e1257c12596b8ac2d1e573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c7f91e6650fe21791b1f8af864ed019b6853294e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173a9c3eb1b8250daddf039a010b67a089d8384f64873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173ab2cce9850e7dc9b86e9ebf465f86b06a432976673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017344cddd49c6098b77108336fc5f10a4cc9037d76473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173ca1bbb512759de1be41ab739151553aacfb5073c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735b8acedd3d078aa30703ade6a1ca8cac944ad18173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017399f5d9e4b88403fe3590481198396c910610203a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c15e8ae9bc6bdea3bfdd16b3498c5c4af9bac67073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c746696e0f4488c81fc222d3547ccc0777eb860d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001737978d693892f2a20f5df40561f1e0c48b90e1d7373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001731fc593215253271e3077798d784311f6b95902e173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017303150902655e881d873622020babf8678183c7a673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173e12a574dc83664784b0a3d4672bf9d6e55b5014e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bdfbe0f5858477cabec37784fdd0ab86e0e600d173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173a59c43ceef4c1981432c35921e9b3778fce79faa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250602190603262000ef592919062001ca3565b5034801562000f0357600080fd5b50604051620076b2380380620076b2833981810160405281019062000f29919062001ebc565b6040518060400160405280600581526020017f4772616e640000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f2447420000000000000000000000000000000000000000000000000000000000815250816003908162000fa691906200215e565b50806004908162000fb891906200215e565b50505062000fdb62000fcf6200168360201b60201c565b6200168b60201b60201c565b6001601360016101000a81548160ff021916908315150217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620010bb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010e1919062001ebc565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200116b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001191919062001ebc565b6040518363ffffffff1660e01b8152600401620011b092919062002256565b6020604051808303816000875af1158015620011d0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011f6919062001ebc565b905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200126e600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016200175160201b60201c565b62001281619c406200188760201b60201c565b81601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620012e4620012d6620018b660201b60201c565b6001620018e060201b60201c565b620012f7306001620018e060201b60201c565b6200132c600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600162001a3060201b60201c565b6200133f30600162001a3060201b60201c565b62001374600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600162001a3060201b60201c565b6200139662001388620018b660201b60201c565b600162001a3060201b60201c565b601961070890806001815401808255809150506001900390600052602060002001600090919091909150556019610384908060018154018082558091505060019003906000526020600020016000909190919091505560196103849080600181540180825580915050600190039060005260206000200160009091909190915055601a610fa09080600181540180825580915050600190039060005260206000200160009091909190915055601a610bb89080600181540180825580915050600190039060005260206000200160009091909190915055601a6105dc9080600181540180825580915050600190039060005260206000200160009091909190915055601b610fa09080600181540180825580915050600190039060005260206000200160009091909190915055601b610bb89080600181540180825580915050600190039060005260206000200160009091909190915055601b6105dc90806001815401808255809150506001900390600052602060002001600090919091909150556101f46017819055506101f460188190555060005b602180549050811015620015eb576001601c60006021848154811062001559576200155862002283565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620015e290620022b2565b9150506200152e565b506000600a6003600a5462001601919062001d8a565b6200160d919062001e1a565b6064600a6a295be96e6406697200000062001629919062001d8a565b62001635919062001e1a565b620016419190620022ff565b9050600a6007600a5462001656919062001d8a565b62001662919062001e1a565b600a819055506200167a338262001a9b60201b60201c565b505050620025e9565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b801515602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503620017e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620017dd90620023e3565b60405180910390fd5b80602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6200189762001c0860201b60201c565b670de0b6b3a764000081620018ad919062001d8a565b60168190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620018f062001c0860201b60201c565b801515601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615150362001985576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200197c906200247b565b60405180910390fd5b80601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405162001a249190620024ba565b60405180910390a25050565b62001a4062001c0860201b60201c565b80601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362001b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001b049062002527565b60405180910390fd5b62001b216000838362001c9960201b60201c565b806002600082825462001b359190620022ff565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162001be891906200255a565b60405180910390a362001c046000838362001c9e60201b60201c565b5050565b62001c186200168360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662001c3e620018b660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462001c97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001c8e90620025c7565b60405180910390fd5b565b505050565b505050565b82805482825590600052602060002090810192821562001d1f579160200282015b8281111562001d1e5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062001cc4565b5b50905062001d2e919062001d32565b5090565b5b8082111562001d4d57600081600090555060010162001d33565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062001d978262001d51565b915062001da48362001d51565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562001de05762001ddf62001d5b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062001e278262001d51565b915062001e348362001d51565b92508262001e475762001e4662001deb565b5b828204905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062001e848262001e57565b9050919050565b62001e968162001e77565b811462001ea257600080fd5b50565b60008151905062001eb68162001e8b565b92915050565b60006020828403121562001ed55762001ed462001e52565b5b600062001ee58482850162001ea5565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062001f7057607f821691505b60208210810362001f865762001f8562001f28565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262001ff07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001fb1565b62001ffc868362001fb1565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200203f62002039620020338462001d51565b62002014565b62001d51565b9050919050565b6000819050919050565b6200205b836200201e565b620020736200206a8262002046565b84845462001fbe565b825550505050565b600090565b6200208a6200207b565b6200209781848462002050565b505050565b5b81811015620020bf57620020b360008262002080565b6001810190506200209d565b5050565b601f8211156200210e57620020d88162001f8c565b620020e38462001fa1565b81016020851015620020f3578190505b6200210b620021028562001fa1565b8301826200209c565b50505b505050565b600082821c905092915050565b6000620021336000198460080262002113565b1980831691505092915050565b60006200214e838362002120565b9150826002028217905092915050565b620021698262001eee565b67ffffffffffffffff81111562002185576200218462001ef9565b5b62002191825462001f57565b6200219e828285620020c3565b600060209050601f831160018114620021d65760008415620021c1578287015190505b620021cd858262002140565b8655506200223d565b601f198416620021e68662001f8c565b60005b828110156200221057848901518255600182019150602085019450602081019050620021e9565b868310156200223057848901516200222c601f89168262002120565b8355505b6001600288020188555050505b505050505050565b620022508162001e77565b82525050565b60006040820190506200226d600083018562002245565b6200227c602083018462002245565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620022bf8262001d51565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620022f457620022f362001d5b565b5b600182019050919050565b60006200230c8262001d51565b9150620023198362001d51565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562002351576200235062001d5b565b5b828201905092915050565b600082825260208201905092915050565b7f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160008201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b6000620023cb6038836200235c565b9150620023d8826200236d565b604082019050919050565b60006020820190508181036000830152620023fe81620023bc565b9050919050565b7f4163636f756e7420697320616c7265616479207468652076616c7565206f662060008201527f276578636c756465642700000000000000000000000000000000000000000000602082015250565b600062002463602a836200235c565b9150620024708262002405565b604082019050919050565b60006020820190508181036000830152620024968162002454565b9050919050565b60008115159050919050565b620024b4816200249d565b82525050565b6000602082019050620024d16000830184620024a9565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006200250f601f836200235c565b91506200251c82620024d7565b602082019050919050565b60006020820190508181036000830152620025428162002500565b9050919050565b620025548162001d51565b82525050565b600060208201905062002571600083018462002549565b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620025af6020836200235c565b9150620025bc8262002577565b602082019050919050565b60006020820190508181036000830152620025e281620025a0565b9050919050565b6150b980620025f96000396000f3fe6080604052600436106103a65760003560e01c80638ed938a7116101e7578063d7b1a5271161010d578063e5ff2e8a116100a0578063f2fde38b1161006f578063f2fde38b14610d3f578063f3fd05ae14610d68578063f59c370814610da5578063f887ea4014610dce576103ad565b8063e5ff2e8a14610ca9578063ede43ab214610cc0578063f16a45d114610ceb578063f275f64b14610d16576103ad565b8063dd62ed3e116100dc578063dd62ed3e14610bed578063e01af92c14610c2a578063e1af569814610c53578063e2f4560514610c7e576103ad565b8063d7b1a52714610b1f578063d936547e14610b4a578063dbac26e914610b87578063dc1052e214610bc4576103ad565b8063a9059cbb11610185578063c024666811610154578063c024666814610a77578063cc1776d314610aa0578063d17e9b1914610acb578063d2fcc00114610af6576103ad565b8063a9059cbb146109a9578063a9803cde146109e6578063afa4f3b214610a11578063b62496f514610a3a576103ad565b8063a30a2474116101c1578063a30a247414610901578063a457c2d714610918578063a8602fea14610955578063a8aa1b311461097e576103ad565b80638ed938a71461089657806395d89b41146108ad5780639a7a23d6146108d8576103ad565b80634fbee193116102cc578063715018a61161026a57806389f9a1d31161023957806389f9a1d3146107ec5780638cd09d50146108175780638da5cb5b146108405780638ec3c19d1461086b576103ad565b8063715018a61461076a578063730604681461078157806385ca915c146107aa57806388415f4d146107c1576103ad565b80635a6e5be1116102a65780635a6e5be1146106c05780636ddd1713146106eb5780636e55b0221461071657806370a082311461072d576103ad565b80634fbee1931461062f578063589936641461066c57806359bb6fb014610697576103ad565b80632754305811610344578063404e512911610313578063404e5129146105855780634626402b146105ae5780634ada218b146105d95780634f7041a514610604576103ad565b806327543058146104db578063313ce5671461050657806339509351146105315780633c062b301461056e576103ad565b806318160ddd1161038057806318160ddd146104315780631ecbb32a1461045c57806323b872dd1461048757806326bbf7ed146104c4576103ad565b806301339c21146103b257806306fdde03146103c9578063095ea7b3146103f4576103ad565b366103ad57005b600080fd5b3480156103be57600080fd5b506103c7610df9565b005b3480156103d557600080fd5b506103de610e25565b6040516103eb9190613adb565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613b9b565b610eb7565b6040516104289190613bf6565b60405180910390f35b34801561043d57600080fd5b50610446610eda565b6040516104539190613c20565b60405180910390f35b34801561046857600080fd5b50610471610ee4565b60405161047e9190613c20565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190613c3b565b610eea565b6040516104bb9190613bf6565b60405180910390f35b3480156104d057600080fd5b506104d9610f19565b005b3480156104e757600080fd5b506104f061110a565b6040516104fd9190613c20565b60405180910390f35b34801561051257600080fd5b5061051b611110565b6040516105289190613caa565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613b9b565b611119565b6040516105659190613bf6565b60405180910390f35b34801561057a57600080fd5b50610583611150565b005b34801561059157600080fd5b506105ac60048036038101906105a79190613cf1565b611341565b005b3480156105ba57600080fd5b506105c3611436565b6040516105d09190613d40565b60405180910390f35b3480156105e557600080fd5b506105ee61145c565b6040516105fb9190613bf6565b60405180910390f35b34801561061057600080fd5b5061061961146f565b6040516106269190613c20565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190613d5b565b611475565b6040516106639190613bf6565b60405180910390f35b34801561067857600080fd5b50610681611495565b60405161068e9190613c20565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190613ded565b61149b565b005b3480156106cc57600080fd5b506106d56114e1565b6040516106e29190613c20565b60405180910390f35b3480156106f757600080fd5b506107006114e7565b60405161070d9190613bf6565b60405180910390f35b34801561072257600080fd5b5061072b6114fa565b005b34801561073957600080fd5b50610754600480360381019061074f9190613d5b565b61162e565b6040516107619190613c20565b60405180910390f35b34801561077657600080fd5b5061077f611676565b005b34801561078d57600080fd5b506107a860048036038101906107a39190613ea1565b61168a565b005b3480156107b657600080fd5b506107bf6116f5565b005b3480156107cd57600080fd5b506107d661171a565b6040516107e39190613c20565b60405180910390f35b3480156107f857600080fd5b50610801611720565b60405161080e9190613c20565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190613ea1565b611726565b005b34801561084c57600080fd5b5061085561177d565b6040516108629190613d40565b60405180910390f35b34801561087757600080fd5b506108806117a7565b60405161088d9190613c20565b60405180910390f35b3480156108a257600080fd5b506108ab6117ad565b005b3480156108b957600080fd5b506108c2611977565b6040516108cf9190613adb565b60405180910390f35b3480156108e457600080fd5b506108ff60048036038101906108fa9190613cf1565b611a09565b005b34801561090d57600080fd5b50610916611a1f565b005b34801561092457600080fd5b5061093f600480360381019061093a9190613b9b565b611a44565b60405161094c9190613bf6565b60405180910390f35b34801561096157600080fd5b5061097c60048036038101906109779190613d5b565b611abb565b005b34801561098a57600080fd5b50610993611b07565b6040516109a09190613d40565b60405180910390f35b3480156109b557600080fd5b506109d060048036038101906109cb9190613b9b565b611b2d565b6040516109dd9190613bf6565b60405180910390f35b3480156109f257600080fd5b506109fb611b50565b604051610a089190613c20565b60405180910390f35b348015610a1d57600080fd5b50610a386004803603810190610a339190613ea1565b611b56565b005b348015610a4657600080fd5b50610a616004803603810190610a5c9190613d5b565b611b7b565b604051610a6e9190613bf6565b60405180910390f35b348015610a8357600080fd5b50610a9e6004803603810190610a999190613cf1565b611b9a565b005b348015610aac57600080fd5b50610ab5611cdd565b604051610ac29190613c20565b60405180910390f35b348015610ad757600080fd5b50610ae0611ce3565b604051610aed9190613bf6565b60405180910390f35b348015610b0257600080fd5b50610b1d6004803603810190610b189190613cf1565b611cf6565b005b348015610b2b57600080fd5b50610b34611d59565b604051610b419190613c20565b60405180910390f35b348015610b5657600080fd5b50610b716004803603810190610b6c9190613d5b565b611d5f565b604051610b7e9190613bf6565b60405180910390f35b348015610b9357600080fd5b50610bae6004803603810190610ba99190613d5b565b611d7f565b604051610bbb9190613bf6565b60405180910390f35b348015610bd057600080fd5b50610beb6004803603810190610be69190613ea1565b611d9f565b005b348015610bf957600080fd5b50610c146004803603810190610c0f9190613ece565b611df6565b604051610c219190613c20565b60405180910390f35b348015610c3657600080fd5b50610c516004803603810190610c4c9190613f0e565b611e7d565b005b348015610c5f57600080fd5b50610c68611ea2565b604051610c759190613bf6565b60405180910390f35b348015610c8a57600080fd5b50610c93611eb5565b604051610ca09190613c20565b60405180910390f35b348015610cb557600080fd5b50610cbe611ebb565b005b348015610ccc57600080fd5b50610cd561205c565b604051610ce29190613c20565b60405180910390f35b348015610cf757600080fd5b50610d00612062565b604051610d0d9190613c20565b60405180910390f35b348015610d2257600080fd5b50610d3d6004803603810190610d389190613f0e565b612068565b005b348015610d4b57600080fd5b50610d666004803603810190610d619190613d5b565b6120f1565b005b348015610d7457600080fd5b50610d8f6004803603810190610d8a9190613ea1565b612174565b604051610d9c9190613d40565b60405180910390f35b348015610db157600080fd5b50610dcc6004803603810190610dc79190613cf1565b6121b3565b005b348015610dda57600080fd5b50610de36122a8565b604051610df09190613f9a565b60405180910390f35b610e016122ce565b426014819055506001601360026101000a81548160ff021916908315150217905550565b606060038054610e3490613fe4565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6090613fe4565b8015610ead5780601f10610e8257610100808354040283529160200191610ead565b820191906000526020600020905b815481529060010190602001808311610e9057829003601f168201915b5050505050905090565b600080610ec261234c565b9050610ecf818585612354565b600191505092915050565b6000600254905090565b60115481565b600080610ef561234c565b9050610f0285828561251d565b610f0d8585856125a9565b60019150509392505050565b610f216122ce565b600060145411610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90614061565b60405180910390fd5b600060085411610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa2906140cd565b60405180910390fd5b601360039054906101000a900460ff16610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff190614139565b60405180910390fd5b60004290506000600d5403611074576000600a60036064602d6a295be96e640669720000006110299190614188565b6110339190614211565b61103d9190614188565b6110479190614211565b90506110533382612f11565b81600d81905550806008546110689190614242565b60088190555050611107565b8062093a80600d546110869190614276565b11611106576000600a6064602d6a295be96e640669720000006110a99190614188565b6110b39190614211565b6110bd9190614211565b90506008548111156110cf5760085490505b806008546110dd9190614242565b6008819055506110ed3382612f11565b62093a80600d546110fe9190614276565b600d81905550505b5b50565b60105481565b60006012905090565b60008061112461234c565b90506111458185856111368589611df6565b6111409190614276565b612354565b600191505092915050565b6111586122ce565b60006014541161119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490614061565b60405180910390fd5b6000600954116111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d9906140cd565b60405180910390fd5b601360049054906101000a900460ff16611231576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112289061433e565b60405180910390fd5b60004290506000600e54036112ab576000600a6003606460146a295be96e640669720000006112609190614188565b61126a9190614211565b6112749190614188565b61127e9190614211565b905061128a3382612f11565b81600e819055508060095461129f9190614242565b6009819055505061133e565b8062093a80600e546112bd9190614276565b1161133d576000600a606460146a295be96e640669720000006112e09190614188565b6112ea9190614211565b6112f49190614211565b90506009548111156113065760095490505b806009546113149190614242565b6009819055506113243382612f11565b62093a80600e546113359190614276565b600e81905550505b5b50565b6113496122ce565b801515601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d2906143aa565b60405180910390fd5b80601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360029054906101000a900460ff1681565b60175481565b601e6020528060005260406000206000915054906101000a900460ff1681565b600b5481565b6114a36122ce565b8585601991906114b49291906139d8565b508383601a91906114c69291906139d8565b508181601b91906114d89291906139d8565b50505050505050565b60085481565b601360019054906101000a900460ff1681565b6115026122ce565b600060145411611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153e90614061565b60405180910390fd5b6000600a541161158c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611583906140cd565b60405180910390fd5b60004290506000600f54036115a557601454600f819055505b8062093a80600f546115b79190614276565b1161162b576000606460016a295be96e640669720000006115d89190614188565b6115e29190614211565b9050600a548111156115f457600a5490505b80600a546116029190614242565b600a819055506116123382612f11565b62093a80600f546116239190614276565b600f81905550505b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61167e6122ce565b6116886000613067565b565b6116926122ce565b620186a08110156116d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cf9061443c565b60405180910390fd5b670de0b6b3a7640000816116ec9190614188565b60128190555050565b6116fd6122ce565b6001601360046101000a81548160ff021916908315150217905550565b600d5481565b60125481565b61172e6122ce565b6107d0811115611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a906144a8565b60405180910390fd5b8060188190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6117b56122ce565b6000601454116117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190614061565b60405180910390fd5b6000600b541161183f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611836906140cd565b60405180910390fd5b60004290506000601054036118e157806202a3006014546118609190614276565b116118dc576000600a6003606460086a295be96e640669720000006118859190614188565b61188f9190614211565b6118999190614188565b6118a39190614211565b90506118af3382612f11565b6202a3006014546118c09190614276565b60108190555080600b546118d49190614242565b600b81905550505b611974565b8062093a806010546118f39190614276565b11611973576000600a606460086a295be96e640669720000006119169190614188565b6119209190614211565b61192a9190614211565b9050600b5481111561193c57600b5490505b80600b5461194a9190614242565b600b8190555061195a3382612f11565b62093a8060105461196b9190614276565b601081905550505b5b50565b60606004805461198690613fe4565b80601f01602080910402602001604051908101604052809291908181526020018280546119b290613fe4565b80156119ff5780601f106119d4576101008083540402835291602001916119ff565b820191906000526020600020905b8154815290600101906020018083116119e257829003601f168201915b5050505050905090565b611a116122ce565b611a1b828261312d565b5050565b611a276122ce565b6001601360036101000a81548160ff021916908315150217905550565b600080611a4f61234c565b90506000611a5d8286611df6565b905083811015611aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a999061453a565b60405180910390fd5b611aaf8286868403612354565b60019250505092915050565b611ac36122ce565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080611b3861234c565b9050611b458185856125a9565b600191505092915050565b600c5481565b611b5e6122ce565b670de0b6b3a764000081611b729190614188565b60168190555050565b602080528060005260406000206000915054906101000a900460ff1681565b611ba26122ce565b801515601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503611c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2b906145cc565b60405180910390fd5b80601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611cd19190613bf6565b60405180910390a25050565b60185481565b601360049054906101000a900460ff1681565b611cfe6122ce565b80601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60095481565b601c6020528060005260406000206000915054906101000a900460ff1681565b601d6020528060005260406000206000915054906101000a900460ff1681565b611da76122ce565b6107d0811115611dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de3906144a8565b60405180910390fd5b8060178190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611e856122ce565b80601360016101000a81548160ff02191690831515021790555050565b601360039054906101000a900460ff1681565b60165481565b611ec36122ce565b600060145411611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90614061565b60405180910390fd5b6000600c5411611f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f44906140cd565b60405180910390fd5b4262278d00601454611f5f9190614276565b1115611fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9790614638565b60405180910390fd5b6000429050600060115403611fc75762278d00601454611fc09190614276565b6011819055505b8062093a80601154611fd99190614276565b116120595760006014606460076a295be96e64066972000000611ffc9190614188565b6120069190614211565b6120109190614211565b9050600c5481111561202257600c5490505b80600c546120309190614242565b600c819055506120403382612f11565b62093a806011546120519190614276565b601181905550505b50565b600f5481565b600a5481565b6120706122ce565b801515601360029054906101000a900460ff1615151415801561209557506000601454115b6120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cb906143aa565b60405180910390fd5b80601360026101000a81548160ff02191690831515021790555050565b6120f96122ce565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215f906146ca565b60405180910390fd5b61217181613067565b50565b6021818154811061218457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121bb6122ce565b801515601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615150361224d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612244906143aa565b60405180910390fd5b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122d661234c565b73ffffffffffffffffffffffffffffffffffffffff166122f461177d565b73ffffffffffffffffffffffffffffffffffffffff161461234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190614736565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ba906147c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124299061485a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125109190613c20565b60405180910390a3505050565b60006125298484611df6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125a35781811015612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258c906148c6565b60405180910390fd5b6125a28484848403612354565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260f90614958565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267e906149ea565b60405180910390fd5b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561272b5750601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b61276a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276190614a56565b60405180910390fd5b601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561280e5750601e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156128275750601360009054906101000a900460ff16155b1561292657601360029054906101000a900460ff1661287b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287290614ac2565b60405180910390fd5b601f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612925576012546128d88361162e565b826128e39190614276565b1115612924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291b90614b54565b60405180910390fd5b5b5b6000810361293f5761293a83836000613260565b612f0c565b600061294a3061162e565b9050600060165482101580156129605750600082115b905080801561297c5750601360009054906101000a900460ff16155b80156129945750601360019054906101000a900460ff165b80156129e95750602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015612a3f5750601e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612a955750601e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612ae8576001601360006101000a81548160ff02191690831515021790555060006018541115612acc57612acb6016546134d6565b5b6000601360006101000a81548160ff0219169083151502179055505b6000601360009054906101000a900460ff16159050601e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612b9e5750601e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612ba857600090505b602060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612c4c5750602060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612c5a5760009050612deb565b612c626135c7565b15612dea57601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d085750601c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612de95760009050601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612de857606480600a6a295be96e64066972000000612d7e9190614188565b612d889190614211565b612d929190614211565b84612d9c8761162e565b612da69190614276565b1115612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde90614bc0565b60405180910390fd5b5b5b5b5b8015612efd576000602060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612e6c57612710612e50613603565b86612e5b9190614188565b612e659190614211565b9050612ee2565b602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612ee157612710612ec96136c7565b86612ed49190614188565b612ede9190614211565b90505b5b8085612eee9190614242565b9450612efb873083613260565b505b612f08868686613260565b5050505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7790614c2c565b60405180910390fd5b612f8c6000838361378b565b8060026000828254612f9e9190614276565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161304f9190613c20565b60405180910390a361306360008383613790565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b801515602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036131bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b690614cbe565b60405180910390fd5b80602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036132cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c690614958565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361333e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613335906149ea565b60405180910390fd5b61334983838361378b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156133cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c690614d50565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516134bd9190613c20565b60405180910390a36134d0848484613790565b50505050565b6134df81613795565b6000479050600081905060008111156135c2576000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161353a90614da1565b60006040518083038185875af1925050503d8060008114613577576040519150601f19603f3d011682016040523d82523d6000602084013e61357c565b606091505b50509050806135c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b790614e28565b60405180910390fd5b505b505050565b60008042905060196000815481106135e2576135e1614e48565b5b90600052602060002001546014546135fa9190614276565b81111591505090565b6000804290506000806014549050600091505b6019805490508210156136bb576019828154811061363757613636614e48565b5b90600052602060002001548161364d9190614276565b831161367c57601b828154811061366757613666614e48565b5b906000526020600020015493505050506136c4565b601982815481106136905761368f614e48565b5b9060005260206000200154816136a69190614276565b905081806136b390614e77565b925050613616565b60185493505050505b90565b6000804290506000806014549050600091505b60198054905082101561377f57601982815481106136fb576136fa614e48565b5b9060005260206000200154816137119190614276565b831161374057601a828154811061372b5761372a614e48565b5b90600052602060002001549350505050613788565b6019828154811061375457613753614e48565b5b90600052602060002001548161376a9190614276565b9050818061377790614e77565b9250506136da565b60175493505050505b90565b505050565b505050565b6000600267ffffffffffffffff8111156137b2576137b1614ebf565b5b6040519080825280602002602001820160405280156137e05781602001602082028036833780820191505090505b50905030816000815181106137f8576137f7614e48565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561389f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138c39190614f03565b816001815181106138d7576138d6614e48565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061393e30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612354565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016139a2959493929190615029565b600060405180830381600087803b1580156139bc57600080fd5b505af11580156139d0573d6000803e3d6000fd5b505050505050565b828054828255906000526020600020908101928215613a14579160200282015b82811115613a135782358255916020019190600101906139f8565b5b509050613a219190613a25565b5090565b5b80821115613a3e576000816000905550600101613a26565b5090565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a7c578082015181840152602081019050613a61565b83811115613a8b576000848401525b50505050565b6000601f19601f8301169050919050565b6000613aad82613a42565b613ab78185613a4d565b9350613ac7818560208601613a5e565b613ad081613a91565b840191505092915050565b60006020820190508181036000830152613af58184613aa2565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b3282613b07565b9050919050565b613b4281613b27565b8114613b4d57600080fd5b50565b600081359050613b5f81613b39565b92915050565b6000819050919050565b613b7881613b65565b8114613b8357600080fd5b50565b600081359050613b9581613b6f565b92915050565b60008060408385031215613bb257613bb1613afd565b5b6000613bc085828601613b50565b9250506020613bd185828601613b86565b9150509250929050565b60008115159050919050565b613bf081613bdb565b82525050565b6000602082019050613c0b6000830184613be7565b92915050565b613c1a81613b65565b82525050565b6000602082019050613c356000830184613c11565b92915050565b600080600060608486031215613c5457613c53613afd565b5b6000613c6286828701613b50565b9350506020613c7386828701613b50565b9250506040613c8486828701613b86565b9150509250925092565b600060ff82169050919050565b613ca481613c8e565b82525050565b6000602082019050613cbf6000830184613c9b565b92915050565b613cce81613bdb565b8114613cd957600080fd5b50565b600081359050613ceb81613cc5565b92915050565b60008060408385031215613d0857613d07613afd565b5b6000613d1685828601613b50565b9250506020613d2785828601613cdc565b9150509250929050565b613d3a81613b27565b82525050565b6000602082019050613d556000830184613d31565b92915050565b600060208284031215613d7157613d70613afd565b5b6000613d7f84828501613b50565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613dad57613dac613d88565b5b8235905067ffffffffffffffff811115613dca57613dc9613d8d565b5b602083019150836020820283011115613de657613de5613d92565b5b9250929050565b60008060008060008060608789031215613e0a57613e09613afd565b5b600087013567ffffffffffffffff811115613e2857613e27613b02565b5b613e3489828a01613d97565b9650965050602087013567ffffffffffffffff811115613e5757613e56613b02565b5b613e6389828a01613d97565b9450945050604087013567ffffffffffffffff811115613e8657613e85613b02565b5b613e9289828a01613d97565b92509250509295509295509295565b600060208284031215613eb757613eb6613afd565b5b6000613ec584828501613b86565b91505092915050565b60008060408385031215613ee557613ee4613afd565b5b6000613ef385828601613b50565b9250506020613f0485828601613b50565b9150509250929050565b600060208284031215613f2457613f23613afd565b5b6000613f3284828501613cdc565b91505092915050565b6000819050919050565b6000613f60613f5b613f5684613b07565b613f3b565b613b07565b9050919050565b6000613f7282613f45565b9050919050565b6000613f8482613f67565b9050919050565b613f9481613f79565b82525050565b6000602082019050613faf6000830184613f8b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ffc57607f821691505b60208210810361400f5761400e613fb5565b5b50919050565b7f746f6b656e206973206e6f74206c61756e636865642079657400000000000000600082015250565b600061404b601983613a4d565b915061405682614015565b602082019050919050565b6000602082019050818103600083015261407a8161403e565b9050919050565b7f6e6f20746f6b656e20746f206d696e7400000000000000000000000000000000600082015250565b60006140b7601083613a4d565b91506140c282614081565b602082019050919050565b600060208201905081810360008301526140e6816140aa565b9050919050565b7f7374616b696e67206973206e6f74206c61756e63686564207965740000000000600082015250565b6000614123601b83613a4d565b915061412e826140ed565b602082019050919050565b6000602082019050818103600083015261415281614116565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061419382613b65565b915061419e83613b65565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141d7576141d6614159565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061421c82613b65565b915061422783613b65565b925082614237576142366141e2565b5b828204905092915050565b600061424d82613b65565b915061425883613b65565b92508282101561426b5761426a614159565b5b828203905092915050565b600061428182613b65565b915061428c83613b65565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142c1576142c0614159565b5b828201905092915050565b7f74726164696e6720696e63656e74697665206973206e6f74206c61756e63686560008201527f6420796574000000000000000000000000000000000000000000000000000000602082015250565b6000614328602583613a4d565b9150614333826142cc565b604082019050919050565b600060208201905081810360008301526143578161431b565b9050919050565b7f416c726561647920536574000000000000000000000000000000000000000000600082015250565b6000614394600b83613a4d565b915061439f8261435e565b602082019050919050565b600060208201905081810360008301526143c381614387565b9050919050565b7f43616e6e6f7420736574206d6178486f6c64696e67416d6f756e74206c6f776560008201527f72207468616e203130306b20746f6b656e730000000000000000000000000000602082015250565b6000614426603283613a4d565b9150614431826143ca565b604082019050919050565b6000602082019050818103600083015261445581614419565b9050919050565b7f466565206d757374206265203c3d203230250000000000000000000000000000600082015250565b6000614492601283613a4d565b915061449d8261445c565b602082019050919050565b600060208201905081810360008301526144c181614485565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614524602583613a4d565b915061452f826144c8565b604082019050919050565b6000602082019050818103600083015261455381614517565b9050919050565b7f4163636f756e7420697320616c7265616479207468652076616c7565206f662060008201527f276578636c756465642700000000000000000000000000000000000000000000602082015250565b60006145b6602a83613a4d565b91506145c18261455a565b604082019050919050565b600060208201905081810360008301526145e5816145a9565b9050919050565b7f31206d6f6e74682073686f756c64207061737400000000000000000000000000600082015250565b6000614622601383613a4d565b915061462d826145ec565b602082019050919050565b6000602082019050818103600083015261465181614615565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146b4602683613a4d565b91506146bf82614658565b604082019050919050565b600060208201905081810360008301526146e3816146a7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614720602083613a4d565b915061472b826146ea565b602082019050919050565b6000602082019050818103600083015261474f81614713565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006147b2602483613a4d565b91506147bd82614756565b604082019050919050565b600060208201905081810360008301526147e1816147a5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614844602283613a4d565b915061484f826147e8565b604082019050919050565b6000602082019050818103600083015261487381614837565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006148b0601d83613a4d565b91506148bb8261487a565b602082019050919050565b600060208201905081810360008301526148df816148a3565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614942602583613a4d565b915061494d826148e6565b604082019050919050565b6000602082019050818103600083015261497181614935565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006149d4602383613a4d565b91506149df82614978565b604082019050919050565b60006020820190508181036000830152614a03816149c7565b9050919050565b7f426c61636b6c6973746564000000000000000000000000000000000000000000600082015250565b6000614a40600b83613a4d565b9150614a4b82614a0a565b602082019050919050565b60006020820190508181036000830152614a6f81614a33565b9050919050565b7f54726164696e67206e6f74206163746976650000000000000000000000000000600082015250565b6000614aac601283613a4d565b9150614ab782614a76565b602082019050919050565b60006020820190508181036000830152614adb81614a9f565b9050919050565b7f556e61626c6520746f20657863656564206d6178486f6c64696e67416d6f756e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b3e602183613a4d565b9150614b4982614ae2565b604082019050919050565b60006020820190508181036000830152614b6d81614b31565b9050919050565b7f457863656564206d61782062757920616d6f756e742100000000000000000000600082015250565b6000614baa601683613a4d565b9150614bb582614b74565b602082019050919050565b60006020820190508181036000830152614bd981614b9d565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000614c16601f83613a4d565b9150614c2182614be0565b602082019050919050565b60006020820190508181036000830152614c4581614c09565b9050919050565b7f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160008201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b6000614ca8603883613a4d565b9150614cb382614c4c565b604082019050919050565b60006020820190508181036000830152614cd781614c9b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614d3a602683613a4d565b9150614d4582614cde565b604082019050919050565b60006020820190508181036000830152614d6981614d2d565b9050919050565b600081905092915050565b50565b6000614d8b600083614d70565b9150614d9682614d7b565b600082019050919050565b6000614dac82614d7e565b9150819050919050565b7f4661696c656420746f2073656e642045544820746f207472656173757279207760008201527f616c6c6574000000000000000000000000000000000000000000000000000000602082015250565b6000614e12602583613a4d565b9150614e1d82614db6565b604082019050919050565b60006020820190508181036000830152614e4181614e05565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e8282613b65565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614eb457614eb3614159565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050614efd81613b39565b92915050565b600060208284031215614f1957614f18613afd565b5b6000614f2784828501614eee565b91505092915050565b6000819050919050565b6000614f55614f50614f4b84614f30565b613f3b565b613b65565b9050919050565b614f6581614f3a565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614fa081613b27565b82525050565b6000614fb28383614f97565b60208301905092915050565b6000602082019050919050565b6000614fd682614f6b565b614fe08185614f76565b9350614feb83614f87565b8060005b8381101561501c5781516150038882614fa6565b975061500e83614fbe565b925050600181019050614fef565b5085935050505092915050565b600060a08201905061503e6000830188613c11565b61504b6020830187614f5c565b818103604083015261505d8186614fcb565b905061506c6060830185613d31565b6150796080830184613c11565b969550505050505056fea2646970667358221220d77c497273a150dfaaab1a3b97863137f31edb4301dafeb16f730c7c37137a6b64736f6c634300080f003300000000000000000000000048a2450ae9ed6b035b75f715f226ced05cda5a0a

Deployed Bytecode

0x6080604052600436106103a65760003560e01c80638ed938a7116101e7578063d7b1a5271161010d578063e5ff2e8a116100a0578063f2fde38b1161006f578063f2fde38b14610d3f578063f3fd05ae14610d68578063f59c370814610da5578063f887ea4014610dce576103ad565b8063e5ff2e8a14610ca9578063ede43ab214610cc0578063f16a45d114610ceb578063f275f64b14610d16576103ad565b8063dd62ed3e116100dc578063dd62ed3e14610bed578063e01af92c14610c2a578063e1af569814610c53578063e2f4560514610c7e576103ad565b8063d7b1a52714610b1f578063d936547e14610b4a578063dbac26e914610b87578063dc1052e214610bc4576103ad565b8063a9059cbb11610185578063c024666811610154578063c024666814610a77578063cc1776d314610aa0578063d17e9b1914610acb578063d2fcc00114610af6576103ad565b8063a9059cbb146109a9578063a9803cde146109e6578063afa4f3b214610a11578063b62496f514610a3a576103ad565b8063a30a2474116101c1578063a30a247414610901578063a457c2d714610918578063a8602fea14610955578063a8aa1b311461097e576103ad565b80638ed938a71461089657806395d89b41146108ad5780639a7a23d6146108d8576103ad565b80634fbee193116102cc578063715018a61161026a57806389f9a1d31161023957806389f9a1d3146107ec5780638cd09d50146108175780638da5cb5b146108405780638ec3c19d1461086b576103ad565b8063715018a61461076a578063730604681461078157806385ca915c146107aa57806388415f4d146107c1576103ad565b80635a6e5be1116102a65780635a6e5be1146106c05780636ddd1713146106eb5780636e55b0221461071657806370a082311461072d576103ad565b80634fbee1931461062f578063589936641461066c57806359bb6fb014610697576103ad565b80632754305811610344578063404e512911610313578063404e5129146105855780634626402b146105ae5780634ada218b146105d95780634f7041a514610604576103ad565b806327543058146104db578063313ce5671461050657806339509351146105315780633c062b301461056e576103ad565b806318160ddd1161038057806318160ddd146104315780631ecbb32a1461045c57806323b872dd1461048757806326bbf7ed146104c4576103ad565b806301339c21146103b257806306fdde03146103c9578063095ea7b3146103f4576103ad565b366103ad57005b600080fd5b3480156103be57600080fd5b506103c7610df9565b005b3480156103d557600080fd5b506103de610e25565b6040516103eb9190613adb565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613b9b565b610eb7565b6040516104289190613bf6565b60405180910390f35b34801561043d57600080fd5b50610446610eda565b6040516104539190613c20565b60405180910390f35b34801561046857600080fd5b50610471610ee4565b60405161047e9190613c20565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190613c3b565b610eea565b6040516104bb9190613bf6565b60405180910390f35b3480156104d057600080fd5b506104d9610f19565b005b3480156104e757600080fd5b506104f061110a565b6040516104fd9190613c20565b60405180910390f35b34801561051257600080fd5b5061051b611110565b6040516105289190613caa565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613b9b565b611119565b6040516105659190613bf6565b60405180910390f35b34801561057a57600080fd5b50610583611150565b005b34801561059157600080fd5b506105ac60048036038101906105a79190613cf1565b611341565b005b3480156105ba57600080fd5b506105c3611436565b6040516105d09190613d40565b60405180910390f35b3480156105e557600080fd5b506105ee61145c565b6040516105fb9190613bf6565b60405180910390f35b34801561061057600080fd5b5061061961146f565b6040516106269190613c20565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190613d5b565b611475565b6040516106639190613bf6565b60405180910390f35b34801561067857600080fd5b50610681611495565b60405161068e9190613c20565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190613ded565b61149b565b005b3480156106cc57600080fd5b506106d56114e1565b6040516106e29190613c20565b60405180910390f35b3480156106f757600080fd5b506107006114e7565b60405161070d9190613bf6565b60405180910390f35b34801561072257600080fd5b5061072b6114fa565b005b34801561073957600080fd5b50610754600480360381019061074f9190613d5b565b61162e565b6040516107619190613c20565b60405180910390f35b34801561077657600080fd5b5061077f611676565b005b34801561078d57600080fd5b506107a860048036038101906107a39190613ea1565b61168a565b005b3480156107b657600080fd5b506107bf6116f5565b005b3480156107cd57600080fd5b506107d661171a565b6040516107e39190613c20565b60405180910390f35b3480156107f857600080fd5b50610801611720565b60405161080e9190613c20565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190613ea1565b611726565b005b34801561084c57600080fd5b5061085561177d565b6040516108629190613d40565b60405180910390f35b34801561087757600080fd5b506108806117a7565b60405161088d9190613c20565b60405180910390f35b3480156108a257600080fd5b506108ab6117ad565b005b3480156108b957600080fd5b506108c2611977565b6040516108cf9190613adb565b60405180910390f35b3480156108e457600080fd5b506108ff60048036038101906108fa9190613cf1565b611a09565b005b34801561090d57600080fd5b50610916611a1f565b005b34801561092457600080fd5b5061093f600480360381019061093a9190613b9b565b611a44565b60405161094c9190613bf6565b60405180910390f35b34801561096157600080fd5b5061097c60048036038101906109779190613d5b565b611abb565b005b34801561098a57600080fd5b50610993611b07565b6040516109a09190613d40565b60405180910390f35b3480156109b557600080fd5b506109d060048036038101906109cb9190613b9b565b611b2d565b6040516109dd9190613bf6565b60405180910390f35b3480156109f257600080fd5b506109fb611b50565b604051610a089190613c20565b60405180910390f35b348015610a1d57600080fd5b50610a386004803603810190610a339190613ea1565b611b56565b005b348015610a4657600080fd5b50610a616004803603810190610a5c9190613d5b565b611b7b565b604051610a6e9190613bf6565b60405180910390f35b348015610a8357600080fd5b50610a9e6004803603810190610a999190613cf1565b611b9a565b005b348015610aac57600080fd5b50610ab5611cdd565b604051610ac29190613c20565b60405180910390f35b348015610ad757600080fd5b50610ae0611ce3565b604051610aed9190613bf6565b60405180910390f35b348015610b0257600080fd5b50610b1d6004803603810190610b189190613cf1565b611cf6565b005b348015610b2b57600080fd5b50610b34611d59565b604051610b419190613c20565b60405180910390f35b348015610b5657600080fd5b50610b716004803603810190610b6c9190613d5b565b611d5f565b604051610b7e9190613bf6565b60405180910390f35b348015610b9357600080fd5b50610bae6004803603810190610ba99190613d5b565b611d7f565b604051610bbb9190613bf6565b60405180910390f35b348015610bd057600080fd5b50610beb6004803603810190610be69190613ea1565b611d9f565b005b348015610bf957600080fd5b50610c146004803603810190610c0f9190613ece565b611df6565b604051610c219190613c20565b60405180910390f35b348015610c3657600080fd5b50610c516004803603810190610c4c9190613f0e565b611e7d565b005b348015610c5f57600080fd5b50610c68611ea2565b604051610c759190613bf6565b60405180910390f35b348015610c8a57600080fd5b50610c93611eb5565b604051610ca09190613c20565b60405180910390f35b348015610cb557600080fd5b50610cbe611ebb565b005b348015610ccc57600080fd5b50610cd561205c565b604051610ce29190613c20565b60405180910390f35b348015610cf757600080fd5b50610d00612062565b604051610d0d9190613c20565b60405180910390f35b348015610d2257600080fd5b50610d3d6004803603810190610d389190613f0e565b612068565b005b348015610d4b57600080fd5b50610d666004803603810190610d619190613d5b565b6120f1565b005b348015610d7457600080fd5b50610d8f6004803603810190610d8a9190613ea1565b612174565b604051610d9c9190613d40565b60405180910390f35b348015610db157600080fd5b50610dcc6004803603810190610dc79190613cf1565b6121b3565b005b348015610dda57600080fd5b50610de36122a8565b604051610df09190613f9a565b60405180910390f35b610e016122ce565b426014819055506001601360026101000a81548160ff021916908315150217905550565b606060038054610e3490613fe4565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6090613fe4565b8015610ead5780601f10610e8257610100808354040283529160200191610ead565b820191906000526020600020905b815481529060010190602001808311610e9057829003601f168201915b5050505050905090565b600080610ec261234c565b9050610ecf818585612354565b600191505092915050565b6000600254905090565b60115481565b600080610ef561234c565b9050610f0285828561251d565b610f0d8585856125a9565b60019150509392505050565b610f216122ce565b600060145411610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90614061565b60405180910390fd5b600060085411610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa2906140cd565b60405180910390fd5b601360039054906101000a900460ff16610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff190614139565b60405180910390fd5b60004290506000600d5403611074576000600a60036064602d6a295be96e640669720000006110299190614188565b6110339190614211565b61103d9190614188565b6110479190614211565b90506110533382612f11565b81600d81905550806008546110689190614242565b60088190555050611107565b8062093a80600d546110869190614276565b11611106576000600a6064602d6a295be96e640669720000006110a99190614188565b6110b39190614211565b6110bd9190614211565b90506008548111156110cf5760085490505b806008546110dd9190614242565b6008819055506110ed3382612f11565b62093a80600d546110fe9190614276565b600d81905550505b5b50565b60105481565b60006012905090565b60008061112461234c565b90506111458185856111368589611df6565b6111409190614276565b612354565b600191505092915050565b6111586122ce565b60006014541161119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490614061565b60405180910390fd5b6000600954116111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d9906140cd565b60405180910390fd5b601360049054906101000a900460ff16611231576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112289061433e565b60405180910390fd5b60004290506000600e54036112ab576000600a6003606460146a295be96e640669720000006112609190614188565b61126a9190614211565b6112749190614188565b61127e9190614211565b905061128a3382612f11565b81600e819055508060095461129f9190614242565b6009819055505061133e565b8062093a80600e546112bd9190614276565b1161133d576000600a606460146a295be96e640669720000006112e09190614188565b6112ea9190614211565b6112f49190614211565b90506009548111156113065760095490505b806009546113149190614242565b6009819055506113243382612f11565b62093a80600e546113359190614276565b600e81905550505b5b50565b6113496122ce565b801515601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d2906143aa565b60405180910390fd5b80601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360029054906101000a900460ff1681565b60175481565b601e6020528060005260406000206000915054906101000a900460ff1681565b600b5481565b6114a36122ce565b8585601991906114b49291906139d8565b508383601a91906114c69291906139d8565b508181601b91906114d89291906139d8565b50505050505050565b60085481565b601360019054906101000a900460ff1681565b6115026122ce565b600060145411611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153e90614061565b60405180910390fd5b6000600a541161158c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611583906140cd565b60405180910390fd5b60004290506000600f54036115a557601454600f819055505b8062093a80600f546115b79190614276565b1161162b576000606460016a295be96e640669720000006115d89190614188565b6115e29190614211565b9050600a548111156115f457600a5490505b80600a546116029190614242565b600a819055506116123382612f11565b62093a80600f546116239190614276565b600f81905550505b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61167e6122ce565b6116886000613067565b565b6116926122ce565b620186a08110156116d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cf9061443c565b60405180910390fd5b670de0b6b3a7640000816116ec9190614188565b60128190555050565b6116fd6122ce565b6001601360046101000a81548160ff021916908315150217905550565b600d5481565b60125481565b61172e6122ce565b6107d0811115611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a906144a8565b60405180910390fd5b8060188190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6117b56122ce565b6000601454116117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190614061565b60405180910390fd5b6000600b541161183f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611836906140cd565b60405180910390fd5b60004290506000601054036118e157806202a3006014546118609190614276565b116118dc576000600a6003606460086a295be96e640669720000006118859190614188565b61188f9190614211565b6118999190614188565b6118a39190614211565b90506118af3382612f11565b6202a3006014546118c09190614276565b60108190555080600b546118d49190614242565b600b81905550505b611974565b8062093a806010546118f39190614276565b11611973576000600a606460086a295be96e640669720000006119169190614188565b6119209190614211565b61192a9190614211565b9050600b5481111561193c57600b5490505b80600b5461194a9190614242565b600b8190555061195a3382612f11565b62093a8060105461196b9190614276565b601081905550505b5b50565b60606004805461198690613fe4565b80601f01602080910402602001604051908101604052809291908181526020018280546119b290613fe4565b80156119ff5780601f106119d4576101008083540402835291602001916119ff565b820191906000526020600020905b8154815290600101906020018083116119e257829003601f168201915b5050505050905090565b611a116122ce565b611a1b828261312d565b5050565b611a276122ce565b6001601360036101000a81548160ff021916908315150217905550565b600080611a4f61234c565b90506000611a5d8286611df6565b905083811015611aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a999061453a565b60405180910390fd5b611aaf8286868403612354565b60019250505092915050565b611ac36122ce565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080611b3861234c565b9050611b458185856125a9565b600191505092915050565b600c5481565b611b5e6122ce565b670de0b6b3a764000081611b729190614188565b60168190555050565b602080528060005260406000206000915054906101000a900460ff1681565b611ba26122ce565b801515601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503611c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2b906145cc565b60405180910390fd5b80601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611cd19190613bf6565b60405180910390a25050565b60185481565b601360049054906101000a900460ff1681565b611cfe6122ce565b80601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60095481565b601c6020528060005260406000206000915054906101000a900460ff1681565b601d6020528060005260406000206000915054906101000a900460ff1681565b611da76122ce565b6107d0811115611dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de3906144a8565b60405180910390fd5b8060178190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611e856122ce565b80601360016101000a81548160ff02191690831515021790555050565b601360039054906101000a900460ff1681565b60165481565b611ec36122ce565b600060145411611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90614061565b60405180910390fd5b6000600c5411611f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f44906140cd565b60405180910390fd5b4262278d00601454611f5f9190614276565b1115611fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9790614638565b60405180910390fd5b6000429050600060115403611fc75762278d00601454611fc09190614276565b6011819055505b8062093a80601154611fd99190614276565b116120595760006014606460076a295be96e64066972000000611ffc9190614188565b6120069190614211565b6120109190614211565b9050600c5481111561202257600c5490505b80600c546120309190614242565b600c819055506120403382612f11565b62093a806011546120519190614276565b601181905550505b50565b600f5481565b600a5481565b6120706122ce565b801515601360029054906101000a900460ff1615151415801561209557506000601454115b6120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cb906143aa565b60405180910390fd5b80601360026101000a81548160ff02191690831515021790555050565b6120f96122ce565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215f906146ca565b60405180910390fd5b61217181613067565b50565b6021818154811061218457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121bb6122ce565b801515601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615150361224d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612244906143aa565b60405180910390fd5b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122d661234c565b73ffffffffffffffffffffffffffffffffffffffff166122f461177d565b73ffffffffffffffffffffffffffffffffffffffff161461234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190614736565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ba906147c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124299061485a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125109190613c20565b60405180910390a3505050565b60006125298484611df6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125a35781811015612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258c906148c6565b60405180910390fd5b6125a28484848403612354565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260f90614958565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267e906149ea565b60405180910390fd5b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561272b5750601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b61276a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276190614a56565b60405180910390fd5b601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561280e5750601e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156128275750601360009054906101000a900460ff16155b1561292657601360029054906101000a900460ff1661287b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287290614ac2565b60405180910390fd5b601f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612925576012546128d88361162e565b826128e39190614276565b1115612924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291b90614b54565b60405180910390fd5b5b5b6000810361293f5761293a83836000613260565b612f0c565b600061294a3061162e565b9050600060165482101580156129605750600082115b905080801561297c5750601360009054906101000a900460ff16155b80156129945750601360019054906101000a900460ff165b80156129e95750602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015612a3f5750601e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612a955750601e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612ae8576001601360006101000a81548160ff02191690831515021790555060006018541115612acc57612acb6016546134d6565b5b6000601360006101000a81548160ff0219169083151502179055505b6000601360009054906101000a900460ff16159050601e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612b9e5750601e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612ba857600090505b602060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612c4c5750602060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612c5a5760009050612deb565b612c626135c7565b15612dea57601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d085750601c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612de95760009050601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612de857606480600a6a295be96e64066972000000612d7e9190614188565b612d889190614211565b612d929190614211565b84612d9c8761162e565b612da69190614276565b1115612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde90614bc0565b60405180910390fd5b5b5b5b5b8015612efd576000602060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612e6c57612710612e50613603565b86612e5b9190614188565b612e659190614211565b9050612ee2565b602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612ee157612710612ec96136c7565b86612ed49190614188565b612ede9190614211565b90505b5b8085612eee9190614242565b9450612efb873083613260565b505b612f08868686613260565b5050505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7790614c2c565b60405180910390fd5b612f8c6000838361378b565b8060026000828254612f9e9190614276565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161304f9190613c20565b60405180910390a361306360008383613790565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b801515602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036131bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b690614cbe565b60405180910390fd5b80602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036132cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c690614958565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361333e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613335906149ea565b60405180910390fd5b61334983838361378b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156133cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c690614d50565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516134bd9190613c20565b60405180910390a36134d0848484613790565b50505050565b6134df81613795565b6000479050600081905060008111156135c2576000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161353a90614da1565b60006040518083038185875af1925050503d8060008114613577576040519150601f19603f3d011682016040523d82523d6000602084013e61357c565b606091505b50509050806135c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b790614e28565b60405180910390fd5b505b505050565b60008042905060196000815481106135e2576135e1614e48565b5b90600052602060002001546014546135fa9190614276565b81111591505090565b6000804290506000806014549050600091505b6019805490508210156136bb576019828154811061363757613636614e48565b5b90600052602060002001548161364d9190614276565b831161367c57601b828154811061366757613666614e48565b5b906000526020600020015493505050506136c4565b601982815481106136905761368f614e48565b5b9060005260206000200154816136a69190614276565b905081806136b390614e77565b925050613616565b60185493505050505b90565b6000804290506000806014549050600091505b60198054905082101561377f57601982815481106136fb576136fa614e48565b5b9060005260206000200154816137119190614276565b831161374057601a828154811061372b5761372a614e48565b5b90600052602060002001549350505050613788565b6019828154811061375457613753614e48565b5b90600052602060002001548161376a9190614276565b9050818061377790614e77565b9250506136da565b60175493505050505b90565b505050565b505050565b6000600267ffffffffffffffff8111156137b2576137b1614ebf565b5b6040519080825280602002602001820160405280156137e05781602001602082028036833780820191505090505b50905030816000815181106137f8576137f7614e48565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561389f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138c39190614f03565b816001815181106138d7576138d6614e48565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061393e30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612354565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016139a2959493929190615029565b600060405180830381600087803b1580156139bc57600080fd5b505af11580156139d0573d6000803e3d6000fd5b505050505050565b828054828255906000526020600020908101928215613a14579160200282015b82811115613a135782358255916020019190600101906139f8565b5b509050613a219190613a25565b5090565b5b80821115613a3e576000816000905550600101613a26565b5090565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a7c578082015181840152602081019050613a61565b83811115613a8b576000848401525b50505050565b6000601f19601f8301169050919050565b6000613aad82613a42565b613ab78185613a4d565b9350613ac7818560208601613a5e565b613ad081613a91565b840191505092915050565b60006020820190508181036000830152613af58184613aa2565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b3282613b07565b9050919050565b613b4281613b27565b8114613b4d57600080fd5b50565b600081359050613b5f81613b39565b92915050565b6000819050919050565b613b7881613b65565b8114613b8357600080fd5b50565b600081359050613b9581613b6f565b92915050565b60008060408385031215613bb257613bb1613afd565b5b6000613bc085828601613b50565b9250506020613bd185828601613b86565b9150509250929050565b60008115159050919050565b613bf081613bdb565b82525050565b6000602082019050613c0b6000830184613be7565b92915050565b613c1a81613b65565b82525050565b6000602082019050613c356000830184613c11565b92915050565b600080600060608486031215613c5457613c53613afd565b5b6000613c6286828701613b50565b9350506020613c7386828701613b50565b9250506040613c8486828701613b86565b9150509250925092565b600060ff82169050919050565b613ca481613c8e565b82525050565b6000602082019050613cbf6000830184613c9b565b92915050565b613cce81613bdb565b8114613cd957600080fd5b50565b600081359050613ceb81613cc5565b92915050565b60008060408385031215613d0857613d07613afd565b5b6000613d1685828601613b50565b9250506020613d2785828601613cdc565b9150509250929050565b613d3a81613b27565b82525050565b6000602082019050613d556000830184613d31565b92915050565b600060208284031215613d7157613d70613afd565b5b6000613d7f84828501613b50565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613dad57613dac613d88565b5b8235905067ffffffffffffffff811115613dca57613dc9613d8d565b5b602083019150836020820283011115613de657613de5613d92565b5b9250929050565b60008060008060008060608789031215613e0a57613e09613afd565b5b600087013567ffffffffffffffff811115613e2857613e27613b02565b5b613e3489828a01613d97565b9650965050602087013567ffffffffffffffff811115613e5757613e56613b02565b5b613e6389828a01613d97565b9450945050604087013567ffffffffffffffff811115613e8657613e85613b02565b5b613e9289828a01613d97565b92509250509295509295509295565b600060208284031215613eb757613eb6613afd565b5b6000613ec584828501613b86565b91505092915050565b60008060408385031215613ee557613ee4613afd565b5b6000613ef385828601613b50565b9250506020613f0485828601613b50565b9150509250929050565b600060208284031215613f2457613f23613afd565b5b6000613f3284828501613cdc565b91505092915050565b6000819050919050565b6000613f60613f5b613f5684613b07565b613f3b565b613b07565b9050919050565b6000613f7282613f45565b9050919050565b6000613f8482613f67565b9050919050565b613f9481613f79565b82525050565b6000602082019050613faf6000830184613f8b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ffc57607f821691505b60208210810361400f5761400e613fb5565b5b50919050565b7f746f6b656e206973206e6f74206c61756e636865642079657400000000000000600082015250565b600061404b601983613a4d565b915061405682614015565b602082019050919050565b6000602082019050818103600083015261407a8161403e565b9050919050565b7f6e6f20746f6b656e20746f206d696e7400000000000000000000000000000000600082015250565b60006140b7601083613a4d565b91506140c282614081565b602082019050919050565b600060208201905081810360008301526140e6816140aa565b9050919050565b7f7374616b696e67206973206e6f74206c61756e63686564207965740000000000600082015250565b6000614123601b83613a4d565b915061412e826140ed565b602082019050919050565b6000602082019050818103600083015261415281614116565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061419382613b65565b915061419e83613b65565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141d7576141d6614159565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061421c82613b65565b915061422783613b65565b925082614237576142366141e2565b5b828204905092915050565b600061424d82613b65565b915061425883613b65565b92508282101561426b5761426a614159565b5b828203905092915050565b600061428182613b65565b915061428c83613b65565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142c1576142c0614159565b5b828201905092915050565b7f74726164696e6720696e63656e74697665206973206e6f74206c61756e63686560008201527f6420796574000000000000000000000000000000000000000000000000000000602082015250565b6000614328602583613a4d565b9150614333826142cc565b604082019050919050565b600060208201905081810360008301526143578161431b565b9050919050565b7f416c726561647920536574000000000000000000000000000000000000000000600082015250565b6000614394600b83613a4d565b915061439f8261435e565b602082019050919050565b600060208201905081810360008301526143c381614387565b9050919050565b7f43616e6e6f7420736574206d6178486f6c64696e67416d6f756e74206c6f776560008201527f72207468616e203130306b20746f6b656e730000000000000000000000000000602082015250565b6000614426603283613a4d565b9150614431826143ca565b604082019050919050565b6000602082019050818103600083015261445581614419565b9050919050565b7f466565206d757374206265203c3d203230250000000000000000000000000000600082015250565b6000614492601283613a4d565b915061449d8261445c565b602082019050919050565b600060208201905081810360008301526144c181614485565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614524602583613a4d565b915061452f826144c8565b604082019050919050565b6000602082019050818103600083015261455381614517565b9050919050565b7f4163636f756e7420697320616c7265616479207468652076616c7565206f662060008201527f276578636c756465642700000000000000000000000000000000000000000000602082015250565b60006145b6602a83613a4d565b91506145c18261455a565b604082019050919050565b600060208201905081810360008301526145e5816145a9565b9050919050565b7f31206d6f6e74682073686f756c64207061737400000000000000000000000000600082015250565b6000614622601383613a4d565b915061462d826145ec565b602082019050919050565b6000602082019050818103600083015261465181614615565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146b4602683613a4d565b91506146bf82614658565b604082019050919050565b600060208201905081810360008301526146e3816146a7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614720602083613a4d565b915061472b826146ea565b602082019050919050565b6000602082019050818103600083015261474f81614713565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006147b2602483613a4d565b91506147bd82614756565b604082019050919050565b600060208201905081810360008301526147e1816147a5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614844602283613a4d565b915061484f826147e8565b604082019050919050565b6000602082019050818103600083015261487381614837565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006148b0601d83613a4d565b91506148bb8261487a565b602082019050919050565b600060208201905081810360008301526148df816148a3565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614942602583613a4d565b915061494d826148e6565b604082019050919050565b6000602082019050818103600083015261497181614935565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006149d4602383613a4d565b91506149df82614978565b604082019050919050565b60006020820190508181036000830152614a03816149c7565b9050919050565b7f426c61636b6c6973746564000000000000000000000000000000000000000000600082015250565b6000614a40600b83613a4d565b9150614a4b82614a0a565b602082019050919050565b60006020820190508181036000830152614a6f81614a33565b9050919050565b7f54726164696e67206e6f74206163746976650000000000000000000000000000600082015250565b6000614aac601283613a4d565b9150614ab782614a76565b602082019050919050565b60006020820190508181036000830152614adb81614a9f565b9050919050565b7f556e61626c6520746f20657863656564206d6178486f6c64696e67416d6f756e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b3e602183613a4d565b9150614b4982614ae2565b604082019050919050565b60006020820190508181036000830152614b6d81614b31565b9050919050565b7f457863656564206d61782062757920616d6f756e742100000000000000000000600082015250565b6000614baa601683613a4d565b9150614bb582614b74565b602082019050919050565b60006020820190508181036000830152614bd981614b9d565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000614c16601f83613a4d565b9150614c2182614be0565b602082019050919050565b60006020820190508181036000830152614c4581614c09565b9050919050565b7f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160008201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b6000614ca8603883613a4d565b9150614cb382614c4c565b604082019050919050565b60006020820190508181036000830152614cd781614c9b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614d3a602683613a4d565b9150614d4582614cde565b604082019050919050565b60006020820190508181036000830152614d6981614d2d565b9050919050565b600081905092915050565b50565b6000614d8b600083614d70565b9150614d9682614d7b565b600082019050919050565b6000614dac82614d7e565b9150819050919050565b7f4661696c656420746f2073656e642045544820746f207472656173757279207760008201527f616c6c6574000000000000000000000000000000000000000000000000000000602082015250565b6000614e12602583613a4d565b9150614e1d82614db6565b604082019050919050565b60006020820190508181036000830152614e4181614e05565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e8282613b65565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614eb457614eb3614159565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050614efd81613b39565b92915050565b600060208284031215614f1957614f18613afd565b5b6000614f2784828501614eee565b91505092915050565b6000819050919050565b6000614f55614f50614f4b84614f30565b613f3b565b613b65565b9050919050565b614f6581614f3a565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614fa081613b27565b82525050565b6000614fb28383614f97565b60208301905092915050565b6000602082019050919050565b6000614fd682614f6b565b614fe08185614f76565b9350614feb83614f87565b8060005b8381101561501c5781516150038882614fa6565b975061500e83614fbe565b925050600181019050614fef565b5085935050505092915050565b600060a08201905061503e6000830188613c11565b61504b6020830187614f5c565b818103604083015261505d8186614fcb565b905061506c6060830185613d31565b6150796080830184613c11565b969550505050505056fea2646970667358221220d77c497273a150dfaaab1a3b97863137f31edb4301dafeb16f730c7c37137a6b64736f6c634300080f0033

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

00000000000000000000000048a2450ae9ed6b035b75f715f226ced05cda5a0a

-----Decoded View---------------
Arg [0] : _treasury (address): 0x48a2450ae9eD6b035b75f715f226CEd05CdA5A0A

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000048a2450ae9ed6b035b75f715f226ced05cda5a0a


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.