Token Phenix Finance

Overview CRC20

Price
$0.00 @ 0.000000 CRO
Fully Diluted Market Cap
Total Supply:
11,761,851.846984 PHNX

Holders:
1,583 addresses
Contract:
0x91381ced862941af90995bc48336643a37cda5800x91381CED862941aF90995bC48336643a37CDA580

Decimals:
18

Social Profiles:
Not Available, Update ?

Balance
6,500.101474702770228043 PHNX

Value
$0.00
0xd744153e8e55196913f72ccb1e92e8772f17c653
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
PhenixFinance

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2023-11-19
*/

// File: contracts/InterfaceLP.sol

pragma solidity ^0.7.4;


interface InterfaceLP {
    function sync() external;
}

// File: contracts/SafeMathInt.sol

pragma solidity ^0.7.4;


library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != -1 || a != MIN_INT256);

        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }
}

// File: contracts/SafeMath.sol

pragma solidity ^0.7.4;


library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

// File: contracts/Ownable.sol

pragma solidity ^0.7.4;


contract Ownable {
    address private _owner;

    event OwnershipRenounced(address indexed previousOwner);

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

    constructor() {
        _owner = msg.sender;
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipRenounced(_owner);
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/IVVSRouter01.sol

pragma solidity ^0.7.4;


interface IVVSRouter01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

// File: contracts/IVVSRouter.sol

pragma solidity ^0.7.4;



interface IVVSRouter is IVVSRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

// File: contracts/IVVSFactory.sol

pragma solidity ^0.7.4;


interface IVVSFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

// File: contracts/IERC20.sol

pragma solidity ^0.7.4;


interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

// File: contracts/ERC20Detailed.sol

pragma solidity ^0.7.4;



abstract contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor(
        string memory name,
        string memory symbol,
        uint8 decimals
    ) {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

// File: contracts/PhenixFinance.sol

pragma solidity ^0.7.4;










contract PhenixFinance is ERC20Detailed, Ownable {
    using SafeMath for uint256;
    using SafeMathInt for int256;

    event Rebase(uint256 indexed totalSupply);

    address[] public pairAddresses;
    address public liquidityReceiver;
    address public phenixFundReserveReceiver;
    bool public initialDistributionFinished;

    mapping(address => bool) _allowTransfer;
    mapping(address => bool) _isFeeExempt;

    uint256 private constant FXP_BASE = 1000000;
    uint256 private constant DECIMALS = 18;
    uint256 private constant MAX_UINT256 = ~uint256(0);
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address private constant ZERO = 0x0000000000000000000000000000000000000000;
    uint256 private constant REBASE_INTERVAL = 86400;
    uint256 private constant INITIAL_FRAGMENTS_SUPPLY =
        1 * 10**6 * 10**DECIMALS;

    uint256 public liquidityFee = 0;
    uint256 public phenixVaultFee = 10;
    uint256 public sellFee = 5;
    uint256 public totalFee = liquidityFee.add(phenixVaultFee);
    uint256 public feeDenominator = 100;

    uint256 public lastRebaseTimestamp = block.timestamp;
    uint256 public lastRebaseDelta = 0;
    uint256 public rebasePercentDelta = (18 * FXP_BASE) / 1000;

    bool public rebaseRX3Enabled = false;
    uint256 public rebaseRX3Multiplier = FXP_BASE;
    uint256 public rebaseMaxRX3Multiplier = FXP_BASE + FXP_BASE / 2;
    uint256 public rebaseRX3MultiplierStep = (1 * FXP_BASE) / 1000;

    IVVSRouter public router;
    bool public swapEnabled = true;
    uint256 private gonSwapThreshold = (TOTAL_GONS * 10) / 10000;
    bool inSwap;

    uint256 private constant TOTAL_GONS =
        MAX_UINT256 - (MAX_UINT256 % INITIAL_FRAGMENTS_SUPPLY);
    uint256 private constant MAX_SUPPLY = ~uint128(0);
    uint256 private _totalSupply;
    uint256 private _gonsPerFragment;
    mapping(address => uint256) private _gonBalances;
    mapping(address => mapping(address => uint256)) private _allowedFragments;
    mapping(address => bool) public taxableAddress;
    mapping(address => bool) public authorizedRebaseAddress;

    constructor() ERC20Detailed("Phenix Finance", "PHNX", uint8(DECIMALS)) {
        router = IVVSRouter(0x145677FC4d9b8F19B5D56d1820c48e0443049a30);
        
        address _pairAddress = address(
            IVVSFactory(router.factory()).createPair(
                router.WETH(),
                address(this)
            )
        );

        liquidityReceiver = address(msg.sender);
        phenixFundReserveReceiver = address(msg.sender);

        _allowedFragments[address(this)][address(router)] = uint256(-1);

        _totalSupply = INITIAL_FRAGMENTS_SUPPLY;
        _gonBalances[address(msg.sender)] = TOTAL_GONS;
        _gonsPerFragment = TOTAL_GONS.div(_totalSupply);

        _isFeeExempt[address(phenixFundReserveReceiver)] = true;
        _isFeeExempt[address(this)] = true;
        _isFeeExempt[address(msg.sender)] = true;

        taxableAddress[_pairAddress] = true;
        pairAddresses.push(_pairAddress);
        authorizedRebaseAddress[address(msg.sender)] = true;

        emit Transfer(address(0x0), address(msg.sender), _totalSupply);
    }

    /**
     * @dev Swapping switch used to mitigate any calculation
     * issues during swapBack.
     */
    modifier noReentrancy() {
        inSwap = true;
        _;
        inSwap = false;
    }

    modifier initialDistributionLock() {
        require(
            initialDistributionFinished ||
                isOwner() ||
                _allowTransfer[msg.sender],
            "Initial distirbution not finalized."
        );
        _;
    }

    modifier validRecipient(address to) {
        require(to != address(0x0));
        _;
    }

    /**
     * @dev Returns the delta of the next rebase.
     * @return next rebase delta as uint256 value.
     */
    function getNextRebase(uint256 _timestamp) public view returns (uint256) {
        uint256 rebaseTimestampDelta = _timestamp - lastRebaseTimestamp;

        uint256 nextScaledRebaseIntervalPercentage = rebaseTimestampDelta
            .mul(FXP_BASE)
            .div(REBASE_INTERVAL);

        uint256 nextRebaseDelta = _totalSupply
            .mul(rebasePercentDelta)
            .div(FXP_BASE)
            .mul(nextScaledRebaseIntervalPercentage)
            .div(FXP_BASE);

        if (rebaseRX3Enabled == true) {
            nextRebaseDelta = nextRebaseDelta
                .mul(
                    rebaseRX3Multiplier < rebaseMaxRX3Multiplier
                        ? rebaseRX3Multiplier
                        : rebaseMaxRX3Multiplier
                )
                .div(FXP_BASE);
        }

        return nextRebaseDelta;
    }

    /**
     * @dev Rebases total token supply based on the getNextRebase()
     * return result. Rebase is capped when MAX_SUPPLY is reached.
     */
    function _rebase() internal {
        uint256 supplyDelta = getNextRebase(block.timestamp);
        _totalSupply = _totalSupply.add(uint256(supplyDelta));

        if (_totalSupply > MAX_SUPPLY) {
            _totalSupply = MAX_SUPPLY;
        }

        _gonsPerFragment = TOTAL_GONS.div(_totalSupply);

        lastRebaseDelta = supplyDelta;
        lastRebaseTimestamp = block.timestamp;
        rebaseRX3Multiplier = FXP_BASE;

        emit Rebase(_totalSupply);
    }

    /**
     * @dev Executes the internal _rebase() function and then
     * performs the sync() call on all applicable pairAddresses
     */
    function rebaseAndSync() external {
        require(
            authorizedRebaseAddress[msg.sender] == true,
            "Not authroized to execute rebase"
        );

        _rebase();

        for (uint256 i = 0; i < pairAddresses.length; i++) {
            if (taxableAddress[pairAddresses[i]] == true) {
                InterfaceLP(pairAddresses[i]).sync();
            }
        }
    }

    /**
     * @dev Sets the last rebase time to the current block
     * timestamp as means to reset the value.
     */
    function resetLastRebaseTimestamp() external {
        require(
            authorizedRebaseAddress[msg.sender] == true,
            "Not authroized to execute this function."
        );

        lastRebaseTimestamp = block.timestamp;
    }

    /**
     * @dev Returns total token supply. Overrides ERC-20
     * totalSupply() function to return elastic supply.
     */
    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev Transfers amount tokens to an address.
     * @param to Receiver of the transfered tokens.
     * @param value Amount of tokens that are received.
     * @return true
     */
    function transfer(address to, uint256 value)
        external
        override
        validRecipient(to)
        initialDistributionLock
        returns (bool)
    {
        _transferFrom(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Adds LP contract address and removes
     * fees from the given address. Added pair contract tested
     * sync() before adding to see if it is a pair address.
     * Addition will fail if sync() fails.
     * @param _address Update LP contract address.
     */
    function addLPAddress(address _address) external onlyOwner {
        InterfaceLP(_address).sync();

        for (uint256 i = 0; i < pairAddresses.length; i++) {
            require(pairAddresses[i] != _address, "Pair address already added");
        }

        pairAddresses.push(_address);
        taxableAddress[_address] = true;
    }

    /**
     * @dev Returns array of all LP Addresses
     * @return address[] Array of LP Addresses.
     **/
    function getLPAddresses() external view returns (address[] memory) {
        return pairAddresses;
    }

    /**
     * @dev Updates given address' taxable status.
     * @param _address Subject address of taxable state adjustment.
     * @param _status State if address should be taxed.
     */
    function setTaxableAddress(address _address, bool _status)
        external
        onlyOwner
    {
        taxableAddress[_address] = _status;
    }

    /**
     * @dev Updates given address' Authorized Rebase status.
     * @param _address Subject address of Authorized Rebase state adjustment.
     * @param _status State if address should be allowed call rebaseAndSync().
     */
    function setAuthorizedRebaseAddress(address _address, bool _status)
        external
        onlyOwner
    {
        authorizedRebaseAddress[_address] = _status;
    }

    /**
     * @dev Returns spender alloance of an owner address.
     * Overides ERC-20 allowance(address, address) function
     * to return allowed fragments.
     * @param owner Owner address of tokens.
     * @param spender Spender address of tokens.
     * @return uint256 Amount of allowed tokens for the spender to use.
     */
    function allowance(address owner, address spender)
        external
        view
        override
        returns (uint256)
    {
        return _allowedFragments[owner][spender];
    }

    /**
     * @dev Returns balance of given address. Overrides
     * ERC-20 balanceOf(address) to provide balance based
     * on holder gons and gonsPerFragment.
     * @param who Balance of address.
     * @return uint256 value of address balance.
     */
    function balanceOf(address who) external view override returns (uint256) {
        return _gonBalances[who].div(_gonsPerFragment);
    }

    /**
     * @dev Performs basic token transfer. Used as
     * internal function in _transferFrom(address,
     * address, uint256) function.
     * @param from sender address of transfer.
     * @param to receiver adddress of transfer.
     * @param amount amount of tokens for receiver.
     * @return true.
     */
    function _basicTransfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        uint256 gonAmount = amount.mul(_gonsPerFragment);
        _gonBalances[from] = _gonBalances[from].sub(gonAmount);
        _gonBalances[to] = _gonBalances[to].add(gonAmount);
        return true;
    }

    /**
     * @dev Transfers token from sender address
     * to receiver address. Performs token supply
     * rebase provided it is acceptable. Executes
     * _baseTransfer(address, address, uint256) if
     * swap is in progress.
     * @param sender sender address of transfer.
     * @param to receiver adddress of transfer.
     * @param amount amount of tokens for receiver.
     * @return true.
     */
    function _transferFrom(
        address sender,
        address to,
        uint256 amount
    ) internal returns (bool) {
        if (inSwap) {
            return _basicTransfer(sender, to, amount);
        }

        uint256 gonAmount = amount.mul(_gonsPerFragment);

        if (_shouldSwapBack()) {
            _swapBack();
        }

        if (rebaseRX3Enabled == true) {
            rebaseRX3Multiplier = rebaseRX3Multiplier.add(
                rebaseRX3MultiplierStep
            );
        }

        _gonBalances[sender] = _gonBalances[sender].sub(gonAmount);

        uint256 gonAmountReceived = _shouldTakeFee(sender, to)
            ? _takeFee(sender, to, gonAmount)
            : gonAmount;
        _gonBalances[to] = _gonBalances[to].add(gonAmountReceived);

        emit Transfer(sender, to, gonAmountReceived.div(_gonsPerFragment));

        return true;
    }

    /**
     * @dev Transfers token from sender address
     * to receiver address. Overrides ERC-20
     * transferFrom(address, address, uint256) to
     * check value of allowed fragments that sender
     * can access from the owner (from address).
     * @param from sender address of transfer.
     * @param to receiver adddress of transfer.
     * @param value amount of tokens for receiver.
     * @return true.
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external override validRecipient(to) returns (bool) {
        if (_allowedFragments[from][msg.sender] != uint256(-1)) {
            _allowedFragments[from][msg.sender] = _allowedFragments[from][
                msg.sender
            ].sub(value, "Insufficient Allowance");
        }

        _transferFrom(from, to, value);
        return true;
    }

    /**
     * @dev Executes fee allocations and distributes tokens
     * to contract address, phenix vault receiver address, and
     * liquidity receiver address.
     */
    function _swapBack() internal noReentrancy {
        uint256 contractTokenBalance = _gonBalances[address(this)].div(
            _gonsPerFragment
        );
        uint256 amountToLiquify = contractTokenBalance
            .mul(liquidityFee)
            .div(totalFee)
            .div(2);
        uint256 amountToSwap = contractTokenBalance.sub(amountToLiquify);

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        uint256 balanceBefore = address(this).balance;

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amountETH = address(this).balance.sub(balanceBefore);
        uint256 totalETHFee = totalFee.sub(liquidityFee.div(2));

        uint256 amountETHLiquidity = amountETH
            .mul(liquidityFee)
            .div(totalETHFee)
            .div(2);

        if (amountToLiquify > 0) {
            router.addLiquidityETH{value: amountETHLiquidity}(
                address(this),
                amountToLiquify,
                0,
                0,
                liquidityReceiver,
                block.timestamp
            );
        }

        (bool success, ) = payable(phenixFundReserveReceiver).call{
            value: address(this).balance
        }("");
    }

    /**
     * @dev Calculates swap fee and returns new allocation
     * of swap based on swap conditions. Calculate is based
     * on liquidity fee and phenix vault fee. Sell fee will also
     * be taken into consideration if receiver is pair address.
     * @return uint256 gonAmount that is transfered in the swap.
     */
    function _takeFee(
        address sender,
        address to,
        uint256 gonAmount
    ) internal returns (uint256) {
        uint256 _totalFee = totalFee;
        if (taxableAddress[to] == true) _totalFee = _totalFee.add(sellFee);

        uint256 feeAmount = gonAmount.mul(_totalFee).div(feeDenominator);

        _gonBalances[address(this)] = _gonBalances[address(this)].add(
            feeAmount
        );
        emit Transfer(sender, address(this), feeAmount.div(_gonsPerFragment));

        return gonAmount.sub(feeAmount);
    }

    /**
     * @dev Decreases spender allowance of sender address.
     * @param spender Spender address.
     * @param subtractedValue Amount to reduce spender allowance by.
     * @return bool
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        initialDistributionLock
        returns (bool)
    {
        uint256 oldValue = _allowedFragments[msg.sender][spender];
        if (subtractedValue >= oldValue) {
            _allowedFragments[msg.sender][spender] = 0;
        } else {
            _allowedFragments[msg.sender][spender] = oldValue.sub(
                subtractedValue
            );
        }
        emit Approval(
            msg.sender,
            spender,
            _allowedFragments[msg.sender][spender]
        );
        return true;
    }

    /**
     * @dev Updates router address
     * @param _address address to set for the dex router
     */
    function updateRouter(address _address) external onlyOwner {
        require(address(router) != _address, "Router address already set");
        router = IVVSRouter(_address);
    }

    /**
     * @dev Increases spender allowance of sender address.
     * @param spender Spender address.
     * @param addedValue Amount to increase spender allowance by.
     * @return bool
     */
    function increaseAllowance(address spender, uint256 addedValue)
        external
        initialDistributionLock
        returns (bool)
    {
        _allowedFragments[msg.sender][spender] = _allowedFragments[msg.sender][
            spender
        ].add(addedValue);
        emit Approval(
            msg.sender,
            spender,
            _allowedFragments[msg.sender][spender]
        );
        return true;
    }

    /**
     * @dev Approves spender address to use sender tokens.
     * @param spender Spender address.
     * @param value Amount of tokens spender can access.
     * @return bool
     */
    function approve(address spender, uint256 value)
        external
        override
        initialDistributionLock
        returns (bool)
    {
        _allowedFragments[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Checks if given address is exempt from swap fees.
     * @param _addr Address to check current exemption status.
     * @return bool
     */
    function checkFeeExempt(address _addr) external view returns (bool) {
        return _isFeeExempt[_addr];
    }

    /**
     * @dev Unlocks tokens and sets initialDistributedFinished
     * to true. Only callable from owner address.
     */
    function setInitialDistributionFinished() external onlyOwner {
        initialDistributionFinished = true;
    }

    /**
     * @dev Enables transfers for a specific address.
     * Only callable from owner address.
     * @param _addr Address to enable transfers.
     */
    function enableTransfer(address _addr) external onlyOwner {
        _allowTransfer[_addr] = true;
    }

    /**
     * @dev Sets given address to have exceptions from
     * swap fees. Only callable from owner address.
     * @param _addr Address to set fee exemptions.
     */
    function setFeeExempt(address _addr) external onlyOwner {
        _isFeeExempt[_addr] = true;
    }

    /**
     * @dev Checks if a sender (from) and receiver
     * (to) need swap fees applied in transfer. Used
     * in _transferFrom(address, address, uint256) internal
     * function. Should only apply when user is interacting with
     * the pair (to or from)
     * @param from Sender address of swap
     * @param to Receiver address of swap.
     * @return bool True if fees apply on transfer.
     */
    function _shouldTakeFee(address from, address to)
        internal
        view
        returns (bool)
    {
        return
            (taxableAddress[from] || taxableAddress[to]) &&
            (!_isFeeExempt[from] && !_isFeeExempt[to]);
    }

    /**
     * @dev Updates swap back settings.
     * @param _enabled bool value to determine of swap back is enabled.
     * @param _num uint256 value for the swap back threshhold
     * @param _denom uint256 value used for the threshold deminator
     */
    function setSwapBackSettings(
        bool _enabled,
        uint256 _num,
        uint256 _denom
    ) external onlyOwner {
        swapEnabled = _enabled;
        gonSwapThreshold = TOTAL_GONS.div(_denom).mul(_num);
    }

    /**
     * @dev Updates RX3 Rebase settings.
     * @param _enabled bool value to determine of RX3 Protocol is enabled.
     * @param _rebaseMaxRX3Multiplier uint256 value for the max RX3 Multiplier
     * @param _rebaseRX3MultiplierStep uint256 value used for the RX3 Multiplier Step
     */
    function setRX3Settings(
        bool _enabled,
        uint256 _rebaseMaxRX3Multiplier,
        uint256 _rebaseRX3MultiplierStep
    ) external onlyOwner {
        rebaseRX3Enabled = _enabled;
        rebaseMaxRX3Multiplier = _rebaseMaxRX3Multiplier;
        rebaseRX3MultiplierStep = _rebaseRX3MultiplierStep;
    }

    /**
     * @dev Configures Rebase settings. Sets
     * RebasePercentDelta, and Accuracy.
     * @param _percentage value of rebase percent delta based on a daily interval (18)
     * @param _accuracy defines the value of the rebase delta percentage demoninator (1000)
     */
    function setRebaseSettings(uint256 _percentage, uint256 _accuracy)
        external
        onlyOwner
    {
        rebasePercentDelta = (_percentage * FXP_BASE) / _accuracy;
    }

    /**
     * @dev Check whether the a swap back can be performed.
     * @return bool, true if swapBack is allowed to execute.
     */
    function _shouldSwapBack() internal view returns (bool) {
        return
            taxableAddress[msg.sender] == false &&
            !inSwap &&
            swapEnabled &&
            _gonBalances[address(this)] >= gonSwapThreshold;
    }

    /**
     * @dev Returns current circulating token supply
     * @return uint256, value of total circulating supply.
     */
    function getCirculatingSupply() public view returns (uint256) {
        return
            (TOTAL_GONS.sub(_gonBalances[DEAD]).sub(_gonBalances[ZERO])).div(
                _gonsPerFragment
            );
    }

    function isNotInSwap() external view returns (bool) {
        return !inSwap;
    }

    function checkSwapThreshold() external view returns (uint256) {
        return gonSwapThreshold.div(_gonsPerFragment);
    }

    function setFeeReceivers(
        address _liquidityReceiver,
        address _phenixFundReserveReceiver
    ) external onlyOwner {
        liquidityReceiver = _liquidityReceiver;
        phenixFundReserveReceiver = _phenixFundReserveReceiver;
    }

    function setFees(
        uint256 _liquidityFee,
        uint256 _phenixVaultFee,
        uint256 _sellFee,
        uint256 _feeDenominator
    ) external onlyOwner {
        liquidityFee = _liquidityFee;
        phenixVaultFee = _phenixVaultFee;
        sellFee = _sellFee;
        totalFee = liquidityFee.add(phenixVaultFee);
        feeDenominator = _feeDenominator;
        require(totalFee < feeDenominator / 4);
    }

    function emergencyRecoverETH() external onlyOwner {
        require(address(this).balance > 0, "No ETH to recover.");
        (bool success, ) = address(msg.sender).call{
            value: address(this).balance
        }("");
        require(success, "Failed to recover ETH.");
    }

    function emergencyRecoverToken(address _tokenAddress) external onlyOwner {
        require(
            IERC20(_tokenAddress).balanceOf(address(this)) > 0,
            "No tokens to recover."
        );
        IERC20(_tokenAddress).transfer(
            msg.sender,
            IERC20(_tokenAddress).balanceOf(address(this))
        );
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"previousOwner","type":"address"}],"name":"OwnershipRenounced","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":"uint256","name":"totalSupply","type":"uint256"}],"name":"Rebase","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":[{"internalType":"address","name":"_address","type":"address"}],"name":"addLPAddress","outputs":[],"stateMutability":"nonpayable","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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedRebaseAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"checkFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkSwapThreshold","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":[],"name":"emergencyRecoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"emergencyRecoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"enableTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLPAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getNextRebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"initialDistributionFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isNotInSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebaseDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebaseTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phenixFundReserveReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phenixVaultFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebaseAndSync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebaseMaxRX3Multiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebasePercentDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebaseRX3Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebaseRX3Multiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebaseRX3MultiplierStep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetLastRebaseTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IVVSRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAuthorizedRebaseAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityReceiver","type":"address"},{"internalType":"address","name":"_phenixFundReserveReceiver","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_phenixVaultFee","type":"uint256"},{"internalType":"uint256","name":"_sellFee","type":"uint256"},{"internalType":"uint256","name":"_feeDenominator","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setInitialDistributionFinished","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_rebaseMaxRX3Multiplier","type":"uint256"},{"internalType":"uint256","name":"_rebaseRX3MultiplierStep","type":"uint256"}],"name":"setRX3Settings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"},{"internalType":"uint256","name":"_accuracy","type":"uint256"}],"name":"setRebaseSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"uint256","name":"_denom","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setTaxableAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxableAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"value","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":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600855600a6009556005600a5562000031600954600854620008fb60201b620034321790919060201c565b600b556064600c5542600d556000600e556103e8620f4240601202816200005457fe5b04600f556000601060006101000a81548160ff021916908315150217905550620f42406011556002620f4240816200008857fe5b04620f4240016012556103e8620f424060010281620000a357fe5b0460135560016014806101000a81548160ff021916908315150217905550612710600a6012600a0a620f42400260001981620000db57fe5b06600019030281620000e957fe5b04601555348015620000fa57600080fd5b506040518060400160405280600e81526020017f5068656e69782046696e616e63650000000000000000000000000000000000008152506040518060400160405280600481526020017f50484e5800000000000000000000000000000000000000000000000000000000815250601282600090805190602001906200018192919062000aa1565b5081600190805190602001906200019a92919062000aa1565b5080600260006101000a81548160ff021916908360ff16021790555050505033600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073145677fc4d9b8f19b5d56d1820c48e0443049a30601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620002ba57600080fd5b505afa158015620002cf573d6000803e3d6000fd5b505050506040513d6020811015620002e657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663c9c65396601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200037b57600080fd5b505afa15801562000390573d6000803e3d6000fd5b505050506040513d6020811015620003a757600080fd5b8101908080519060200190929190505050306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156200042357600080fd5b505af115801562000438573d6000803e3d6000fd5b505050506040513d60208110156200044f57600080fd5b8101908080519060200190929190505050905033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff601a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506012600a0a620f4240026017819055506012600a0a620f42400260001981620005cc57fe5b0660001903601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620006496017546012600a0a620f424002600019816200063057fe5b06600019036200098460201b620034ba1790919060201c565b601881905550600160076000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506003819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6017546040518082815260200191505060405180910390a35062000b57565b6000808284019050838110156200097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000620009ce83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620009d660201b60201c565b905092915050565b6000808311829062000a86576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000a4a57808201518184015260208101905062000a2d565b50505050905090810190601f16801562000a785780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858162000a9357fe5b049050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000ad9576000855562000b25565b82601f1062000af457805160ff191683800117855562000b25565b8280016001018555821562000b25579182015b8281111562000b2457825182559160200191906001019062000b07565b5b50905062000b34919062000b38565b5090565b5b8082111562000b5357600081600090555060010162000b39565b5090565b6147588062000b676000396000f3fe60806040526004361061037a5760003560e01c8063784d20b1116101d1578063b065406911610102578063d1fce264116100a0578063dd62ed3e1161006f578063dd62ed3e146111ef578063f2fde38b14611274578063f887ea40146112c5578063fff434811461130657610381565b8063d1fce264146110a3578063d4399790146110d0578063d5938aac14611137578063d780d4dc1461118857610381565b8063bdb938e2116100dc578063bdb938e214610f77578063c851cc3214610fd4578063c939a4f614611025578063d08893581461105257610381565b8063b065406914610ed2578063b86a2fd714610efd578063bd94c8dd14610f2857610381565b806399e3b3bd1161016f578063a8688e2a11610149578063a8688e2a14610dba578063a9059cbb14610e0b578063a92558d014610e7c578063ab92c3f214610ea757610381565b806399e3b3bd14610c97578063a457c2d714610cd8578063a4b45c0014610d4957610381565b80638da5cb5b116101ab5780638da5cb5b14610b6e5780638f32d59b14610baf57806395d89b4114610bdc57806398118cb414610c6c57610381565b8063784d20b114610a9557806383b4ac6814610afc57806389e9616e14610b2957610381565b80632d517fdc116102ab578063530ddf64116102495780636fcba377116102235780636fcba3771461096f57806370a08231146109c8578063715018a614610a2d578063749796a514610a4457610381565b8063530ddf64146109005780636d351d1a146109175780636ddd17131461094257610381565b8063395093511161028557806339509351146107e15780634513e7d0146108525780634bfed05c146108695780634c50855d1461089457610381565b80632d517fdc14610737578063313ce567146107625780633751ed741461079057610381565b806323b872dd116103185780632b112e49116102f25780632b112e491461069f5780632b14ca56146106ca5780632b28af1b146106f55780632be6937d1461072057610381565b806323b872dd14610570578063264d26dd146106015780632abf77f51461064257610381565b8063180b0d7e11610354578063180b0d7e146104d857806318160ddd14610503578063186e2d771461052e5780631df4ccfc1461054557610381565b806306fdde031461038657806307f594a314610416578063095ea7b31461046757610381565b3661038157005b600080fd5b34801561039257600080fd5b5061039b61136b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103db5780820151818401526020810190506103c0565b50505050905090810190601f1680156104085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561042257600080fd5b506104656004803603602081101561043957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061140d565b005b34801561047357600080fd5b506104c06004803603604081101561048a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611686565b60405180821515815260200191505060405180910390f35b3480156104e457600080fd5b506104ed611840565b6040518082815260200191505060405180910390f35b34801561050f57600080fd5b50610518611846565b6040518082815260200191505060405180910390f35b34801561053a57600080fd5b50610543611850565b005b34801561055157600080fd5b5061055a6119b6565b6040518082815260200191505060405180910390f35b34801561057c57600080fd5b506105e96004803603606081101561059357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119bc565b60405180821515815260200191505060405180910390f35b34801561060d57600080fd5b50610616611bfb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561064e57600080fd5b5061069d6004803603604081101561066557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611c21565b005b3480156106ab57600080fd5b506106b4611c8d565b6040518082815260200191505060405180910390f35b3480156106d657600080fd5b506106df611d65565b6040518082815260200191505060405180910390f35b34801561070157600080fd5b5061070a611d6b565b6040518082815260200191505060405180910390f35b34801561072c57600080fd5b50610735611d71565b005b34801561074357600080fd5b5061074c611d9f565b6040518082815260200191505060405180910390f35b34801561076e57600080fd5b50610777611da5565b604051808260ff16815260200191505060405180910390f35b34801561079c57600080fd5b506107df600480360360608110156107b357600080fd5b810190808035151590602001909291908035906020019092919080359060200190929190505050611dbc565b005b3480156107ed57600080fd5b5061083a6004803603604081101561080457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611dfa565b60405180821515815260200191505060405180910390f35b34801561085e57600080fd5b506108676120be565b005b34801561087557600080fd5b5061087e612170565b6040518082815260200191505060405180910390f35b3480156108a057600080fd5b506108a9612176565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108ec5780820151818401526020810190506108d1565b505050509050019250505060405180910390f35b34801561090c57600080fd5b50610915612204565b005b34801561092357600080fd5b5061092c61241a565b6040518082815260200191505060405180910390f35b34801561094e57600080fd5b50610957612438565b60405180821515815260200191505060405180910390f35b34801561097b57600080fd5b506109c66004803603608081101561099257600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612449565b005b3480156109d457600080fd5b50610a17600480360360208110156109eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124b3565b6040518082815260200191505060405180910390f35b348015610a3957600080fd5b50610a42612510565b005b348015610a5057600080fd5b50610a9360048036036020811015610a6757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125ca565b005b348015610aa157600080fd5b50610ae460048036036020811015610ab857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612636565b60405180821515815260200191505060405180910390f35b348015610b0857600080fd5b50610b11612656565b60405180821515815260200191505060405180910390f35b348015610b3557600080fd5b50610b6c60048036036040811015610b4c57600080fd5b81019080803590602001909291908035906020019092919050505061266e565b005b348015610b7a57600080fd5b50610b83612698565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610bbb57600080fd5b50610bc46126c2565b60405180821515815260200191505060405180910390f35b348015610be857600080fd5b50610bf161271a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c31578082015181840152602081019050610c16565b50505050905090810190601f168015610c5e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c7857600080fd5b50610c816127bc565b6040518082815260200191505060405180910390f35b348015610ca357600080fd5b50610cac6127c2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610ce457600080fd5b50610d3160048036036040811015610cfb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127e8565b60405180821515815260200191505060405180910390f35b348015610d5557600080fd5b50610db860048036036040811015610d6c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b41565b005b348015610dc657600080fd5b50610e0960048036036020811015610ddd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bd8565b005b348015610e1757600080fd5b50610e6460048036036040811015610e2e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612dfe565b60405180821515815260200191505060405180910390f35b348015610e8857600080fd5b50610e91612f1a565b6040518082815260200191505060405180910390f35b348015610eb357600080fd5b50610ebc612f20565b6040518082815260200191505060405180910390f35b348015610ede57600080fd5b50610ee7612f26565b6040518082815260200191505060405180910390f35b348015610f0957600080fd5b50610f12612f2c565b6040518082815260200191505060405180910390f35b348015610f3457600080fd5b50610f6160048036036020811015610f4b57600080fd5b8101908080359060200190929190505050612f32565b6040518082815260200191505060405180910390f35b348015610f8357600080fd5b50610fd260048036036040811015610f9a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061302a565b005b348015610fe057600080fd5b5061102360048036036020811015610ff757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613096565b005b34801561103157600080fd5b5061103a6131af565b60405180821515815260200191505060405180910390f35b34801561105e57600080fd5b506110a16004803603606081101561107557600080fd5b8101908080351515906020019092919080359060200190929190803590602001909291905050506131c2565b005b3480156110af57600080fd5b506110b8613234565b60405180821515815260200191505060405180910390f35b3480156110dc57600080fd5b5061111f600480360360208110156110f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613247565b60405180821515815260200191505060405180910390f35b34801561114357600080fd5b506111866004803603602081101561115a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061329d565b005b34801561119457600080fd5b506111d7600480360360208110156111ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613309565b60405180821515815260200191505060405180910390f35b3480156111fb57600080fd5b5061125e6004803603604081101561121257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613329565b6040518082815260200191505060405180910390f35b34801561128057600080fd5b506112c36004803603602081101561129757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133b0565b005b3480156112d157600080fd5b506112da6133cd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561131257600080fd5b5061133f6004803603602081101561132957600080fd5b81019080803590602001909291905050506133f3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114035780601f106113d857610100808354040283529160200191611403565b820191906000526020600020905b8154815290600101906020018083116113e657829003601f168201915b5050505050905090565b6114156126c2565b61141e57600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561148757600080fd5b505afa15801561149b573d6000803e3d6000fd5b505050506040513d60208110156114b157600080fd5b810190808051906020019092919050505011611535576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20746f6b656e7320746f207265636f7665722e000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156115b957600080fd5b505afa1580156115cd573d6000803e3d6000fd5b505050506040513d60208110156115e357600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561164757600080fd5b505af115801561165b573d6000803e3d6000fd5b505050506040513d602081101561167157600080fd5b81019080805190602001909291905050505050565b6000600560149054906101000a900460ff16806116a757506116a66126c2565b5b806116fb5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611750576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b81601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600c5481565b6000601754905090565b6118586126c2565b61186157600080fd5b600047116118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f2045544820746f207265636f7665722e000000000000000000000000000081525060200191505060405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405180600001905060006040518083038185875af1925050503d8060008114611937576040519150601f19603f3d011682016040523d82523d6000602084013e61193c565b606091505b50509050806119b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4661696c656420746f207265636f766572204554482e0000000000000000000081525060200191505060405180910390fd5b50565b600b5481565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f957600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611be357611b62836040518060400160405280601681526020017f496e73756666696369656e7420416c6c6f77616e636500000000000000000000815250601a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135049092919063ffffffff16565b601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b611bee8585856135c4565b5060019150509392505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c296126c2565b611c3257600080fd5b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000611d60601854611d52601960008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d446019600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546012600a0a620f42400260001981611d3157fe5b066000190361382b90919063ffffffff16565b61382b90919063ffffffff16565b6134ba90919063ffffffff16565b905090565b600a5481565b600e5481565b611d796126c2565b611d8257600080fd5b6001600560146101000a81548160ff021916908315150217905550565b60115481565b6000600260009054906101000a900460ff16905090565b611dc46126c2565b611dcd57600080fd5b82601060006101000a81548160ff0219169083151502179055508160128190555080601381905550505050565b6000600560149054906101000a900460ff1680611e1b5750611e1a6126c2565b5b80611e6f5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611ec4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b611f5382601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b60011515601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612167576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806146fb6028913960400191505060405180910390fd5b42600d81905550565b600f5481565b606060038054806020026020016040519081016040528092919081815260200182805480156121fa57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116121b0575b5050505050905090565b60011515601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4e6f742061757468726f697a656420746f20657865637574652072656261736581525060200191505060405180910390fd5b6122d2613875565b60005b6003805490508110156124175760011515601b6000600384815481106122f757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561240a576003818154811061237f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156123f157600080fd5b505af1158015612405573d6000803e3d6000fd5b505050505b80806001019150506122d5565b50565b60006124336018546015546134ba90919063ffffffff16565b905090565b60148054906101000a900460ff1681565b6124516126c2565b61245a57600080fd5b836008819055508260098190555081600a8190555061248660095460085461343290919063ffffffff16565b600b8190555080600c819055506004600c548161249f57fe5b04600b54106124ad57600080fd5b50505050565b6000612509601854601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134ba90919063ffffffff16565b9050919050565b6125186126c2565b61252157600080fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6125d26126c2565b6125db57600080fd5b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601c6020528060005260406000206000915054906101000a900460ff1681565b6000601660009054906101000a900460ff1615905090565b6126766126c2565b61267f57600080fd5b80620f424083028161268d57fe5b04600f819055505050565b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b606060018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127b25780601f10612787576101008083540402835291602001916127b2565b820191906000526020600020905b81548152906001019060200180831161279557829003601f168201915b5050505050905090565b60085481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560149054906101000a900460ff168061280957506128086126c2565b5b8061285d5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6128b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b6000601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083106129c1576000601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a55565b6129d4838261382b90919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b612b496126c2565b612b5257600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b612be06126c2565b612be957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c3157600080fd5b505af1158015612c45573d6000803e3d6000fd5b5050505060005b600380549050811015612d3f578173ffffffffffffffffffffffffffffffffffffffff1660038281548110612c7d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f50616972206164647265737320616c726561647920616464656400000000000081525060200191505060405180910390fd5b8080600101915050612c4c565b506003819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e3b57600080fd5b600560149054906101000a900460ff1680612e5a5750612e596126c2565b5b80612eae5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612f03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b612f0e3385856135c4565b50600191505092915050565b60135481565b60125481565b60095481565b600d5481565b600080600d54830390506000612f6962015180612f5b620f42408561395490919063ffffffff16565b6134ba90919063ffffffff16565b90506000612fc0620f4240612fb284612fa4620f4240612f96600f5460175461395490919063ffffffff16565b6134ba90919063ffffffff16565b61395490919063ffffffff16565b6134ba90919063ffffffff16565b905060011515601060009054906101000a900460ff161515141561301f5761301c620f424061300e60125460115410612ffb57601254612fff565b6011545b8461395490919063ffffffff16565b6134ba90919063ffffffff16565b90505b809350505050919050565b6130326126c2565b61303b57600080fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61309e6126c2565b6130a757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561316b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f526f75746572206164647265737320616c72656164792073657400000000000081525060200191505060405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601060009054906101000a900460ff1681565b6131ca6126c2565b6131d357600080fd5b826014806101000a81548160ff0219169083151502179055506132298261321b836012600a0a620f4240026000198161320857fe5b06600019036134ba90919063ffffffff16565b61395490919063ffffffff16565b601581905550505050565b600560149054906101000a900460ff1681565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6132a56126c2565b6132ae57600080fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601b6020528060005260406000206000915054906101000a900460ff1681565b6000601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6133b86126c2565b6133c157600080fd5b6133ca816139da565b50565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6003818154811061340357600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808284019050838110156134b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006134fc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ad4565b905092915050565b60008383111582906135b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561357657808201518184015260208101905061355b565b50505050905090810190601f1680156135a35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000601660009054906101000a900460ff16156135ed576135e6848484613b9a565b9050613824565b60006136046018548461395490919063ffffffff16565b905061360e613cea565b1561361c5761361b613dc0565b5b60011515601060009054906101000a900460ff16151514156136565761364f60135460115461343290919063ffffffff16565b6011819055505b6136a881601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461382b90919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006136f7868661438f565b613701578161370d565b61370c8686846144e6565b5b905061376181601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef613808601854856134ba90919063ffffffff16565b6040518082815260200191505060405180910390a36001925050505b9392505050565b600061386d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613504565b905092915050565b600061388042612f32565b90506138978160175461343290919063ffffffff16565b6017819055506000196fffffffffffffffffffffffffffffffff1660175411156138d7576000196fffffffffffffffffffffffffffffffff166017819055505b6139046017546012600a0a620f424002600019816138f157fe5b06600019036134ba90919063ffffffff16565b60188190555080600e8190555042600d81905550620f42406011819055506017547fafae32ce2847c13a56ab802c034c27d3c19f1d61be48c424c5df134145cd44d060405160405180910390a250565b60008083141561396757600090506139d4565b600082840290508284828161397857fe5b04146139cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806146b76021913960400191505060405180910390fd5b809150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613a1457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290613b80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b45578082015181840152602081019050613b2a565b50505050905090810190601f168015613b725780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b8c57fe5b049050809150509392505050565b600080613bb26018548461395490919063ffffffff16565b9050613c0681601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461382b90919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c9b81601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060019150509392505050565b6000801515601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148015613d585750601660009054906101000a900460ff16155b8015613d6e575060148054906101000a900460ff165b8015613dbb5750601554601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b905090565b6001601660006101000a81548160ff0219169083151502179055506000613e31601854601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134ba90919063ffffffff16565b90506000613e716002613e63600b54613e556008548761395490919063ffffffff16565b6134ba90919063ffffffff16565b6134ba90919063ffffffff16565b90506000613e88828461382b90919063ffffffff16565b90506000600267ffffffffffffffff81118015613ea457600080fd5b50604051908082528060200260200182016040528015613ed35781602001602082028036833780820191505090505b5090503081600081518110613ee457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613f8657600080fd5b505afa158015613f9a573d6000803e3d6000fd5b505050506040513d6020811015613fb057600080fd5b810190808051906020019092919050505081600181518110613fce57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000479050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156140d15780820151818401526020810190506140b6565b505050509050019650505050505050600060405180830381600087803b1580156140fa57600080fd5b505af115801561410e573d6000803e3d6000fd5b505050506000614127824761382b90919063ffffffff16565b9050600061415561414460026008546134ba90919063ffffffff16565b600b5461382b90919063ffffffff16565b905060006141936002614185846141776008548861395490919063ffffffff16565b6134ba90919063ffffffff16565b6134ba90919063ffffffff16565b905060008711156142de57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308a600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200196505050505050506060604051808303818588803b15801561428a57600080fd5b505af115801561429e573d6000803e3d6000fd5b50505050506040513d60608110156142b557600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050505050505b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405180600001905060006040518083038185875af1925050503d8060008114614360576040519150601f19603f3d011682016040523d82523d6000602084013e614365565b606091505b505090505050505050505050506000601660006101000a81548160ff021916908315150217905550565b6000601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806144325750601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80156144de5750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156144dd5750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b905092915050565b600080600b54905060011515601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561455f5761455c600a548261343290919063ffffffff16565b90505b6000614588600c5461457a848761395490919063ffffffff16565b6134ba90919063ffffffff16565b90506145dc81601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef614683601854856134ba90919063ffffffff16565b6040518082815260200191505060405180910390a36146ab818561382b90919063ffffffff16565b92505050939250505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77496e697469616c20646973746972627574696f6e206e6f742066696e616c697a65642e4e6f742061757468726f697a656420746f206578656375746520746869732066756e6374696f6e2ea26469706673582212202051c763be90df5abcaad584766454277d17589b720540d17c8f2b28b3cac83564736f6c63430007060033

Deployed Bytecode

0x60806040526004361061037a5760003560e01c8063784d20b1116101d1578063b065406911610102578063d1fce264116100a0578063dd62ed3e1161006f578063dd62ed3e146111ef578063f2fde38b14611274578063f887ea40146112c5578063fff434811461130657610381565b8063d1fce264146110a3578063d4399790146110d0578063d5938aac14611137578063d780d4dc1461118857610381565b8063bdb938e2116100dc578063bdb938e214610f77578063c851cc3214610fd4578063c939a4f614611025578063d08893581461105257610381565b8063b065406914610ed2578063b86a2fd714610efd578063bd94c8dd14610f2857610381565b806399e3b3bd1161016f578063a8688e2a11610149578063a8688e2a14610dba578063a9059cbb14610e0b578063a92558d014610e7c578063ab92c3f214610ea757610381565b806399e3b3bd14610c97578063a457c2d714610cd8578063a4b45c0014610d4957610381565b80638da5cb5b116101ab5780638da5cb5b14610b6e5780638f32d59b14610baf57806395d89b4114610bdc57806398118cb414610c6c57610381565b8063784d20b114610a9557806383b4ac6814610afc57806389e9616e14610b2957610381565b80632d517fdc116102ab578063530ddf64116102495780636fcba377116102235780636fcba3771461096f57806370a08231146109c8578063715018a614610a2d578063749796a514610a4457610381565b8063530ddf64146109005780636d351d1a146109175780636ddd17131461094257610381565b8063395093511161028557806339509351146107e15780634513e7d0146108525780634bfed05c146108695780634c50855d1461089457610381565b80632d517fdc14610737578063313ce567146107625780633751ed741461079057610381565b806323b872dd116103185780632b112e49116102f25780632b112e491461069f5780632b14ca56146106ca5780632b28af1b146106f55780632be6937d1461072057610381565b806323b872dd14610570578063264d26dd146106015780632abf77f51461064257610381565b8063180b0d7e11610354578063180b0d7e146104d857806318160ddd14610503578063186e2d771461052e5780631df4ccfc1461054557610381565b806306fdde031461038657806307f594a314610416578063095ea7b31461046757610381565b3661038157005b600080fd5b34801561039257600080fd5b5061039b61136b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103db5780820151818401526020810190506103c0565b50505050905090810190601f1680156104085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561042257600080fd5b506104656004803603602081101561043957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061140d565b005b34801561047357600080fd5b506104c06004803603604081101561048a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611686565b60405180821515815260200191505060405180910390f35b3480156104e457600080fd5b506104ed611840565b6040518082815260200191505060405180910390f35b34801561050f57600080fd5b50610518611846565b6040518082815260200191505060405180910390f35b34801561053a57600080fd5b50610543611850565b005b34801561055157600080fd5b5061055a6119b6565b6040518082815260200191505060405180910390f35b34801561057c57600080fd5b506105e96004803603606081101561059357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119bc565b60405180821515815260200191505060405180910390f35b34801561060d57600080fd5b50610616611bfb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561064e57600080fd5b5061069d6004803603604081101561066557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611c21565b005b3480156106ab57600080fd5b506106b4611c8d565b6040518082815260200191505060405180910390f35b3480156106d657600080fd5b506106df611d65565b6040518082815260200191505060405180910390f35b34801561070157600080fd5b5061070a611d6b565b6040518082815260200191505060405180910390f35b34801561072c57600080fd5b50610735611d71565b005b34801561074357600080fd5b5061074c611d9f565b6040518082815260200191505060405180910390f35b34801561076e57600080fd5b50610777611da5565b604051808260ff16815260200191505060405180910390f35b34801561079c57600080fd5b506107df600480360360608110156107b357600080fd5b810190808035151590602001909291908035906020019092919080359060200190929190505050611dbc565b005b3480156107ed57600080fd5b5061083a6004803603604081101561080457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611dfa565b60405180821515815260200191505060405180910390f35b34801561085e57600080fd5b506108676120be565b005b34801561087557600080fd5b5061087e612170565b6040518082815260200191505060405180910390f35b3480156108a057600080fd5b506108a9612176565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108ec5780820151818401526020810190506108d1565b505050509050019250505060405180910390f35b34801561090c57600080fd5b50610915612204565b005b34801561092357600080fd5b5061092c61241a565b6040518082815260200191505060405180910390f35b34801561094e57600080fd5b50610957612438565b60405180821515815260200191505060405180910390f35b34801561097b57600080fd5b506109c66004803603608081101561099257600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612449565b005b3480156109d457600080fd5b50610a17600480360360208110156109eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124b3565b6040518082815260200191505060405180910390f35b348015610a3957600080fd5b50610a42612510565b005b348015610a5057600080fd5b50610a9360048036036020811015610a6757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125ca565b005b348015610aa157600080fd5b50610ae460048036036020811015610ab857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612636565b60405180821515815260200191505060405180910390f35b348015610b0857600080fd5b50610b11612656565b60405180821515815260200191505060405180910390f35b348015610b3557600080fd5b50610b6c60048036036040811015610b4c57600080fd5b81019080803590602001909291908035906020019092919050505061266e565b005b348015610b7a57600080fd5b50610b83612698565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610bbb57600080fd5b50610bc46126c2565b60405180821515815260200191505060405180910390f35b348015610be857600080fd5b50610bf161271a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c31578082015181840152602081019050610c16565b50505050905090810190601f168015610c5e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c7857600080fd5b50610c816127bc565b6040518082815260200191505060405180910390f35b348015610ca357600080fd5b50610cac6127c2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610ce457600080fd5b50610d3160048036036040811015610cfb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127e8565b60405180821515815260200191505060405180910390f35b348015610d5557600080fd5b50610db860048036036040811015610d6c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b41565b005b348015610dc657600080fd5b50610e0960048036036020811015610ddd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bd8565b005b348015610e1757600080fd5b50610e6460048036036040811015610e2e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612dfe565b60405180821515815260200191505060405180910390f35b348015610e8857600080fd5b50610e91612f1a565b6040518082815260200191505060405180910390f35b348015610eb357600080fd5b50610ebc612f20565b6040518082815260200191505060405180910390f35b348015610ede57600080fd5b50610ee7612f26565b6040518082815260200191505060405180910390f35b348015610f0957600080fd5b50610f12612f2c565b6040518082815260200191505060405180910390f35b348015610f3457600080fd5b50610f6160048036036020811015610f4b57600080fd5b8101908080359060200190929190505050612f32565b6040518082815260200191505060405180910390f35b348015610f8357600080fd5b50610fd260048036036040811015610f9a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061302a565b005b348015610fe057600080fd5b5061102360048036036020811015610ff757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613096565b005b34801561103157600080fd5b5061103a6131af565b60405180821515815260200191505060405180910390f35b34801561105e57600080fd5b506110a16004803603606081101561107557600080fd5b8101908080351515906020019092919080359060200190929190803590602001909291905050506131c2565b005b3480156110af57600080fd5b506110b8613234565b60405180821515815260200191505060405180910390f35b3480156110dc57600080fd5b5061111f600480360360208110156110f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613247565b60405180821515815260200191505060405180910390f35b34801561114357600080fd5b506111866004803603602081101561115a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061329d565b005b34801561119457600080fd5b506111d7600480360360208110156111ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613309565b60405180821515815260200191505060405180910390f35b3480156111fb57600080fd5b5061125e6004803603604081101561121257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613329565b6040518082815260200191505060405180910390f35b34801561128057600080fd5b506112c36004803603602081101561129757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133b0565b005b3480156112d157600080fd5b506112da6133cd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561131257600080fd5b5061133f6004803603602081101561132957600080fd5b81019080803590602001909291905050506133f3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114035780601f106113d857610100808354040283529160200191611403565b820191906000526020600020905b8154815290600101906020018083116113e657829003601f168201915b5050505050905090565b6114156126c2565b61141e57600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561148757600080fd5b505afa15801561149b573d6000803e3d6000fd5b505050506040513d60208110156114b157600080fd5b810190808051906020019092919050505011611535576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e6f20746f6b656e7320746f207265636f7665722e000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156115b957600080fd5b505afa1580156115cd573d6000803e3d6000fd5b505050506040513d60208110156115e357600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561164757600080fd5b505af115801561165b573d6000803e3d6000fd5b505050506040513d602081101561167157600080fd5b81019080805190602001909291905050505050565b6000600560149054906101000a900460ff16806116a757506116a66126c2565b5b806116fb5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611750576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b81601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600c5481565b6000601754905090565b6118586126c2565b61186157600080fd5b600047116118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f2045544820746f207265636f7665722e000000000000000000000000000081525060200191505060405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405180600001905060006040518083038185875af1925050503d8060008114611937576040519150601f19603f3d011682016040523d82523d6000602084013e61193c565b606091505b50509050806119b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4661696c656420746f207265636f766572204554482e0000000000000000000081525060200191505060405180910390fd5b50565b600b5481565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f957600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611be357611b62836040518060400160405280601681526020017f496e73756666696369656e7420416c6c6f77616e636500000000000000000000815250601a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135049092919063ffffffff16565b601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b611bee8585856135c4565b5060019150509392505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c296126c2565b611c3257600080fd5b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000611d60601854611d52601960008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d446019600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546012600a0a620f42400260001981611d3157fe5b066000190361382b90919063ffffffff16565b61382b90919063ffffffff16565b6134ba90919063ffffffff16565b905090565b600a5481565b600e5481565b611d796126c2565b611d8257600080fd5b6001600560146101000a81548160ff021916908315150217905550565b60115481565b6000600260009054906101000a900460ff16905090565b611dc46126c2565b611dcd57600080fd5b82601060006101000a81548160ff0219169083151502179055508160128190555080601381905550505050565b6000600560149054906101000a900460ff1680611e1b5750611e1a6126c2565b5b80611e6f5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611ec4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b611f5382601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b60011515601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612167576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806146fb6028913960400191505060405180910390fd5b42600d81905550565b600f5481565b606060038054806020026020016040519081016040528092919081815260200182805480156121fa57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116121b0575b5050505050905090565b60011515601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4e6f742061757468726f697a656420746f20657865637574652072656261736581525060200191505060405180910390fd5b6122d2613875565b60005b6003805490508110156124175760011515601b6000600384815481106122f757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561240a576003818154811061237f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156123f157600080fd5b505af1158015612405573d6000803e3d6000fd5b505050505b80806001019150506122d5565b50565b60006124336018546015546134ba90919063ffffffff16565b905090565b60148054906101000a900460ff1681565b6124516126c2565b61245a57600080fd5b836008819055508260098190555081600a8190555061248660095460085461343290919063ffffffff16565b600b8190555080600c819055506004600c548161249f57fe5b04600b54106124ad57600080fd5b50505050565b6000612509601854601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134ba90919063ffffffff16565b9050919050565b6125186126c2565b61252157600080fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6125d26126c2565b6125db57600080fd5b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601c6020528060005260406000206000915054906101000a900460ff1681565b6000601660009054906101000a900460ff1615905090565b6126766126c2565b61267f57600080fd5b80620f424083028161268d57fe5b04600f819055505050565b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b606060018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127b25780601f10612787576101008083540402835291602001916127b2565b820191906000526020600020905b81548152906001019060200180831161279557829003601f168201915b5050505050905090565b60085481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560149054906101000a900460ff168061280957506128086126c2565b5b8061285d5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6128b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b6000601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083106129c1576000601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a55565b6129d4838261382b90919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b612b496126c2565b612b5257600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b612be06126c2565b612be957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c3157600080fd5b505af1158015612c45573d6000803e3d6000fd5b5050505060005b600380549050811015612d3f578173ffffffffffffffffffffffffffffffffffffffff1660038281548110612c7d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f50616972206164647265737320616c726561647920616464656400000000000081525060200191505060405180910390fd5b8080600101915050612c4c565b506003819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e3b57600080fd5b600560149054906101000a900460ff1680612e5a5750612e596126c2565b5b80612eae5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612f03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146d86023913960400191505060405180910390fd5b612f0e3385856135c4565b50600191505092915050565b60135481565b60125481565b60095481565b600d5481565b600080600d54830390506000612f6962015180612f5b620f42408561395490919063ffffffff16565b6134ba90919063ffffffff16565b90506000612fc0620f4240612fb284612fa4620f4240612f96600f5460175461395490919063ffffffff16565b6134ba90919063ffffffff16565b61395490919063ffffffff16565b6134ba90919063ffffffff16565b905060011515601060009054906101000a900460ff161515141561301f5761301c620f424061300e60125460115410612ffb57601254612fff565b6011545b8461395490919063ffffffff16565b6134ba90919063ffffffff16565b90505b809350505050919050565b6130326126c2565b61303b57600080fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61309e6126c2565b6130a757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561316b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f526f75746572206164647265737320616c72656164792073657400000000000081525060200191505060405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601060009054906101000a900460ff1681565b6131ca6126c2565b6131d357600080fd5b826014806101000a81548160ff0219169083151502179055506132298261321b836012600a0a620f4240026000198161320857fe5b06600019036134ba90919063ffffffff16565b61395490919063ffffffff16565b601581905550505050565b600560149054906101000a900460ff1681565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6132a56126c2565b6132ae57600080fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601b6020528060005260406000206000915054906101000a900460ff1681565b6000601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6133b86126c2565b6133c157600080fd5b6133ca816139da565b50565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6003818154811061340357600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808284019050838110156134b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006134fc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ad4565b905092915050565b60008383111582906135b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561357657808201518184015260208101905061355b565b50505050905090810190601f1680156135a35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000601660009054906101000a900460ff16156135ed576135e6848484613b9a565b9050613824565b60006136046018548461395490919063ffffffff16565b905061360e613cea565b1561361c5761361b613dc0565b5b60011515601060009054906101000a900460ff16151514156136565761364f60135460115461343290919063ffffffff16565b6011819055505b6136a881601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461382b90919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006136f7868661438f565b613701578161370d565b61370c8686846144e6565b5b905061376181601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef613808601854856134ba90919063ffffffff16565b6040518082815260200191505060405180910390a36001925050505b9392505050565b600061386d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613504565b905092915050565b600061388042612f32565b90506138978160175461343290919063ffffffff16565b6017819055506000196fffffffffffffffffffffffffffffffff1660175411156138d7576000196fffffffffffffffffffffffffffffffff166017819055505b6139046017546012600a0a620f424002600019816138f157fe5b06600019036134ba90919063ffffffff16565b60188190555080600e8190555042600d81905550620f42406011819055506017547fafae32ce2847c13a56ab802c034c27d3c19f1d61be48c424c5df134145cd44d060405160405180910390a250565b60008083141561396757600090506139d4565b600082840290508284828161397857fe5b04146139cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806146b76021913960400191505060405180910390fd5b809150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613a1457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290613b80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b45578082015181840152602081019050613b2a565b50505050905090810190601f168015613b725780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b8c57fe5b049050809150509392505050565b600080613bb26018548461395490919063ffffffff16565b9050613c0681601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461382b90919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c9b81601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060019150509392505050565b6000801515601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148015613d585750601660009054906101000a900460ff16155b8015613d6e575060148054906101000a900460ff165b8015613dbb5750601554601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b905090565b6001601660006101000a81548160ff0219169083151502179055506000613e31601854601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134ba90919063ffffffff16565b90506000613e716002613e63600b54613e556008548761395490919063ffffffff16565b6134ba90919063ffffffff16565b6134ba90919063ffffffff16565b90506000613e88828461382b90919063ffffffff16565b90506000600267ffffffffffffffff81118015613ea457600080fd5b50604051908082528060200260200182016040528015613ed35781602001602082028036833780820191505090505b5090503081600081518110613ee457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613f8657600080fd5b505afa158015613f9a573d6000803e3d6000fd5b505050506040513d6020811015613fb057600080fd5b810190808051906020019092919050505081600181518110613fce57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000479050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156140d15780820151818401526020810190506140b6565b505050509050019650505050505050600060405180830381600087803b1580156140fa57600080fd5b505af115801561410e573d6000803e3d6000fd5b505050506000614127824761382b90919063ffffffff16565b9050600061415561414460026008546134ba90919063ffffffff16565b600b5461382b90919063ffffffff16565b905060006141936002614185846141776008548861395490919063ffffffff16565b6134ba90919063ffffffff16565b6134ba90919063ffffffff16565b905060008711156142de57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308a600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200196505050505050506060604051808303818588803b15801561428a57600080fd5b505af115801561429e573d6000803e3d6000fd5b50505050506040513d60608110156142b557600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050505050505b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405180600001905060006040518083038185875af1925050503d8060008114614360576040519150601f19603f3d011682016040523d82523d6000602084013e614365565b606091505b505090505050505050505050506000601660006101000a81548160ff021916908315150217905550565b6000601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806144325750601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80156144de5750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156144dd5750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b905092915050565b600080600b54905060011515601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561455f5761455c600a548261343290919063ffffffff16565b90505b6000614588600c5461457a848761395490919063ffffffff16565b6134ba90919063ffffffff16565b90506145dc81601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461343290919063ffffffff16565b601960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef614683601854856134ba90919063ffffffff16565b6040518082815260200191505060405180910390a36146ab818561382b90919063ffffffff16565b92505050939250505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77496e697469616c20646973746972627574696f6e206e6f742066696e616c697a65642e4e6f742061757468726f697a656420746f206578656375746520746869732066756e6374696f6e2ea26469706673582212202051c763be90df5abcaad584766454277d17589b720540d17c8f2b28b3cac83564736f6c63430007060033

Deployed ByteCode Sourcemap

11930:23298:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11569:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34837:351;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29154:286;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13009:35;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18502:102;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34539:290;;;;;;;;;;;;;:::i;:::-;;12944:58;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24132:457;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12143:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20538:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33383:215;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12911:26;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13112:34;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29868:114;;;;;;;;;;;;;:::i;:::-;;13263:45;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11755:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32043:325;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28510:439;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18114:247;;;;;;;;;;;;;:::i;:::-;;13153:58;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19827:106;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17575:406;;;;;;;;;;;;;:::i;:::-;;33699:126;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13487:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34096:435;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21529:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3290:126;;;;;;;;;;;;;:::i;:::-;;30447:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14037:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33606:85;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32663:185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3025:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3190:92;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11660:87;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12832:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12182:40;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27363:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33833:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19358:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18813:248;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13385:62;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13315:63;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12870:34;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13053:52;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15902:869;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20137:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28112:184;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13220:36;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31502:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12229:39;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29614:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30155:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13984:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21062:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3424:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13456:24;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12106:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11569:83;11606:13;11639:5;11632:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11569:83;:::o;34837:351::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;34992:1:::1;34950:13;34943:31;;;34983:4;34943:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;:50;34921:121;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;35060:13;35053:30;;;35098:10;35130:13;35123:31;;;35163:4;35123:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;35053:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;34837:351:::0;:::o;29154:286::-;29290:4;15484:27;;;;;;;;;;;:57;;;;15532:9;:7;:9::i;:::-;15484:57;:104;;;;15562:14;:26;15577:10;15562:26;;;;;;;;;;;;;;;;;;;;;;;;;15484:104;15462:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29353:5:::1;29312:17;:29;29330:10;29312:29;;;;;;;;;;;;;;;:38;29342:7;29312:38;;;;;;;;;;;;;;;:46;;;;29395:7;29374:36;;29383:10;29374:36;;;29404:5;29374:36;;;;;;;;;;;;;;;;;;29428:4;29421:11;;29154:286:::0;;;;:::o;13009:35::-;;;;:::o;18502:102::-;18557:7;18584:12;;18577:19;;18502:102;:::o;34539:290::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;34632:1:::1;34608:21;:25;34600:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;34668:12;34694:10;34686:24;;34732:21;34686:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34667:101;;;34787:7;34779:42;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;3173:1;34539:290::o:0;12944:58::-;;;;:::o;24132:457::-;24275:4;24262:2;15748:3;15734:18;;:2;:18;;;;15726:27;;;;;;24343:2:::1;24296:17;:23;24314:4;24296:23;;;;;;;;;;;;;;;:35;24320:10;24296:35;;;;;;;;;;;;;;;;:50;24292:225;;24401:104;24473:5;24401:104;;;;;;;;;;;;;;;;::::0;:17:::1;:23;24419:4;24401:23;;;;;;;;;;;;;;;:67;24443:10;24401:67;;;;;;;;;;;;;;;;:71;;:104;;;;;:::i;:::-;24363:17;:23;24381:4;24363:23;;;;;;;;;;;;;;;:35;24387:10;24363:35;;;;;;;;;;;;;;;:142;;;;24292:225;24529:30;24543:4;24549:2;24553:5;24529:13;:30::i;:::-;;24577:4;24570:11;;24132:457:::0;;;;;;:::o;12143:32::-;;;;;;;;;;;;;:::o;20538:172::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;20695:7:::1;20659:23;:33;20683:8;20659:33;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;20538:172:::0;;:::o;33383:215::-;33436:7;33476:114;33559:16;;33477:58;33516:12;:18;12634:42;33516:18;;;;;;;;;;;;;;;;33477:34;33492:12;:18;12553:42;33492:18;;;;;;;;;;;;;;;;12455:2;12811;:12;12799:9;:24;12512:1;12503:11;13673:38;;;;;;12512:1;12503:11;13658:54;33477:14;;:34;;;;:::i;:::-;:38;;:58;;;;:::i;:::-;33476:64;;:114;;;;:::i;:::-;33456:134;;33383:215;:::o;12911:26::-;;;;:::o;13112:34::-;;;;:::o;29868:114::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;29970:4:::1;29940:27;;:34;;;;;;;;;;;;;;;;;;29868:114::o:0;13263:45::-;;;;:::o;11755:83::-;11796:5;11821:9;;;;;;;;;;;11814:16;;11755:83;:::o;32043:325::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;32232:8:::1;32213:16;;:27;;;;;;;;;;;;;;;;;;32276:23;32251:22;:48;;;;32336:24;32310:23;:50;;;;32043:325:::0;;;:::o;28510:439::-;28643:4;15484:27;;;;;;;;;;;:57;;;;15532:9;:7;:9::i;:::-;15484:57;:104;;;;15562:14;:26;15577:10;15562:26;;;;;;;;;;;;;;;;;;;;;;;;;15484:104;15462:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28706:78:::1;28773:10;28706:17;:29;28724:10;28706:29;;;;;;;;;;;;;;;:62;28750:7;28706:62;;;;;;;;;;;;;;;;:66;;:78;;;;:::i;:::-;28665:17;:29;28683:10;28665:29;;;;;;;;;;;;;;;:38;28695:7;28665:38;;;;;;;;;;;;;;;:119;;;;28848:7;28800:119;;28823:10;28800:119;;;28870:17;:29;28888:10;28870:29;;;;;;;;;;;;;;;:38;28900:7;28870:38;;;;;;;;;;;;;;;;28800:119;;;;;;;;;;;;;;;;;;28937:4;28930:11;;28510:439:::0;;;;:::o;18114:247::-;18231:4;18192:43;;:23;:35;18216:10;18192:35;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;18170:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18338:15;18316:19;:37;;;;18114:247::o;13153:58::-;;;;:::o;19827:106::-;19876:16;19912:13;19905:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19827:106;:::o;17575:406::-;17681:4;17642:43;;:23;:35;17666:10;17642:35;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;17620:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17758:9;:7;:9::i;:::-;17785;17780:194;17804:13;:20;;;;17800:1;:24;17780:194;;;17886:4;17850:40;;:14;:32;17865:13;17879:1;17865:16;;;;;;;;;;;;;;;;;;;;;;;;;17850:32;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;17846:117;;;17923:13;17937:1;17923:16;;;;;;;;;;;;;;;;;;;;;;;;;17911:34;;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17846:117;17826:3;;;;;;;17780:194;;;;17575:406::o;33699:126::-;33752:7;33779:38;33800:16;;33779;;:20;;:38;;;;:::i;:::-;33772:45;;33699:126;:::o;13487:30::-;;;;;;;;;;;;:::o;34096:435::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;34292:13:::1;34277:12;:28;;;;34333:15;34316:14;:32;;;;34369:8;34359:7;:18;;;;34399:32;34416:14;;34399:12;;:16;;:32;;;;:::i;:::-;34388:8;:43;;;;34459:15;34442:14;:32;;;;34521:1;34504:14;;:18;;;;;;34493:8;;:29;34485:38;;;::::0;::::1;;34096:435:::0;;;;:::o;21529:138::-;21593:7;21620:39;21642:16;;21620:12;:17;21633:3;21620:17;;;;;;;;;;;;;;;;:21;;:39;;;;:::i;:::-;21613:46;;21529:138;;;:::o;3290:126::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;3371:6:::1;;;;;;;;;;;3352:26;;;;;;;;;;;;3406:1;3389:6;;:19;;;;;;;;;;;;;;;;;;3290:126::o:0;30447:101::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;30536:4:::1;30514:12;:19;30527:5;30514:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;30447:101:::0;:::o;14037:55::-;;;;;;;;;;;;;;;;;;;;;;:::o;33606:85::-;33652:4;33677:6;;;;;;;;;;;33676:7;33669:14;;33606:85;:::o;32663:185::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;32831:9:::1;12405:7;32805:11;:22;32804:36;;;;;;32783:18;:57;;;;32663:185:::0;;:::o;3025:79::-;3063:7;3090:6;;;;;;;;;;;3083:13;;3025:79;:::o;3190:92::-;3230:4;3268:6;;;;;;;;;;;3254:20;;:10;:20;;;3247:27;;3190:92;:::o;11660:87::-;11699:13;11732:7;11725:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11660:87;:::o;12832:31::-;;;;:::o;12182:40::-;;;;;;;;;;;;;:::o;27363:629::-;27501:4;15484:27;;;;;;;;;;;:57;;;;15532:9;:7;:9::i;:::-;15484:57;:104;;;;15562:14;:26;15577:10;15562:26;;;;;;;;;;;;;;;;;;;;;;;;;15484:104;15462:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27523:16:::1;27542:17;:29;27560:10;27542:29;;;;;;;;;;;;;;;:38;27572:7;27542:38;;;;;;;;;;;;;;;;27523:57;;27614:8;27595:15;:27;27591:237;;27680:1;27639:17;:29;27657:10;27639:29;;;;;;;;;;;;;;;:38;27669:7;27639:38;;;;;;;;;;;;;;;:42;;;;27591:237;;;27755:61;27786:15;27755:8;:12;;:61;;;;:::i;:::-;27714:17;:29;27732:10;27714:29;;;;;;;;;;;;;;;:38;27744:7;27714:38;;;;;;;;;;;;;;;:102;;;;27591:237;27891:7;27843:119;;27866:10;27843:119;;;27913:17;:29;27931:10;27913:29;;;;;;;;;;;;;;;:38;27943:7;27913:38;;;;;;;;;;;;;;;;27843:119;;;;;;;;;;;;;;;;;;27980:4;27973:11;;;27363:629:::0;;;;:::o;33833:255::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;33997::::1;33977:17;;:38;;;;;;;;;;;;;;;;;;34054:26;34026:25;;:54;;;;;;;;;;;;;;;;;;33833:255:::0;;:::o;19358:346::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;19440:8:::1;19428:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19474:9;19469:145;19493:13;:20;;;;19489:1;:24;19469:145;;;19563:8;19543:28;;:13;19557:1;19543:16;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;;19535:67;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;19515:3;;;;;;;19469:145;;;;19626:13;19645:8;19626:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19692:4;19665:14;:24;19680:8;19665:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;19358:346:::0;:::o;18813:248::-;18973:4;18918:2;15748:3;15734:18;;:2;:18;;;;15726:27;;;;;;15484::::1;;;;;;;;;;;:57;;;;15532:9;:7;:9::i;:::-;15484:57;:104;;;;15562:14;:26;15577:10;15562:26;;;;;;;;;;;;;;;;;;;;;;;;;15484:104;15462:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18995:36:::2;19009:10;19021:2;19025:5;18995:13;:36::i;:::-;;19049:4;19042:11;;18813:248:::0;;;;;:::o;13385:62::-;;;;:::o;13315:63::-;;;;:::o;12870:34::-;;;;:::o;13053:52::-;;;;:::o;15902:869::-;15966:7;15986:28;16030:19;;16017:10;:32;15986:63;;16062:42;16107:83;12726:5;16107:48;12405:7;16107:20;:38;;:48;;;;:::i;:::-;:66;;:83;;;;:::i;:::-;16062:128;;16203:23;16229:160;12405:7;16229:132;16326:34;16229:78;12405:7;16229:50;16260:18;;16229:12;;:30;;:50;;;;:::i;:::-;:68;;:78;;;;:::i;:::-;:96;;:132;;;;:::i;:::-;:150;;:160;;;;:::i;:::-;16203:186;;16426:4;16406:24;;:16;;;;;;;;;;;:24;;;16402:327;;;16465:252;12405:7;16465:220;16547:22;;16525:19;;:44;:141;;16644:22;;16525:141;;;16597:19;;16525:141;16465:15;:37;;:220;;;;:::i;:::-;:242;;:252;;;;:::i;:::-;16447:270;;16402:327;16748:15;16741:22;;;;;15902:869;;;:::o;20137:154::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;20276:7:::1;20249:14;:24;20264:8;20249:24;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;20137:154:::0;;:::o;28112:184::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;28209:8:::1;28190:27;;28198:6;;;;;;;;;;;28190:27;;;;28182:66;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28279:8;28259:6;;:29;;;;;;;;;;;;;;;;;;28112:184:::0;:::o;13220:36::-;;;;;;;;;;;;;:::o;31502:230::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;31654:8:::1;31640:11;::::0;:22:::1;;;;;;;;;;;;;;;;;;31692:32;31719:4;31692:22;31707:6;12455:2;12811;:12;12799:9;:24;12512:1;12503:11;13673:38;;;;;;12512:1;12503:11;13658:54;31692:14;;:22;;;;:::i;:::-;:26;;:32;;;;:::i;:::-;31673:16;:51;;;;31502:230:::0;;;:::o;12229:39::-;;;;;;;;;;;;;:::o;29614:113::-;29676:4;29700:12;:19;29713:5;29700:19;;;;;;;;;;;;;;;;;;;;;;;;;29693:26;;29614:113;;;:::o;30155:105::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;30248:4:::1;30224:14;:21;30239:5;30224:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;30155:105:::0;:::o;13984:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;21062:192::-;21181:7;21213:17;:24;21231:5;21213:24;;;;;;;;;;;;;;;:33;21238:7;21213:33;;;;;;;;;;;;;;;;21206:40;;21062:192;;;;:::o;3424:109::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;3497:28:::1;3516:8;3497:18;:28::i;:::-;3424:109:::0;:::o;13456:24::-;;;;;;;;;;;;;:::o;12106:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1337:181::-;1395:7;1415:9;1431:1;1427;:5;1415:17;;1456:1;1451;:6;;1443:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1509:1;1502:8;;;1337:181;;;;:::o;2162:132::-;2220:7;2247:39;2251:1;2254;2247:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2240:46;;2162:132;;;;:::o;1670:226::-;1790:7;1823:1;1818;:6;;1826:12;1810:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1850:9;1866:1;1862;:5;1850:17;;1887:1;1880:8;;;1670:226;;;;;:::o;22776:910::-;22895:4;22916:6;;;;;;;;;;;22912:80;;;22946:34;22961:6;22969:2;22973:6;22946:14;:34::i;:::-;22939:41;;;;22912:80;23004:17;23024:28;23035:16;;23024:6;:10;;:28;;;;:::i;:::-;23004:48;;23069:17;:15;:17::i;:::-;23065:61;;;23103:11;:9;:11::i;:::-;23065:61;23162:4;23142:24;;:16;;;;;;;;;;;:24;;;23138:159;;;23205:80;23247:23;;23205:19;;:23;;:80;;;;:::i;:::-;23183:19;:102;;;;23138:159;23332:35;23357:9;23332:12;:20;23345:6;23332:20;;;;;;;;;;;;;;;;:24;;:35;;;;:::i;:::-;23309:12;:20;23322:6;23309:20;;;;;;;;;;;;;;;:58;;;;23380:25;23408:26;23423:6;23431:2;23408:14;:26::i;:::-;:98;;23497:9;23408:98;;;23450:31;23459:6;23467:2;23471:9;23450:8;:31::i;:::-;23408:98;23380:126;;23536:39;23557:17;23536:12;:16;23549:2;23536:16;;;;;;;;;;;;;;;;:20;;:39;;;;:::i;:::-;23517:12;:16;23530:2;23517:16;;;;;;;;;;;;;;;:58;;;;23610:2;23593:61;;23602:6;23593:61;;;23614:39;23636:16;;23614:17;:21;;:39;;;;:::i;:::-;23593:61;;;;;;;;;;;;;;;;;;23674:4;23667:11;;;;22776:910;;;;;;:::o;1526:136::-;1584:7;1611:43;1615:1;1618;1611:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1604:50;;1526:136;;;;:::o;16934:487::-;16973:19;16995:30;17009:15;16995:13;:30::i;:::-;16973:52;;17051:38;17076:11;17051:12;;:16;;:38;;;;:::i;:::-;17036:12;:53;;;;13766:1;13757:11;17121:10;;17106:12;;:25;17102:83;;;13766:1;13757:11;17163:10;;17148:12;:25;;;;17102:83;17216:28;17231:12;;12455:2;12811;:12;12799:9;:24;12512:1;12503:11;13673:38;;;;;;12512:1;12503:11;13658:54;17216:14;;:28;;;;:::i;:::-;17197:16;:47;;;;17275:11;17257:15;:29;;;;17319:15;17297:19;:37;;;;12405:7;17345:19;:30;;;;17400:12;;17393:20;;;;;;;;;;16934:487;:::o;1904:250::-;1962:7;1991:1;1986;:6;1982:47;;;2016:1;2009:8;;;;1982:47;2041:9;2057:1;2053;:5;2041:17;;2086:1;2081;2077;:5;;;;;;:10;2069:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2145:1;2138:8;;;1904:250;;;;;:::o;3541:187::-;3635:1;3615:22;;:8;:22;;;;3607:31;;;;;;3683:8;3654:38;;3675:6;;;;;;;;;;;3654:38;;;;;;;;;;;;3712:8;3703:6;;:17;;;;;;;;;;;;;;;;;;3541:187;:::o;2302:225::-;2422:7;2454:1;2450;:5;2457:12;2442:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2481:9;2497:1;2493;:5;;;;;;2481:17;;2518:1;2511:8;;;2302:225;;;;;:::o;22005:339::-;22123:4;22140:17;22160:28;22171:16;;22160:6;:10;;:28;;;;:::i;:::-;22140:48;;22220:33;22243:9;22220:12;:18;22233:4;22220:18;;;;;;;;;;;;;;;;:22;;:33;;;;:::i;:::-;22199:12;:18;22212:4;22199:18;;;;;;;;;;;;;;;:54;;;;22283:31;22304:9;22283:12;:16;22296:2;22283:16;;;;;;;;;;;;;;;;:20;;:31;;;;:::i;:::-;22264:12;:16;22277:2;22264:16;;;;;;;;;;;;;;;:50;;;;22332:4;22325:11;;;22005:339;;;;;:::o;32997:246::-;33047:4;33114:5;33084:35;;:14;:26;33099:10;33084:26;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;:59;;;;;33137:6;;;;;;;;;;;33136:7;33084:59;:87;;;;;33160:11;;;;;;;;;;33084:87;:151;;;;;33219:16;;33188:12;:27;33209:4;33188:27;;;;;;;;;;;;;;;;:47;;33084:151;33064:171;;32997:246;:::o;24776:1466::-;15359:4;15350:6;;:13;;;;;;;;;;;;;;;;;;24830:28:::1;24861:73;24907:16;;24861:12;:27;24882:4;24861:27;;;;;;;;;;;;;;;;:31;;:73;;;;:::i;:::-;24830:104;;24945:23;24971:101;25070:1;24971:80;25042:8;;24971:52;25010:12;;24971:20;:38;;:52;;;;:::i;:::-;:70;;:80;;;;:::i;:::-;:98;;:101;;;;:::i;:::-;24945:127;;25083:20;25106:41;25131:15;25106:20;:24;;:41;;;;:::i;:::-;25083:64;;25160:21;25198:1;25184:16;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25160:40;;25229:4;25211;25216:1;25211:7;;;;;;;;;;;;;:23;;;;;;;;;::::0;::::1;25255:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;25245:4;25250:1;25245:7;;;;;;;;;;;;;:23;;;;;;;;;::::0;::::1;25281:21;25305;25281:45;;25339:6;;;;;;;;;;;:57;;;25411:12;25438:1;25454:4;25481;25501:15;25339:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25540:17;25560:40;25586:13;25560:21;:25;;:40;;;;:::i;:::-;25540:60;;25611:19;25633:33;25646:19;25663:1;25646:12;;:16;;:19;;;;:::i;:::-;25633:8;;:12;;:33;;;;:::i;:::-;25611:55;;25679:26;25708:93;25799:1;25708:72;25768:11;25708:41;25736:12;;25708:9;:27;;:41;;;;:::i;:::-;:59;;:72;;;;:::i;:::-;:90;;:93;;;;:::i;:::-;25679:122;;25836:1;25818:15;:19;25814:292;;;25854:6;;;;;;;;;;;:22;;;25884:18;25930:4;25954:15;25988:1;26008::::0;26028:17:::1;;;;;;;;;;;26064:15;25854:240;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25814:292;26119:12;26145:25;;;;;;;;;;;26137:39;;26198:21;26137:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26118:116;;;15374:1;;;;;;;;;15395:5:::0;15386:6;;:14;;;;;;;;;;;;;;;;;;24776:1466::o;30977:253::-;31077:4;31120:14;:20;31135:4;31120:20;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;;31144:14;:18;31159:2;31144:18;;;;;;;;;;;;;;;;;;;;;;;;;31120:42;31119:103;;;;;31182:12;:18;31195:4;31182:18;;;;;;;;;;;;;;;;;;;;;;;;;31181:19;:40;;;;;31205:12;:16;31218:2;31205:16;;;;;;;;;;;;;;;;;;;;;;;;;31204:17;31181:40;31119:103;31099:123;;30977:253;;;;:::o;26586:560::-;26703:7;26723:17;26743:8;;26723:28;;26788:4;26766:26;;:14;:18;26781:2;26766:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;26762:66;;;26806:22;26820:7;;26806:9;:13;;:22;;;;:::i;:::-;26794:34;;26762:66;26841:17;26861:44;26890:14;;26861:24;26875:9;26861;:13;;:24;;;;:::i;:::-;:28;;:44;;;;:::i;:::-;26841:64;;26948:66;26994:9;26948:12;:27;26969:4;26948:27;;;;;;;;;;;;;;;;:31;;:66;;;;:::i;:::-;26918:12;:27;26939:4;26918:27;;;;;;;;;;;;;;;:96;;;;27055:4;27030:64;;27039:6;27030:64;;;27062:31;27076:16;;27062:9;:13;;:31;;;;:::i;:::-;27030:64;;;;;;;;;;;;;;;;;;27114:24;27128:9;27114;:13;;:24;;;;:::i;:::-;27107:31;;;;26586:560;;;;;:::o

Swarm Source

ipfs://2051c763be90df5abcaad584766454277d17589b720540d17c8f2b28b3cac835
Loading