ETH Price: $2,674.90 (-2.56%)

Token

Skyward (SKY)
 

Overview

Max Total Supply

100,000,000 SKY

Holders

77 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
chadwickposman.eth
Balance
0.162461195363850472 SKY

Value
$0.00
0xcc3b12b411a68937617cf38189231f66b9905f4f
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

An utility based token that offers rewards in the form of staking interest, bonus tokens on purchase and upcoming DeFi related services. Stakers who have staked a predetermined amount of SKY tokens will gain access to all future dApps and services developed under the Skyward brand for free.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Skyward

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin\contracts\utils\Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin\contracts\access\Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin\contracts\token\ERC20\IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

// File: @openzeppelin\contracts\token\ERC20\extensions\IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

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

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

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

// File: @openzeppelin\contracts\token\ERC20\ERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;



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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

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

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

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

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: contracts\Skyward.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

/* ------------------------------------------ Imports ------------------------------------------ */


/* -------------------------------------- Dex Interfaces --------------------------------------- */

interface IDexFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

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

/* --------------------------------------- Main Contract --------------------------------------- */

contract Skyward is ERC20, Ownable {

    /* ----------------------------------- State Variables ------------------------------------ */

    IDexRouter private immutable uniswapV2Router;
    address private immutable uniswapV2Pair;
    address[] private wethContractPath;
    mapping (address => bool) private excludedFromFees;
    mapping (address => uint256) public owedRewards;

    address public skyRewards;
    address public skyTreasury;

    uint256 public maxWallet;
    uint256 public baseFees;
    uint256 public liquidityFee;
    uint256 public treasuryFee;
    uint256 private swapTokensAtAmount;
    uint256 private tokensForLiquidity;
    uint256 private tokensForTreasury;

    uint256 public bonusRewards;
    uint256 public bonusRewardsMultiplier;
    uint256 public rewardsFee;
    uint256 public rewardsFeeMultiplier;

    uint256 public currentAth;
    uint256 public currentPrice;
    uint256 public resetAthTime;
    uint256 public supportThreshold;

    event AthReset(uint256 newAth);
    event UpdatedBaseFees(uint256 newAmount);
    event UpdatedMaxWallet(uint256 newAmount);
    event UpdatedMultipliers(uint256 newBonus, uint256 newRewards);
    event UpdatedSkyRewardsAddress(address indexed newWallet);
    event UpdatedSkyTreasuryAddress(address indexed newWallet);
    event UpdatedSupportThreshold(uint256 newThreshold);

    /* --------------------------------- Contract Constructor --------------------------------- */

    constructor(address dexRouter) ERC20("Skyward", "SKY") {
        uniswapV2Router = IDexRouter(dexRouter);
        uniswapV2Pair = IDexFactory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());

        uint256 totalSupply = 100000000 * 10**18;
        swapTokensAtAmount = totalSupply * 1 / 4000;
        maxWallet = totalSupply * 2 / 100;
        treasuryFee = 9;
        liquidityFee = 1;
        baseFees = treasuryFee + liquidityFee;
        supportThreshold = 10;
        bonusRewardsMultiplier = 2;
        rewardsFeeMultiplier = 2;

        excludeFromFees(msg.sender, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0), true);

        wethContractPath = [uniswapV2Router.WETH(), address(this)];
        
        _mint(msg.sender, totalSupply);
        transferOwnership(msg.sender);
    }

    receive() external payable {}

    /* ------------------------------- Main Contract Functions -------------------------------- */

    // Transfer tokens
    function _transfer(address from, address to, uint256 amount) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Amount must be greater than 0");
        
        if (!excludedFromFees[from] && !excludedFromFees[to]) {
            if (to != uniswapV2Pair) {
                require(amount + balanceOf(to) <= maxWallet, "Exceeds max wallet");
            }

            checkPrice();

            if (from == uniswapV2Pair) {
                uint256 bonus = 0;
                bonus = amount * bonusRewards / 100 + owedRewards[to];
                if (bonus > 0) {
                    if (bonus <= balanceOf(skyRewards)) {
                        super._transfer(skyRewards, to, bonus);
                        delete owedRewards[to];
                    } else {
                        owedRewards[to] += bonus;
                    }
                }
            } else if (to == uniswapV2Pair && baseFees > 0) {
                if (balanceOf(address(this)) >= swapTokensAtAmount) {
                    swapBack();
                }

                uint256 fees = 0;
                uint256 penaltyFees = 0;
                fees = amount * baseFees / 100;
                penaltyFees = amount * rewardsFee / 100;
                tokensForTreasury += fees * treasuryFee / baseFees;
                tokensForLiquidity += fees * liquidityFee / baseFees;
                if (fees > 0) {
                    super._transfer(from, address(this), fees);
                }

                if (penaltyFees > 0) {
                    super._transfer(from, skyRewards, penaltyFees);
                }

                if (owedRewards[from] > 0 && owedRewards[from] <= balanceOf(skyRewards)) {
                    super._transfer(skyRewards, from, owedRewards[from]);
                    delete owedRewards[from];
                }
                amount -= fees + penaltyFees;
            }
        }
        super._transfer(from, to, amount);
    }

    // Claim owed rewards (manual implementation)
    function claimOwed() external {
        require(owedRewards[msg.sender] > 0, "You have no owed rewards");
        require(owedRewards[msg.sender] <= balanceOf(skyRewards), "Insufficient rewards in rewards pool");
        super._transfer(skyRewards, msg.sender, owedRewards[msg.sender]);
        delete owedRewards[msg.sender];
    }

    /* ----------------------------------- Owner Functions ------------------------------------ */

    // Withdraw stuck ETH
    function clearStuckBalance() external onlyOwner {
        bool success;
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }

    // Exclude an address from transaction fees
    function excludeFromFees(address account, bool excluded) public onlyOwner {
        excludedFromFees[account] = excluded;
    }

    // Set the current ATH to current price (manual implementation)
    function resetAthManual() external onlyOwner {
        currentPrice = getCurrentPrice();
        require(currentPrice != 0, "Not a valid price");
        resetAth(currentPrice);
        emit AthReset(currentPrice);
    }

    // Designate rewards address
    function setSkyRewardsAddress(address _skyRewards) external onlyOwner {
        require(_skyRewards != address(0), "_skyRewards address cannot be the zero address");
        skyRewards = _skyRewards;
        emit UpdatedSkyRewardsAddress(skyRewards);
    }
    
    // Designate treasury address
    function setSkyTreasuryAddress(address _skyTreasury) external onlyOwner {
        require(_skyTreasury != address(0), "_skyTreasury address cannot be the zero address");
        skyTreasury = payable(_skyTreasury);
        emit UpdatedSkyTreasuryAddress(skyTreasury);
    }

    // Withdraw non-native tokens
    function transferForeignToken(address _token, address _to) external onlyOwner returns (bool _sent) {
        require(_token != address(0), "_token address cannot be the zero address");
        require(_token != address(this), "Can't withdraw native tokens");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
    }

    // Update fees
    function updateFees(uint256 _treasuryFee, uint256 _liquidityFee) external onlyOwner {
        require(_treasuryFee + _liquidityFee <= 10, "Must keep fees at 10% or less");
        treasuryFee = _treasuryFee;
        liquidityFee = _liquidityFee;
        baseFees = treasuryFee + liquidityFee;
        emit UpdatedBaseFees(baseFees);
    }

    // Update max wallet
    function updateMaxWallet(uint256 _maxWallet) external onlyOwner {
        require(_maxWallet > 0, "Max wallet must be greater than 0%");
        maxWallet = totalSupply() * _maxWallet / 100;
        emit UpdatedMaxWallet(maxWallet);
    }

    // Update bonus rewards and rewards fee multipliers
    function updateMultipliers(uint256 _bonusRewardsMultiplier, uint256 _rewardsFeeMultiplier) external onlyOwner {
        require(_bonusRewardsMultiplier > 0, "Bonus rewards multiplier cannot be 0");
        require(_bonusRewardsMultiplier <= 5, "Bonus rewards multiplier greater than 5");
        require(_rewardsFeeMultiplier <= 2, "Rewards fee multiplier greater than 2");
        bonusRewardsMultiplier = _bonusRewardsMultiplier;
        rewardsFeeMultiplier = _rewardsFeeMultiplier;
        emit UpdatedMultipliers(bonusRewardsMultiplier, rewardsFeeMultiplier);
    }

    // Update support threshold
    function updateSupportThreshold(uint256 _supportThreshold) external onlyOwner {
        require(_supportThreshold >= 5 , "Threshold lower than 5%");
        require(_supportThreshold <= 20, "Threshold greater than 20%");
        supportThreshold = _supportThreshold;
        emit UpdatedSupportThreshold(supportThreshold);
    }

    // Update token threshold for when the contract sells for liquidity and treasury
    function updateSwapTokensAtAmount(uint256 _swapTokensAtAmount) external onlyOwner { 
  	    require(_swapTokensAtAmount <= (totalSupply() * 1 / 1000) / 10**18, "Threshold higher than 0.1% total supply");
  	    swapTokensAtAmount = _swapTokensAtAmount * 10**18;
  	}

    /* ------------------------------- Private Helper Functions ------------------------------- */

    // Liquidity injection helper function
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    // Check current price and modify bonus rewards & reward fees accordingly
    function checkPrice() private {
        currentPrice = getCurrentPrice();
        require(currentPrice != 0, "Not a valid price");

        if (currentPrice <= currentAth || currentAth == 0) {
            resetAth(currentPrice);
        } else if (currentPrice > currentAth) {
            if (resetAthTime == 0) {
                resetAthTime = block.timestamp + 7 * 1 days;
            } else {
                if (block.timestamp >= resetAthTime) {
                    resetAth(currentPrice);
                }
            }

            uint256 priceDifference = (10000 - (10000 * currentAth / currentPrice));

            if (priceDifference / 100 >= supportThreshold) {
                bonusRewards = bonusRewardsMultiplier * supportThreshold;
                rewardsFee = rewardsFeeMultiplier * supportThreshold;
            } else {
                if (priceDifference % 100 >= 50) {
                    bonusRewards = bonusRewardsMultiplier * ((priceDifference / 100) + 1);
                    rewardsFee = rewardsFeeMultiplier * ((priceDifference / 100) + 1);
                } else {
                    bonusRewards = bonusRewardsMultiplier * ((priceDifference / 100));
                    rewardsFee = rewardsFeeMultiplier * ((priceDifference / 100));
                }
            }
        }
    }

    // Set the current ATH to current price
    function resetAth(uint256 _currentPrice) private {
        currentAth = _currentPrice;
        resetAthTime = 0;
        bonusRewards = 0;
        rewardsFee = 0;
    }

    // Contract sells for liquidity and treasury
    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForTreasury + tokensForLiquidity;
        
        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 10) {
            contractBalance = swapTokensAtAmount * 10;
        }

        bool success;
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        swapTokensForETH(contractBalance - liquidityTokens); 

        uint256 ethBalance = address(this).balance;
        uint256 ethForTreasury = ethBalance * tokensForTreasury / (totalTokensToSwap - (tokensForLiquidity / 2));
        uint256 ethForLiquidity = ethBalance - ethForTreasury;

        tokensForLiquidity = 0;
        tokensForTreasury = 0;
        
        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
        }

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

    // Swap native token for ETH
    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    /* -------------------------------- Public View Functions --------------------------------- */

    // Retrieve current exchange rate of native token for 1 WETH
    function getCurrentPrice() public view returns (uint256) {
        try uniswapV2Router.getAmountsOut(1 * 10**18, wethContractPath) returns (uint256[] memory amounts) {
            return amounts[1];
        } catch {
            return 0;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"dexRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAth","type":"uint256"}],"name":"AthReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedBaseFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newBonus","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewards","type":"uint256"}],"name":"UpdatedMultipliers","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedSkyRewardsAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedSkyTreasuryAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"UpdatedSupportThreshold","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusRewardsMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentAth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentPrice","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":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"owedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetAthManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetAthTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsFeeMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_skyRewards","type":"address"}],"name":"setSkyRewardsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_skyTreasury","type":"address"}],"name":"setSkyTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"skyRewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"skyTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supportThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[{"internalType":"bool","name":"_sent","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bonusRewardsMultiplier","type":"uint256"},{"internalType":"uint256","name":"_rewardsFeeMultiplier","type":"uint256"}],"name":"updateMultipliers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supportThreshold","type":"uint256"}],"name":"updateSupportThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapTokensAtAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b5060405162005e6b38038062005e6b833981810160405281019062000037919062000ad8565b6040518060400160405280600781526020017f536b7977617264000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f534b5900000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000bb9291906200092f565b508060049080519060200190620000d49291906200092f565b505050620000f7620000eb620004b660201b60201c565b620004be60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000179573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019f919062000ad8565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000209573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022f919062000ad8565b6040518363ffffffff1660e01b81526004016200024e92919062000b1b565b6020604051808303816000875af11580156200026e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000294919062000ad8565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505060006a52b7d2dcc80cd2e40000009050610fa0600182620002e9919062000b81565b620002f5919062000c11565b600f8190555060646002826200030c919062000b81565b62000318919062000c11565b600b819055506009600e819055506001600d81905550600d54600e5462000340919062000c49565b600c81905550600a60198190555060026013819055506002601581905550620003713360016200058460201b60201c565b620003843060016200058460201b60201c565b62000398600060016200058460201b60201c565b604051806040016040528060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000417919062000ad8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060069060026200048a929190620009c0565b506200049d33826200066e60201b60201c565b620004ae33620007e660201b60201c565b505062000ec5565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000594620004b660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005ba620008fb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000613576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200060a9062000d07565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620006e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006d79062000d79565b60405180910390fd5b620006f4600083836200092560201b60201c565b806002600082825462000708919062000c49565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200075f919062000c49565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620007c6919062000dac565b60405180910390a3620007e2600083836200092a60201b60201c565b5050565b620007f6620004b660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200081c620008fb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000875576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200086c9062000d07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620008e7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008de9062000e3f565b60405180910390fd5b620008f881620004be60201b60201c565b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b505050565b505050565b8280546200093d9062000e90565b90600052602060002090601f016020900481019282620009615760008555620009ad565b82601f106200097c57805160ff1916838001178555620009ad565b82800160010185558215620009ad579182015b82811115620009ac5782518255916020019190600101906200098f565b5b509050620009bc919062000a4f565b5090565b82805482825590600052602060002090810192821562000a3c579160200282015b8281111562000a3b5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620009e1565b5b50905062000a4b919062000a4f565b5090565b5b8082111562000a6a57600081600090555060010162000a50565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000aa08262000a73565b9050919050565b62000ab28162000a93565b811462000abe57600080fd5b50565b60008151905062000ad28162000aa7565b92915050565b60006020828403121562000af15762000af062000a6e565b5b600062000b018482850162000ac1565b91505092915050565b62000b158162000a93565b82525050565b600060408201905062000b32600083018562000b0a565b62000b41602083018462000b0a565b9392505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b8e8262000b48565b915062000b9b8362000b48565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000bd75762000bd662000b52565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000c1e8262000b48565b915062000c2b8362000b48565b92508262000c3e5762000c3d62000be2565b5b828204905092915050565b600062000c568262000b48565b915062000c638362000b48565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c9b5762000c9a62000b52565b5b828201905092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000cef60208362000ca6565b915062000cfc8262000cb7565b602082019050919050565b6000602082019050818103600083015262000d228162000ce0565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000d61601f8362000ca6565b915062000d6e8262000d29565b602082019050919050565b6000602082019050818103600083015262000d948162000d52565b9050919050565b62000da68162000b48565b82525050565b600060208201905062000dc3600083018462000d9b565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062000e2760268362000ca6565b915062000e348262000dc9565b604082019050919050565b6000602082019050818103600083015262000e5a8162000e18565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000ea957607f821691505b60208210810362000ebf5762000ebe62000e61565b5b50919050565b60805160a051614f4f62000f1c600039600081816125890152818161263d0152612805015260008181611c1f015281816132bb0152818161339c015281816133c30152818161345f01526134860152614f4f6000f3fe6080604052600436106102555760003560e01c806389483fcf11610139578063c0246668116100b6578063ddb382f91161007a578063ddb382f9146108c5578063eb91d37e146108f0578063ee1266e11461091b578063f2652d9c14610944578063f2fde38b1461095b578063f8b45b05146109845761025c565b8063c0246668146107e0578063c545e90c14610809578063cc32d17614610834578063d257b34f1461085f578063dd62ed3e146108885761025c565b806398118cb4116100fd57806398118cb4146106e55780639d11c021146107105780639d1b464a1461073b578063a457c2d714610766578063a9059cbb146107a35761025c565b806389483fcf1461060e5780638da5cb5b14610639578063917c0fd41461066457806391c661031461068f57806395d89b41146106ba5761025c565b806355222648116101d257806370a082311161019657806370a0823114610500578063715018a61461053d5780637c36e8e814610554578063828577b21461057f5780638366e79a146105a85780638680113a146105e55761025c565b8063552226481461044157806363210eb21461046c578063686ee72214610483578063693e7ce4146104ac5780636db79437146104d75761025c565b80632bb14e1d116102195780632bb14e1d1461035a578063313ce56714610385578063364333f4146103b057806339509351146103c75780634b517003146104045761025c565b806306fdde0314610261578063095ea7b31461028c57806318160ddd146102c95780631c499ab0146102f457806323b872dd1461031d5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b506102766109af565b60405161028391906135d3565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae919061369d565b610a41565b6040516102c091906136f8565b60405180910390f35b3480156102d557600080fd5b506102de610a64565b6040516102eb9190613722565b60405180910390f35b34801561030057600080fd5b5061031b6004803603810190610316919061373d565b610a6e565b005b34801561032957600080fd5b50610344600480360381019061033f919061376a565b610b8e565b60405161035191906136f8565b60405180910390f35b34801561036657600080fd5b5061036f610bbd565b60405161037c9190613722565b60405180910390f35b34801561039157600080fd5b5061039a610bc3565b6040516103a791906137d9565b60405180910390f35b3480156103bc57600080fd5b506103c5610bcc565b005b3480156103d357600080fd5b506103ee60048036038101906103e9919061369d565b610cb9565b6040516103fb91906136f8565b60405180910390f35b34801561041057600080fd5b5061042b600480360381019061042691906137f4565b610d63565b6040516104389190613722565b60405180910390f35b34801561044d57600080fd5b50610456610d7b565b6040516104639190613722565b60405180910390f35b34801561047857600080fd5b50610481610d81565b005b34801561048f57600080fd5b506104aa60048036038101906104a5919061373d565b610e96565b005b3480156104b857600080fd5b506104c1610fdd565b6040516104ce9190613830565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f9919061384b565b611003565b005b34801561050c57600080fd5b50610527600480360381019061052291906137f4565b61112f565b6040516105349190613722565b60405180910390f35b34801561054957600080fd5b50610552611177565b005b34801561056057600080fd5b506105696111ff565b6040516105769190613722565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a1919061384b565b611205565b005b3480156105b457600080fd5b506105cf60048036038101906105ca919061388b565b61139b565b6040516105dc91906136f8565b60405180910390f35b3480156105f157600080fd5b5061060c600480360381019061060791906137f4565b6115fb565b005b34801561061a57600080fd5b5061062361178f565b6040516106309190613722565b60405180910390f35b34801561064557600080fd5b5061064e611795565b60405161065b9190613830565b60405180910390f35b34801561067057600080fd5b506106796117bf565b6040516106869190613830565b60405180910390f35b34801561069b57600080fd5b506106a46117e5565b6040516106b19190613722565b60405180910390f35b3480156106c657600080fd5b506106cf6117eb565b6040516106dc91906135d3565b60405180910390f35b3480156106f157600080fd5b506106fa61187d565b6040516107079190613722565b60405180910390f35b34801561071c57600080fd5b50610725611883565b6040516107329190613722565b60405180910390f35b34801561074757600080fd5b50610750611889565b60405161075d9190613722565b60405180910390f35b34801561077257600080fd5b5061078d6004803603810190610788919061369d565b61188f565b60405161079a91906136f8565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c5919061369d565b611979565b6040516107d791906136f8565b60405180910390f35b3480156107ec57600080fd5b50610807600480360381019061080291906138f7565b61199c565b005b34801561081557600080fd5b5061081e611a73565b60405161082b9190613722565b60405180910390f35b34801561084057600080fd5b50610849611a79565b6040516108569190613722565b60405180910390f35b34801561086b57600080fd5b506108866004803603810190610881919061373d565b611a7f565b005b34801561089457600080fd5b506108af60048036038101906108aa919061388b565b611b8e565b6040516108bc9190613722565b60405180910390f35b3480156108d157600080fd5b506108da611c15565b6040516108e79190613722565b60405180910390f35b3480156108fc57600080fd5b50610905611c1b565b6040516109129190613722565b60405180910390f35b34801561092757600080fd5b50610942600480360381019061093d91906137f4565b611cf0565b005b34801561095057600080fd5b50610959611e84565b005b34801561096757600080fd5b50610982600480360381019061097d91906137f4565b612063565b005b34801561099057600080fd5b5061099961215a565b6040516109a69190613722565b60405180910390f35b6060600380546109be90613966565b80601f01602080910402602001604051908101604052809291908181526020018280546109ea90613966565b8015610a375780601f10610a0c57610100808354040283529160200191610a37565b820191906000526020600020905b815481529060010190602001808311610a1a57829003601f168201915b5050505050905090565b600080610a4c612160565b9050610a59818585612168565b600191505092915050565b6000600254905090565b610a76612160565b73ffffffffffffffffffffffffffffffffffffffff16610a94611795565b73ffffffffffffffffffffffffffffffffffffffff1614610aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae1906139e3565b60405180910390fd5b60008111610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2490613a75565b60405180910390fd5b606481610b38610a64565b610b429190613ac4565b610b4c9190613b4d565b600b819055507f3046ad62de8b70d396246aaed19ff2559ff20df8706520cbde58320766c42762600b54604051610b839190613722565b60405180910390a150565b600080610b99612160565b9050610ba6858285612331565b610bb18585856123bd565b60019150509392505050565b60145481565b60006012905090565b610bd4612160565b73ffffffffffffffffffffffffffffffffffffffff16610bf2611795565b73ffffffffffffffffffffffffffffffffffffffff1614610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f906139e3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610c6e90613baf565b60006040518083038185875af1925050503d8060008114610cab576040519150601f19603f3d011682016040523d82523d6000602084013e610cb0565b606091505b50508091505050565b600080610cc4612160565b9050610d58818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d539190613bc4565b612168565b600191505092915050565b60086020528060005260406000206000915090505481565b60155481565b610d89612160565b73ffffffffffffffffffffffffffffffffffffffff16610da7611795565b73ffffffffffffffffffffffffffffffffffffffff1614610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df4906139e3565b60405180910390fd5b610e05611c1b565b601781905550600060175403610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4790613c66565b60405180910390fd5b610e5b601754612b07565b7fdba2849ce7051ebad401db7d34afd1e17133ae1a17ece4e959d4f5d3ea245a64601754604051610e8c9190613722565b60405180910390a1565b610e9e612160565b73ffffffffffffffffffffffffffffffffffffffff16610ebc611795565b73ffffffffffffffffffffffffffffffffffffffff1614610f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f09906139e3565b60405180910390fd5b6005811015610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90613cd2565b60405180910390fd5b6014811115610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190613d3e565b60405180910390fd5b806019819055507fc449df7805aff7118f096cf19920c827bc883697f0b837480b1d0d36ce84b245601954604051610fd29190613722565b60405180910390a150565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61100b612160565b73ffffffffffffffffffffffffffffffffffffffff16611029611795565b73ffffffffffffffffffffffffffffffffffffffff161461107f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611076906139e3565b60405180910390fd5b600a818361108d9190613bc4565b11156110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590613daa565b60405180910390fd5b81600e8190555080600d81905550600d54600e546110ec9190613bc4565b600c819055507fb653f2e021d9b52b9349ba789ebee15f570dfcc0847034b98cbc63d1802f6592600c546040516111239190613722565b60405180910390a15050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61117f612160565b73ffffffffffffffffffffffffffffffffffffffff1661119d611795565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea906139e3565b60405180910390fd5b6111fd6000612b29565b565b60195481565b61120d612160565b73ffffffffffffffffffffffffffffffffffffffff1661122b611795565b73ffffffffffffffffffffffffffffffffffffffff1614611281576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611278906139e3565b60405180910390fd5b600082116112c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bb90613e3c565b60405180910390fd5b6005821115611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff90613ece565b60405180910390fd5b600281111561134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134390613f60565b60405180910390fd5b81601381905550806015819055507f9ae798d83b2479d59606604404d7fee29fabfefea44ec0367a7fe958bcbe440b60135460155460405161138f929190613f80565b60405180910390a15050565b60006113a5612160565b73ffffffffffffffffffffffffffffffffffffffff166113c3611795565b73ffffffffffffffffffffffffffffffffffffffff1614611419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611410906139e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147f9061401b565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed90614087565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115319190613830565b602060405180830381865afa15801561154e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157291906140bc565b90508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b81526004016115af9291906140e9565b6020604051808303816000875af11580156115ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f29190614127565b91505092915050565b611603612160565b73ffffffffffffffffffffffffffffffffffffffff16611621611795565b73ffffffffffffffffffffffffffffffffffffffff1614611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e906139e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd906141c6565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167feaccec827b4a8e31f4d3ea1070356619a0ce082b0d21d163d8ba31d764a4b26a60405160405180910390a250565b60165481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b6060600480546117fa90613966565b80601f016020809104026020016040519081016040528092919081815260200182805461182690613966565b80156118735780601f1061184857610100808354040283529160200191611873565b820191906000526020600020905b81548152906001019060200180831161185657829003601f168201915b5050505050905090565b600d5481565b60135481565b60175481565b60008061189a612160565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195790614258565b60405180910390fd5b61196d8286868403612168565b60019250505092915050565b600080611984612160565b90506119918185856123bd565b600191505092915050565b6119a4612160565b73ffffffffffffffffffffffffffffffffffffffff166119c2611795565b73ffffffffffffffffffffffffffffffffffffffff1614611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f906139e3565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60185481565b600e5481565b611a87612160565b73ffffffffffffffffffffffffffffffffffffffff16611aa5611795565b73ffffffffffffffffffffffffffffffffffffffff1614611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af2906139e3565b60405180910390fd5b670de0b6b3a76400006103e86001611b11610a64565b611b1b9190613ac4565b611b259190613b4d565b611b2f9190613b4d565b811115611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b68906142ea565b60405180910390fd5b670de0b6b3a764000081611b859190613ac4565b600f8190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c5481565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a764000060066040518363ffffffff1660e01b8152600401611c81929190614473565b600060405180830381865afa925050508015611cc057506040513d6000823e3d601f19601f82011682018060405250810190611cbd91906145eb565b60015b611ccd5760009050611ced565b80600181518110611ce157611ce0614634565b5b60200260200101519150505b90565b611cf8612160565b73ffffffffffffffffffffffffffffffffffffffff16611d16611795565b73ffffffffffffffffffffffffffffffffffffffff1614611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d63906139e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd2906146d5565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1712df96f4f74213fc59b69f0189afbfdc3c4f9e0fb860ef2e9afb3bb109fbfd60405160405180910390a250565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd90614741565b60405180910390fd5b611f31600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661112f565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa9906147d3565b60405180910390fd5b61201e600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bef565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055565b61206b612160565b73ffffffffffffffffffffffffffffffffffffffff16612089611795565b73ffffffffffffffffffffffffffffffffffffffff16146120df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d6906139e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361214e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214590614865565b60405180910390fd5b61215781612b29565b50565b600b5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ce906148f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223d90614989565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516123249190613722565b60405180910390a3505050565b600061233d8484611b8e565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146123b757818110156123a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a0906149f5565b60405180910390fd5b6123b68484848403612168565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361242c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242390614a87565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361249b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249290614b19565b60405180910390fd5b600081116124de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d590614b85565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156125825750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612af7577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461263357600b546125e68361112f565b826125f19190613bc4565b1115612632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262990614bf1565b60405180910390fd5b5b61263b612e6e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612803576000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546064601254846126e09190613ac4565b6126ea9190613b4d565b6126f49190613bc4565b905060008111156127fd5761272a600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661112f565b81116127a55761275d600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168483612bef565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090556127fc565b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127f49190613bc4565b925050819055505b5b50612af6565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561286057506000600c54115b15612af557600f546128713061112f565b1061287f5761287e61305d565b5b6000806064600c54846128929190613ac4565b61289c9190613b4d565b91506064601454846128ae9190613ac4565b6128b89190613b4d565b9050600c54600e54836128cb9190613ac4565b6128d59190613b4d565b601160008282546128e69190613bc4565b92505081905550600c54600d54836128fe9190613ac4565b6129089190613b4d565b601060008282546129199190613bc4565b92505081905550600082111561293557612934853084612bef565b5b600081111561296c5761296b85600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612bef565b5b6000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118015612a2457506129e1600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661112f565b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411155b15612ad957612a95600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bef565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555b8082612ae59190613bc4565b83612af09190614c11565b925050505b5b5b612b02838383612bef565b505050565b8060168190555060006018819055506000601281905550600060148190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5590614a87565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc490614b19565b60405180910390fd5b612cd8838383613212565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5590614cb7565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612df19190613bc4565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e559190613722565b60405180910390a3612e68848484613217565b50505050565b612e76611c1b565b601781905550600060175403612ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb890613c66565b60405180910390fd5b601654601754111580612ed657506000601654145b15612eeb57612ee6601754612b07565b61305b565b601654601754111561305a57600060185403612f1b5762093a8042612f109190613bc4565b601881905550612f31565b6018544210612f3057612f2f601754612b07565b5b5b6000601754601654612710612f469190613ac4565b612f509190613b4d565b612710612f5d9190614c11565b9050601954606482612f6f9190613b4d565b10612fa557601954601354612f849190613ac4565b601281905550601954601554612f9a9190613ac4565b601481905550613058565b6032606482612fb49190614cd7565b10613016576001606482612fc89190613b4d565b612fd29190613bc4565b601354612fdf9190613ac4565b6012819055506001606482612ff49190613b4d565b612ffe9190613bc4565b60155461300b9190613ac4565b601481905550613057565b6064816130239190613b4d565b6013546130309190613ac4565b6012819055506064816130439190613b4d565b6015546130509190613ac4565b6014819055505b5b505b5b565b60006130683061112f565b9050600060105460115461307c9190613bc4565b9050600082148061308d5750600081145b15613099575050613210565b600a600f546130a89190613ac4565b8211156130c157600a600f546130be9190613ac4565b91505b600080600283601054866130d59190613ac4565b6130df9190613b4d565b6130e99190613b4d565b90506130ff81856130fa9190614c11565b61321c565b6000479050600060026010546131159190613b4d565b856131209190614c11565b6011548361312e9190613ac4565b6131389190613b4d565b9050600081836131489190614c11565b90506000601081905550600060118190555060008411801561316a5750600081115b1561317a576131798482613459565b5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516131c090613baf565b60006040518083038185875af1925050503d80600081146131fd576040519150601f19603f3d011682016040523d82523d6000602084013e613202565b606091505b505080955050505050505050505b565b505050565b505050565b6000600267ffffffffffffffff811115613239576132386144a8565b5b6040519080825280602002602001820160405280156132675781602001602082028036833780820191505090505b509050308160008151811061327f5761327e614634565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133489190614d1d565b8160018151811061335c5761335b614634565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506133c1307f000000000000000000000000000000000000000000000000000000000000000084612168565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613423959493929190614e0b565b600060405180830381600087803b15801561343d57600080fd5b505af1158015613451573d6000803e3d6000fd5b505050505050565b613484307f000000000000000000000000000000000000000000000000000000000000000084612168565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806134ce611795565b426040518863ffffffff1660e01b81526004016134f096959493929190614e65565b60606040518083038185885af115801561350e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906135339190614ec6565b5050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613574578082015181840152602081019050613559565b83811115613583576000848401525b50505050565b6000601f19601f8301169050919050565b60006135a58261353a565b6135af8185613545565b93506135bf818560208601613556565b6135c881613589565b840191505092915050565b600060208201905081810360008301526135ed818461359a565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061363482613609565b9050919050565b61364481613629565b811461364f57600080fd5b50565b6000813590506136618161363b565b92915050565b6000819050919050565b61367a81613667565b811461368557600080fd5b50565b60008135905061369781613671565b92915050565b600080604083850312156136b4576136b36135ff565b5b60006136c285828601613652565b92505060206136d385828601613688565b9150509250929050565b60008115159050919050565b6136f2816136dd565b82525050565b600060208201905061370d60008301846136e9565b92915050565b61371c81613667565b82525050565b60006020820190506137376000830184613713565b92915050565b600060208284031215613753576137526135ff565b5b600061376184828501613688565b91505092915050565b600080600060608486031215613783576137826135ff565b5b600061379186828701613652565b93505060206137a286828701613652565b92505060406137b386828701613688565b9150509250925092565b600060ff82169050919050565b6137d3816137bd565b82525050565b60006020820190506137ee60008301846137ca565b92915050565b60006020828403121561380a576138096135ff565b5b600061381884828501613652565b91505092915050565b61382a81613629565b82525050565b60006020820190506138456000830184613821565b92915050565b60008060408385031215613862576138616135ff565b5b600061387085828601613688565b925050602061388185828601613688565b9150509250929050565b600080604083850312156138a2576138a16135ff565b5b60006138b085828601613652565b92505060206138c185828601613652565b9150509250929050565b6138d4816136dd565b81146138df57600080fd5b50565b6000813590506138f1816138cb565b92915050565b6000806040838503121561390e5761390d6135ff565b5b600061391c85828601613652565b925050602061392d858286016138e2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061397e57607f821691505b60208210810361399157613990613937565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139cd602083613545565b91506139d882613997565b602082019050919050565b600060208201905081810360008301526139fc816139c0565b9050919050565b7f4d61782077616c6c6574206d7573742062652067726561746572207468616e2060008201527f3025000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a5f602283613545565b9150613a6a82613a03565b604082019050919050565b60006020820190508181036000830152613a8e81613a52565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613acf82613667565b9150613ada83613667565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b1357613b12613a95565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b5882613667565b9150613b6383613667565b925082613b7357613b72613b1e565b5b828204905092915050565b600081905092915050565b50565b6000613b99600083613b7e565b9150613ba482613b89565b600082019050919050565b6000613bba82613b8c565b9150819050919050565b6000613bcf82613667565b9150613bda83613667565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c0f57613c0e613a95565b5b828201905092915050565b7f4e6f7420612076616c6964207072696365000000000000000000000000000000600082015250565b6000613c50601183613545565b9150613c5b82613c1a565b602082019050919050565b60006020820190508181036000830152613c7f81613c43565b9050919050565b7f5468726573686f6c64206c6f776572207468616e203525000000000000000000600082015250565b6000613cbc601783613545565b9150613cc782613c86565b602082019050919050565b60006020820190508181036000830152613ceb81613caf565b9050919050565b7f5468726573686f6c642067726561746572207468616e20323025000000000000600082015250565b6000613d28601a83613545565b9150613d3382613cf2565b602082019050919050565b60006020820190508181036000830152613d5781613d1b565b9050919050565b7f4d757374206b656570206665657320617420313025206f72206c657373000000600082015250565b6000613d94601d83613545565b9150613d9f82613d5e565b602082019050919050565b60006020820190508181036000830152613dc381613d87565b9050919050565b7f426f6e75732072657761726473206d756c7469706c6965722063616e6e6f742060008201527f6265203000000000000000000000000000000000000000000000000000000000602082015250565b6000613e26602483613545565b9150613e3182613dca565b604082019050919050565b60006020820190508181036000830152613e5581613e19565b9050919050565b7f426f6e75732072657761726473206d756c7469706c696572206772656174657260008201527f207468616e203500000000000000000000000000000000000000000000000000602082015250565b6000613eb8602783613545565b9150613ec382613e5c565b604082019050919050565b60006020820190508181036000830152613ee781613eab565b9050919050565b7f5265776172647320666565206d756c7469706c6965722067726561746572207460008201527f68616e2032000000000000000000000000000000000000000000000000000000602082015250565b6000613f4a602583613545565b9150613f5582613eee565b604082019050919050565b60006020820190508181036000830152613f7981613f3d565b9050919050565b6000604082019050613f956000830185613713565b613fa26020830184613713565b9392505050565b7f5f746f6b656e20616464726573732063616e6e6f7420626520746865207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b6000614005602983613545565b915061401082613fa9565b604082019050919050565b6000602082019050818103600083015261403481613ff8565b9050919050565b7f43616e2774207769746864726177206e617469766520746f6b656e7300000000600082015250565b6000614071601c83613545565b915061407c8261403b565b602082019050919050565b600060208201905081810360008301526140a081614064565b9050919050565b6000815190506140b681613671565b92915050565b6000602082840312156140d2576140d16135ff565b5b60006140e0848285016140a7565b91505092915050565b60006040820190506140fe6000830185613821565b61410b6020830184613713565b9392505050565b600081519050614121816138cb565b92915050565b60006020828403121561413d5761413c6135ff565b5b600061414b84828501614112565b91505092915050565b7f5f736b795265776172647320616464726573732063616e6e6f7420626520746860008201527f65207a65726f2061646472657373000000000000000000000000000000000000602082015250565b60006141b0602e83613545565b91506141bb82614154565b604082019050919050565b600060208201905081810360008301526141df816141a3565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614242602583613545565b915061424d826141e6565b604082019050919050565b6000602082019050818103600083015261427181614235565b9050919050565b7f5468726573686f6c6420686967686572207468616e20302e312520746f74616c60008201527f20737570706c7900000000000000000000000000000000000000000000000000602082015250565b60006142d4602783613545565b91506142df82614278565b604082019050919050565b60006020820190508181036000830152614303816142c7565b9050919050565b6000819050919050565b6000819050919050565b600061433961433461432f8461430a565b614314565b613667565b9050919050565b6143498161431e565b82525050565b600081549050919050565b600082825260208201905092915050565b60008190508160005260206000209050919050565b61438981613629565b82525050565b600061439b8383614380565b60208301905092915050565b60008160001c9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143e76143e2836143a7565b6143b4565b9050919050565b60006143fa82546143d4565b9050919050565b6000600182019050919050565b60006144198261434f565b614423818561435a565b935061442e8361436b565b8060005b8381101561446657614443826143ee565b61444d888261438f565b975061445883614401565b925050600181019050614432565b5085935050505092915050565b60006040820190506144886000830185614340565b818103602083015261449a818461440e565b90509392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144e082613589565b810181811067ffffffffffffffff821117156144ff576144fe6144a8565b5b80604052505050565b60006145126135f5565b905061451e82826144d7565b919050565b600067ffffffffffffffff82111561453e5761453d6144a8565b5b602082029050602081019050919050565b600080fd5b600061456761456284614523565b614508565b9050808382526020820190506020840283018581111561458a5761458961454f565b5b835b818110156145b3578061459f88826140a7565b84526020840193505060208101905061458c565b5050509392505050565b600082601f8301126145d2576145d16144a3565b5b81516145e2848260208601614554565b91505092915050565b600060208284031215614601576146006135ff565b5b600082015167ffffffffffffffff81111561461f5761461e613604565b5b61462b848285016145bd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5f736b79547265617375727920616464726573732063616e6e6f74206265207460008201527f6865207a65726f20616464726573730000000000000000000000000000000000602082015250565b60006146bf602f83613545565b91506146ca82614663565b604082019050919050565b600060208201905081810360008301526146ee816146b2565b9050919050565b7f596f752068617665206e6f206f77656420726577617264730000000000000000600082015250565b600061472b601883613545565b9150614736826146f5565b602082019050919050565b6000602082019050818103600083015261475a8161471e565b9050919050565b7f496e73756666696369656e74207265776172647320696e20726577617264732060008201527f706f6f6c00000000000000000000000000000000000000000000000000000000602082015250565b60006147bd602483613545565b91506147c882614761565b604082019050919050565b600060208201905081810360008301526147ec816147b0565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061484f602683613545565b915061485a826147f3565b604082019050919050565b6000602082019050818103600083015261487e81614842565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006148e1602483613545565b91506148ec82614885565b604082019050919050565b60006020820190508181036000830152614910816148d4565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614973602283613545565b915061497e82614917565b604082019050919050565b600060208201905081810360008301526149a281614966565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006149df601d83613545565b91506149ea826149a9565b602082019050919050565b60006020820190508181036000830152614a0e816149d2565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614a71602583613545565b9150614a7c82614a15565b604082019050919050565b60006020820190508181036000830152614aa081614a64565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614b03602383613545565b9150614b0e82614aa7565b604082019050919050565b60006020820190508181036000830152614b3281614af6565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b6000614b6f601d83613545565b9150614b7a82614b39565b602082019050919050565b60006020820190508181036000830152614b9e81614b62565b9050919050565b7f45786365656473206d61782077616c6c65740000000000000000000000000000600082015250565b6000614bdb601283613545565b9150614be682614ba5565b602082019050919050565b60006020820190508181036000830152614c0a81614bce565b9050919050565b6000614c1c82613667565b9150614c2783613667565b925082821015614c3a57614c39613a95565b5b828203905092915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614ca1602683613545565b9150614cac82614c45565b604082019050919050565b60006020820190508181036000830152614cd081614c94565b9050919050565b6000614ce282613667565b9150614ced83613667565b925082614cfd57614cfc613b1e565b5b828206905092915050565b600081519050614d178161363b565b92915050565b600060208284031215614d3357614d326135ff565b5b6000614d4184828501614d08565b91505092915050565b6000819050919050565b6000614d6f614d6a614d6584614d4a565b614314565b613667565b9050919050565b614d7f81614d54565b82525050565b600081519050919050565b6000819050602082019050919050565b6000602082019050919050565b6000614db882614d85565b614dc2818561435a565b9350614dcd83614d90565b8060005b83811015614dfe578151614de5888261438f565b9750614df083614da0565b925050600181019050614dd1565b5085935050505092915050565b600060a082019050614e206000830188613713565b614e2d6020830187614d76565b8181036040830152614e3f8186614dad565b9050614e4e6060830185613821565b614e5b6080830184613713565b9695505050505050565b600060c082019050614e7a6000830189613821565b614e876020830188613713565b614e946040830187614d76565b614ea16060830186614d76565b614eae6080830185613821565b614ebb60a0830184613713565b979650505050505050565b600080600060608486031215614edf57614ede6135ff565b5b6000614eed868287016140a7565b9350506020614efe868287016140a7565b9250506040614f0f868287016140a7565b915050925092509256fea264697066735822122024cc959935af2319992605466391be45ecbece230c5613dde171eb96685b0a9264736f6c634300080d00330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

Deployed Bytecode

0x6080604052600436106102555760003560e01c806389483fcf11610139578063c0246668116100b6578063ddb382f91161007a578063ddb382f9146108c5578063eb91d37e146108f0578063ee1266e11461091b578063f2652d9c14610944578063f2fde38b1461095b578063f8b45b05146109845761025c565b8063c0246668146107e0578063c545e90c14610809578063cc32d17614610834578063d257b34f1461085f578063dd62ed3e146108885761025c565b806398118cb4116100fd57806398118cb4146106e55780639d11c021146107105780639d1b464a1461073b578063a457c2d714610766578063a9059cbb146107a35761025c565b806389483fcf1461060e5780638da5cb5b14610639578063917c0fd41461066457806391c661031461068f57806395d89b41146106ba5761025c565b806355222648116101d257806370a082311161019657806370a0823114610500578063715018a61461053d5780637c36e8e814610554578063828577b21461057f5780638366e79a146105a85780638680113a146105e55761025c565b8063552226481461044157806363210eb21461046c578063686ee72214610483578063693e7ce4146104ac5780636db79437146104d75761025c565b80632bb14e1d116102195780632bb14e1d1461035a578063313ce56714610385578063364333f4146103b057806339509351146103c75780634b517003146104045761025c565b806306fdde0314610261578063095ea7b31461028c57806318160ddd146102c95780631c499ab0146102f457806323b872dd1461031d5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b506102766109af565b60405161028391906135d3565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae919061369d565b610a41565b6040516102c091906136f8565b60405180910390f35b3480156102d557600080fd5b506102de610a64565b6040516102eb9190613722565b60405180910390f35b34801561030057600080fd5b5061031b6004803603810190610316919061373d565b610a6e565b005b34801561032957600080fd5b50610344600480360381019061033f919061376a565b610b8e565b60405161035191906136f8565b60405180910390f35b34801561036657600080fd5b5061036f610bbd565b60405161037c9190613722565b60405180910390f35b34801561039157600080fd5b5061039a610bc3565b6040516103a791906137d9565b60405180910390f35b3480156103bc57600080fd5b506103c5610bcc565b005b3480156103d357600080fd5b506103ee60048036038101906103e9919061369d565b610cb9565b6040516103fb91906136f8565b60405180910390f35b34801561041057600080fd5b5061042b600480360381019061042691906137f4565b610d63565b6040516104389190613722565b60405180910390f35b34801561044d57600080fd5b50610456610d7b565b6040516104639190613722565b60405180910390f35b34801561047857600080fd5b50610481610d81565b005b34801561048f57600080fd5b506104aa60048036038101906104a5919061373d565b610e96565b005b3480156104b857600080fd5b506104c1610fdd565b6040516104ce9190613830565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f9919061384b565b611003565b005b34801561050c57600080fd5b50610527600480360381019061052291906137f4565b61112f565b6040516105349190613722565b60405180910390f35b34801561054957600080fd5b50610552611177565b005b34801561056057600080fd5b506105696111ff565b6040516105769190613722565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a1919061384b565b611205565b005b3480156105b457600080fd5b506105cf60048036038101906105ca919061388b565b61139b565b6040516105dc91906136f8565b60405180910390f35b3480156105f157600080fd5b5061060c600480360381019061060791906137f4565b6115fb565b005b34801561061a57600080fd5b5061062361178f565b6040516106309190613722565b60405180910390f35b34801561064557600080fd5b5061064e611795565b60405161065b9190613830565b60405180910390f35b34801561067057600080fd5b506106796117bf565b6040516106869190613830565b60405180910390f35b34801561069b57600080fd5b506106a46117e5565b6040516106b19190613722565b60405180910390f35b3480156106c657600080fd5b506106cf6117eb565b6040516106dc91906135d3565b60405180910390f35b3480156106f157600080fd5b506106fa61187d565b6040516107079190613722565b60405180910390f35b34801561071c57600080fd5b50610725611883565b6040516107329190613722565b60405180910390f35b34801561074757600080fd5b50610750611889565b60405161075d9190613722565b60405180910390f35b34801561077257600080fd5b5061078d6004803603810190610788919061369d565b61188f565b60405161079a91906136f8565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c5919061369d565b611979565b6040516107d791906136f8565b60405180910390f35b3480156107ec57600080fd5b50610807600480360381019061080291906138f7565b61199c565b005b34801561081557600080fd5b5061081e611a73565b60405161082b9190613722565b60405180910390f35b34801561084057600080fd5b50610849611a79565b6040516108569190613722565b60405180910390f35b34801561086b57600080fd5b506108866004803603810190610881919061373d565b611a7f565b005b34801561089457600080fd5b506108af60048036038101906108aa919061388b565b611b8e565b6040516108bc9190613722565b60405180910390f35b3480156108d157600080fd5b506108da611c15565b6040516108e79190613722565b60405180910390f35b3480156108fc57600080fd5b50610905611c1b565b6040516109129190613722565b60405180910390f35b34801561092757600080fd5b50610942600480360381019061093d91906137f4565b611cf0565b005b34801561095057600080fd5b50610959611e84565b005b34801561096757600080fd5b50610982600480360381019061097d91906137f4565b612063565b005b34801561099057600080fd5b5061099961215a565b6040516109a69190613722565b60405180910390f35b6060600380546109be90613966565b80601f01602080910402602001604051908101604052809291908181526020018280546109ea90613966565b8015610a375780601f10610a0c57610100808354040283529160200191610a37565b820191906000526020600020905b815481529060010190602001808311610a1a57829003601f168201915b5050505050905090565b600080610a4c612160565b9050610a59818585612168565b600191505092915050565b6000600254905090565b610a76612160565b73ffffffffffffffffffffffffffffffffffffffff16610a94611795565b73ffffffffffffffffffffffffffffffffffffffff1614610aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae1906139e3565b60405180910390fd5b60008111610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2490613a75565b60405180910390fd5b606481610b38610a64565b610b429190613ac4565b610b4c9190613b4d565b600b819055507f3046ad62de8b70d396246aaed19ff2559ff20df8706520cbde58320766c42762600b54604051610b839190613722565b60405180910390a150565b600080610b99612160565b9050610ba6858285612331565b610bb18585856123bd565b60019150509392505050565b60145481565b60006012905090565b610bd4612160565b73ffffffffffffffffffffffffffffffffffffffff16610bf2611795565b73ffffffffffffffffffffffffffffffffffffffff1614610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f906139e3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610c6e90613baf565b60006040518083038185875af1925050503d8060008114610cab576040519150601f19603f3d011682016040523d82523d6000602084013e610cb0565b606091505b50508091505050565b600080610cc4612160565b9050610d58818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d539190613bc4565b612168565b600191505092915050565b60086020528060005260406000206000915090505481565b60155481565b610d89612160565b73ffffffffffffffffffffffffffffffffffffffff16610da7611795565b73ffffffffffffffffffffffffffffffffffffffff1614610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df4906139e3565b60405180910390fd5b610e05611c1b565b601781905550600060175403610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4790613c66565b60405180910390fd5b610e5b601754612b07565b7fdba2849ce7051ebad401db7d34afd1e17133ae1a17ece4e959d4f5d3ea245a64601754604051610e8c9190613722565b60405180910390a1565b610e9e612160565b73ffffffffffffffffffffffffffffffffffffffff16610ebc611795565b73ffffffffffffffffffffffffffffffffffffffff1614610f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f09906139e3565b60405180910390fd5b6005811015610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90613cd2565b60405180910390fd5b6014811115610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190613d3e565b60405180910390fd5b806019819055507fc449df7805aff7118f096cf19920c827bc883697f0b837480b1d0d36ce84b245601954604051610fd29190613722565b60405180910390a150565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61100b612160565b73ffffffffffffffffffffffffffffffffffffffff16611029611795565b73ffffffffffffffffffffffffffffffffffffffff161461107f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611076906139e3565b60405180910390fd5b600a818361108d9190613bc4565b11156110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590613daa565b60405180910390fd5b81600e8190555080600d81905550600d54600e546110ec9190613bc4565b600c819055507fb653f2e021d9b52b9349ba789ebee15f570dfcc0847034b98cbc63d1802f6592600c546040516111239190613722565b60405180910390a15050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61117f612160565b73ffffffffffffffffffffffffffffffffffffffff1661119d611795565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea906139e3565b60405180910390fd5b6111fd6000612b29565b565b60195481565b61120d612160565b73ffffffffffffffffffffffffffffffffffffffff1661122b611795565b73ffffffffffffffffffffffffffffffffffffffff1614611281576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611278906139e3565b60405180910390fd5b600082116112c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bb90613e3c565b60405180910390fd5b6005821115611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff90613ece565b60405180910390fd5b600281111561134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134390613f60565b60405180910390fd5b81601381905550806015819055507f9ae798d83b2479d59606604404d7fee29fabfefea44ec0367a7fe958bcbe440b60135460155460405161138f929190613f80565b60405180910390a15050565b60006113a5612160565b73ffffffffffffffffffffffffffffffffffffffff166113c3611795565b73ffffffffffffffffffffffffffffffffffffffff1614611419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611410906139e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147f9061401b565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed90614087565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115319190613830565b602060405180830381865afa15801561154e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157291906140bc565b90508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b81526004016115af9291906140e9565b6020604051808303816000875af11580156115ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f29190614127565b91505092915050565b611603612160565b73ffffffffffffffffffffffffffffffffffffffff16611621611795565b73ffffffffffffffffffffffffffffffffffffffff1614611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e906139e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd906141c6565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167feaccec827b4a8e31f4d3ea1070356619a0ce082b0d21d163d8ba31d764a4b26a60405160405180910390a250565b60165481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b6060600480546117fa90613966565b80601f016020809104026020016040519081016040528092919081815260200182805461182690613966565b80156118735780601f1061184857610100808354040283529160200191611873565b820191906000526020600020905b81548152906001019060200180831161185657829003601f168201915b5050505050905090565b600d5481565b60135481565b60175481565b60008061189a612160565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195790614258565b60405180910390fd5b61196d8286868403612168565b60019250505092915050565b600080611984612160565b90506119918185856123bd565b600191505092915050565b6119a4612160565b73ffffffffffffffffffffffffffffffffffffffff166119c2611795565b73ffffffffffffffffffffffffffffffffffffffff1614611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f906139e3565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60185481565b600e5481565b611a87612160565b73ffffffffffffffffffffffffffffffffffffffff16611aa5611795565b73ffffffffffffffffffffffffffffffffffffffff1614611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af2906139e3565b60405180910390fd5b670de0b6b3a76400006103e86001611b11610a64565b611b1b9190613ac4565b611b259190613b4d565b611b2f9190613b4d565b811115611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b68906142ea565b60405180910390fd5b670de0b6b3a764000081611b859190613ac4565b600f8190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c5481565b60007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a764000060066040518363ffffffff1660e01b8152600401611c81929190614473565b600060405180830381865afa925050508015611cc057506040513d6000823e3d601f19601f82011682018060405250810190611cbd91906145eb565b60015b611ccd5760009050611ced565b80600181518110611ce157611ce0614634565b5b60200260200101519150505b90565b611cf8612160565b73ffffffffffffffffffffffffffffffffffffffff16611d16611795565b73ffffffffffffffffffffffffffffffffffffffff1614611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d63906139e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd2906146d5565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1712df96f4f74213fc59b69f0189afbfdc3c4f9e0fb860ef2e9afb3bb109fbfd60405160405180910390a250565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd90614741565b60405180910390fd5b611f31600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661112f565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa9906147d3565b60405180910390fd5b61201e600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bef565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055565b61206b612160565b73ffffffffffffffffffffffffffffffffffffffff16612089611795565b73ffffffffffffffffffffffffffffffffffffffff16146120df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d6906139e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361214e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214590614865565b60405180910390fd5b61215781612b29565b50565b600b5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ce906148f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223d90614989565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516123249190613722565b60405180910390a3505050565b600061233d8484611b8e565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146123b757818110156123a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a0906149f5565b60405180910390fd5b6123b68484848403612168565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361242c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242390614a87565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361249b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249290614b19565b60405180910390fd5b600081116124de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d590614b85565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156125825750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612af7577f00000000000000000000000063b83d4e4c3e807e88f53f084fca8ec0ca6da2b773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461263357600b546125e68361112f565b826125f19190613bc4565b1115612632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262990614bf1565b60405180910390fd5b5b61263b612e6e565b7f00000000000000000000000063b83d4e4c3e807e88f53f084fca8ec0ca6da2b773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612803576000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546064601254846126e09190613ac4565b6126ea9190613b4d565b6126f49190613bc4565b905060008111156127fd5761272a600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661112f565b81116127a55761275d600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168483612bef565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090556127fc565b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127f49190613bc4565b925050819055505b5b50612af6565b7f00000000000000000000000063b83d4e4c3e807e88f53f084fca8ec0ca6da2b773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614801561286057506000600c54115b15612af557600f546128713061112f565b1061287f5761287e61305d565b5b6000806064600c54846128929190613ac4565b61289c9190613b4d565b91506064601454846128ae9190613ac4565b6128b89190613b4d565b9050600c54600e54836128cb9190613ac4565b6128d59190613b4d565b601160008282546128e69190613bc4565b92505081905550600c54600d54836128fe9190613ac4565b6129089190613b4d565b601060008282546129199190613bc4565b92505081905550600082111561293557612934853084612bef565b5b600081111561296c5761296b85600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612bef565b5b6000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118015612a2457506129e1600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661112f565b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411155b15612ad957612a95600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bef565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555b8082612ae59190613bc4565b83612af09190614c11565b925050505b5b5b612b02838383612bef565b505050565b8060168190555060006018819055506000601281905550600060148190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5590614a87565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc490614b19565b60405180910390fd5b612cd8838383613212565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5590614cb7565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612df19190613bc4565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e559190613722565b60405180910390a3612e68848484613217565b50505050565b612e76611c1b565b601781905550600060175403612ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb890613c66565b60405180910390fd5b601654601754111580612ed657506000601654145b15612eeb57612ee6601754612b07565b61305b565b601654601754111561305a57600060185403612f1b5762093a8042612f109190613bc4565b601881905550612f31565b6018544210612f3057612f2f601754612b07565b5b5b6000601754601654612710612f469190613ac4565b612f509190613b4d565b612710612f5d9190614c11565b9050601954606482612f6f9190613b4d565b10612fa557601954601354612f849190613ac4565b601281905550601954601554612f9a9190613ac4565b601481905550613058565b6032606482612fb49190614cd7565b10613016576001606482612fc89190613b4d565b612fd29190613bc4565b601354612fdf9190613ac4565b6012819055506001606482612ff49190613b4d565b612ffe9190613bc4565b60155461300b9190613ac4565b601481905550613057565b6064816130239190613b4d565b6013546130309190613ac4565b6012819055506064816130439190613b4d565b6015546130509190613ac4565b6014819055505b5b505b5b565b60006130683061112f565b9050600060105460115461307c9190613bc4565b9050600082148061308d5750600081145b15613099575050613210565b600a600f546130a89190613ac4565b8211156130c157600a600f546130be9190613ac4565b91505b600080600283601054866130d59190613ac4565b6130df9190613b4d565b6130e99190613b4d565b90506130ff81856130fa9190614c11565b61321c565b6000479050600060026010546131159190613b4d565b856131209190614c11565b6011548361312e9190613ac4565b6131389190613b4d565b9050600081836131489190614c11565b90506000601081905550600060118190555060008411801561316a5750600081115b1561317a576131798482613459565b5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516131c090613baf565b60006040518083038185875af1925050503d80600081146131fd576040519150601f19603f3d011682016040523d82523d6000602084013e613202565b606091505b505080955050505050505050505b565b505050565b505050565b6000600267ffffffffffffffff811115613239576132386144a8565b5b6040519080825280602002602001820160405280156132675781602001602082028036833780820191505090505b509050308160008151811061327f5761327e614634565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133489190614d1d565b8160018151811061335c5761335b614634565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506133c1307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612168565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613423959493929190614e0b565b600060405180830381600087803b15801561343d57600080fd5b505af1158015613451573d6000803e3d6000fd5b505050505050565b613484307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612168565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806134ce611795565b426040518863ffffffff1660e01b81526004016134f096959493929190614e65565b60606040518083038185885af115801561350e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906135339190614ec6565b5050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613574578082015181840152602081019050613559565b83811115613583576000848401525b50505050565b6000601f19601f8301169050919050565b60006135a58261353a565b6135af8185613545565b93506135bf818560208601613556565b6135c881613589565b840191505092915050565b600060208201905081810360008301526135ed818461359a565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061363482613609565b9050919050565b61364481613629565b811461364f57600080fd5b50565b6000813590506136618161363b565b92915050565b6000819050919050565b61367a81613667565b811461368557600080fd5b50565b60008135905061369781613671565b92915050565b600080604083850312156136b4576136b36135ff565b5b60006136c285828601613652565b92505060206136d385828601613688565b9150509250929050565b60008115159050919050565b6136f2816136dd565b82525050565b600060208201905061370d60008301846136e9565b92915050565b61371c81613667565b82525050565b60006020820190506137376000830184613713565b92915050565b600060208284031215613753576137526135ff565b5b600061376184828501613688565b91505092915050565b600080600060608486031215613783576137826135ff565b5b600061379186828701613652565b93505060206137a286828701613652565b92505060406137b386828701613688565b9150509250925092565b600060ff82169050919050565b6137d3816137bd565b82525050565b60006020820190506137ee60008301846137ca565b92915050565b60006020828403121561380a576138096135ff565b5b600061381884828501613652565b91505092915050565b61382a81613629565b82525050565b60006020820190506138456000830184613821565b92915050565b60008060408385031215613862576138616135ff565b5b600061387085828601613688565b925050602061388185828601613688565b9150509250929050565b600080604083850312156138a2576138a16135ff565b5b60006138b085828601613652565b92505060206138c185828601613652565b9150509250929050565b6138d4816136dd565b81146138df57600080fd5b50565b6000813590506138f1816138cb565b92915050565b6000806040838503121561390e5761390d6135ff565b5b600061391c85828601613652565b925050602061392d858286016138e2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061397e57607f821691505b60208210810361399157613990613937565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139cd602083613545565b91506139d882613997565b602082019050919050565b600060208201905081810360008301526139fc816139c0565b9050919050565b7f4d61782077616c6c6574206d7573742062652067726561746572207468616e2060008201527f3025000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a5f602283613545565b9150613a6a82613a03565b604082019050919050565b60006020820190508181036000830152613a8e81613a52565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613acf82613667565b9150613ada83613667565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b1357613b12613a95565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b5882613667565b9150613b6383613667565b925082613b7357613b72613b1e565b5b828204905092915050565b600081905092915050565b50565b6000613b99600083613b7e565b9150613ba482613b89565b600082019050919050565b6000613bba82613b8c565b9150819050919050565b6000613bcf82613667565b9150613bda83613667565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c0f57613c0e613a95565b5b828201905092915050565b7f4e6f7420612076616c6964207072696365000000000000000000000000000000600082015250565b6000613c50601183613545565b9150613c5b82613c1a565b602082019050919050565b60006020820190508181036000830152613c7f81613c43565b9050919050565b7f5468726573686f6c64206c6f776572207468616e203525000000000000000000600082015250565b6000613cbc601783613545565b9150613cc782613c86565b602082019050919050565b60006020820190508181036000830152613ceb81613caf565b9050919050565b7f5468726573686f6c642067726561746572207468616e20323025000000000000600082015250565b6000613d28601a83613545565b9150613d3382613cf2565b602082019050919050565b60006020820190508181036000830152613d5781613d1b565b9050919050565b7f4d757374206b656570206665657320617420313025206f72206c657373000000600082015250565b6000613d94601d83613545565b9150613d9f82613d5e565b602082019050919050565b60006020820190508181036000830152613dc381613d87565b9050919050565b7f426f6e75732072657761726473206d756c7469706c6965722063616e6e6f742060008201527f6265203000000000000000000000000000000000000000000000000000000000602082015250565b6000613e26602483613545565b9150613e3182613dca565b604082019050919050565b60006020820190508181036000830152613e5581613e19565b9050919050565b7f426f6e75732072657761726473206d756c7469706c696572206772656174657260008201527f207468616e203500000000000000000000000000000000000000000000000000602082015250565b6000613eb8602783613545565b9150613ec382613e5c565b604082019050919050565b60006020820190508181036000830152613ee781613eab565b9050919050565b7f5265776172647320666565206d756c7469706c6965722067726561746572207460008201527f68616e2032000000000000000000000000000000000000000000000000000000602082015250565b6000613f4a602583613545565b9150613f5582613eee565b604082019050919050565b60006020820190508181036000830152613f7981613f3d565b9050919050565b6000604082019050613f956000830185613713565b613fa26020830184613713565b9392505050565b7f5f746f6b656e20616464726573732063616e6e6f7420626520746865207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b6000614005602983613545565b915061401082613fa9565b604082019050919050565b6000602082019050818103600083015261403481613ff8565b9050919050565b7f43616e2774207769746864726177206e617469766520746f6b656e7300000000600082015250565b6000614071601c83613545565b915061407c8261403b565b602082019050919050565b600060208201905081810360008301526140a081614064565b9050919050565b6000815190506140b681613671565b92915050565b6000602082840312156140d2576140d16135ff565b5b60006140e0848285016140a7565b91505092915050565b60006040820190506140fe6000830185613821565b61410b6020830184613713565b9392505050565b600081519050614121816138cb565b92915050565b60006020828403121561413d5761413c6135ff565b5b600061414b84828501614112565b91505092915050565b7f5f736b795265776172647320616464726573732063616e6e6f7420626520746860008201527f65207a65726f2061646472657373000000000000000000000000000000000000602082015250565b60006141b0602e83613545565b91506141bb82614154565b604082019050919050565b600060208201905081810360008301526141df816141a3565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614242602583613545565b915061424d826141e6565b604082019050919050565b6000602082019050818103600083015261427181614235565b9050919050565b7f5468726573686f6c6420686967686572207468616e20302e312520746f74616c60008201527f20737570706c7900000000000000000000000000000000000000000000000000602082015250565b60006142d4602783613545565b91506142df82614278565b604082019050919050565b60006020820190508181036000830152614303816142c7565b9050919050565b6000819050919050565b6000819050919050565b600061433961433461432f8461430a565b614314565b613667565b9050919050565b6143498161431e565b82525050565b600081549050919050565b600082825260208201905092915050565b60008190508160005260206000209050919050565b61438981613629565b82525050565b600061439b8383614380565b60208301905092915050565b60008160001c9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143e76143e2836143a7565b6143b4565b9050919050565b60006143fa82546143d4565b9050919050565b6000600182019050919050565b60006144198261434f565b614423818561435a565b935061442e8361436b565b8060005b8381101561446657614443826143ee565b61444d888261438f565b975061445883614401565b925050600181019050614432565b5085935050505092915050565b60006040820190506144886000830185614340565b818103602083015261449a818461440e565b90509392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144e082613589565b810181811067ffffffffffffffff821117156144ff576144fe6144a8565b5b80604052505050565b60006145126135f5565b905061451e82826144d7565b919050565b600067ffffffffffffffff82111561453e5761453d6144a8565b5b602082029050602081019050919050565b600080fd5b600061456761456284614523565b614508565b9050808382526020820190506020840283018581111561458a5761458961454f565b5b835b818110156145b3578061459f88826140a7565b84526020840193505060208101905061458c565b5050509392505050565b600082601f8301126145d2576145d16144a3565b5b81516145e2848260208601614554565b91505092915050565b600060208284031215614601576146006135ff565b5b600082015167ffffffffffffffff81111561461f5761461e613604565b5b61462b848285016145bd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5f736b79547265617375727920616464726573732063616e6e6f74206265207460008201527f6865207a65726f20616464726573730000000000000000000000000000000000602082015250565b60006146bf602f83613545565b91506146ca82614663565b604082019050919050565b600060208201905081810360008301526146ee816146b2565b9050919050565b7f596f752068617665206e6f206f77656420726577617264730000000000000000600082015250565b600061472b601883613545565b9150614736826146f5565b602082019050919050565b6000602082019050818103600083015261475a8161471e565b9050919050565b7f496e73756666696369656e74207265776172647320696e20726577617264732060008201527f706f6f6c00000000000000000000000000000000000000000000000000000000602082015250565b60006147bd602483613545565b91506147c882614761565b604082019050919050565b600060208201905081810360008301526147ec816147b0565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061484f602683613545565b915061485a826147f3565b604082019050919050565b6000602082019050818103600083015261487e81614842565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006148e1602483613545565b91506148ec82614885565b604082019050919050565b60006020820190508181036000830152614910816148d4565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614973602283613545565b915061497e82614917565b604082019050919050565b600060208201905081810360008301526149a281614966565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006149df601d83613545565b91506149ea826149a9565b602082019050919050565b60006020820190508181036000830152614a0e816149d2565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614a71602583613545565b9150614a7c82614a15565b604082019050919050565b60006020820190508181036000830152614aa081614a64565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614b03602383613545565b9150614b0e82614aa7565b604082019050919050565b60006020820190508181036000830152614b3281614af6565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b6000614b6f601d83613545565b9150614b7a82614b39565b602082019050919050565b60006020820190508181036000830152614b9e81614b62565b9050919050565b7f45786365656473206d61782077616c6c65740000000000000000000000000000600082015250565b6000614bdb601283613545565b9150614be682614ba5565b602082019050919050565b60006020820190508181036000830152614c0a81614bce565b9050919050565b6000614c1c82613667565b9150614c2783613667565b925082821015614c3a57614c39613a95565b5b828203905092915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614ca1602683613545565b9150614cac82614c45565b604082019050919050565b60006020820190508181036000830152614cd081614c94565b9050919050565b6000614ce282613667565b9150614ced83613667565b925082614cfd57614cfc613b1e565b5b828206905092915050565b600081519050614d178161363b565b92915050565b600060208284031215614d3357614d326135ff565b5b6000614d4184828501614d08565b91505092915050565b6000819050919050565b6000614d6f614d6a614d6584614d4a565b614314565b613667565b9050919050565b614d7f81614d54565b82525050565b600081519050919050565b6000819050602082019050919050565b6000602082019050919050565b6000614db882614d85565b614dc2818561435a565b9350614dcd83614d90565b8060005b83811015614dfe578151614de5888261438f565b9750614df083614da0565b925050600181019050614dd1565b5085935050505092915050565b600060a082019050614e206000830188613713565b614e2d6020830187614d76565b8181036040830152614e3f8186614dad565b9050614e4e6060830185613821565b614e5b6080830184613713565b9695505050505050565b600060c082019050614e7a6000830189613821565b614e876020830188613713565b614e946040830187614d76565b614ea16060830186614d76565b614eae6080830185613821565b614ebb60a0830184613713565b979650505050505050565b600080600060608486031215614edf57614ede6135ff565b5b6000614eed868287016140a7565b9350506020614efe868287016140a7565b9250506040614f0f868287016140a7565b915050925092509256fea264697066735822122024cc959935af2319992605466391be45ecbece230c5613dde171eb96685b0a9264736f6c634300080d0033

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

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

-----Decoded View---------------
Arg [0] : dexRouter (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d


Deployed Bytecode Sourcemap

21250:13280:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9177:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11528:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10297:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28613:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12309:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22044:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10139:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26480:161;;;;;;;;;;;;;:::i;:::-;;13013:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21591:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22076:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26904:225;;;;;;;;;;;;;:::i;:::-;;29538:333;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21679:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28235:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10468:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2604:103;;;;;;;;;;;;;:::i;:::-;;22220:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28920:577;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27798:409;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27171:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22120:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1953:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21647:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21966:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9396:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21775:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22000:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22152:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13756:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10801:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26698:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22186:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21809:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29965:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11057:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21745:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34267:260;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27478:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26006:337;;;;;;;;;;;;;:::i;:::-;;2862:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21714:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9177:100;9231:13;9264:5;9257:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9177:100;:::o;11528:201::-;11611:4;11628:13;11644:12;:10;:12::i;:::-;11628:28;;11667:32;11676:5;11683:7;11692:6;11667:8;:32::i;:::-;11717:4;11710:11;;;11528:201;;;;:::o;10297:108::-;10358:7;10385:12;;10378:19;;10297:108;:::o;28613:242::-;2184:12;:10;:12::i;:::-;2173:23;;:7;:5;:7::i;:::-;:23;;;2165:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28709:1:::1;28696:10;:14;28688:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28801:3;28788:10;28772:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:32;;;;:::i;:::-;28760:9;:44;;;;28820:27;28837:9;;28820:27;;;;;;:::i;:::-;;;;;;;;28613:242:::0;:::o;12309:295::-;12440:4;12457:15;12475:12;:10;:12::i;:::-;12457:30;;12498:38;12514:4;12520:7;12529:6;12498:15;:38::i;:::-;12547:27;12557:4;12563:2;12567:6;12547:9;:27::i;:::-;12592:4;12585:11;;;12309:295;;;;;:::o;22044:25::-;;;;:::o;10139:93::-;10197:5;10222:2;10215:9;;10139:93;:::o;26480:161::-;2184:12;:10;:12::i;:::-;2173:23;;:7;:5;:7::i;:::-;:23;;;2165:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26539:12:::1;26583:10;26575:24;;26607:21;26575:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26562:71;;;;;26528:113;26480:161::o:0;13013:240::-;13101:4;13118:13;13134:12;:10;:12::i;:::-;13118:28;;13157:66;13166:5;13173:7;13212:10;13182:11;:18;13194:5;13182:18;;;;;;;;;;;;;;;:27;13201:7;13182:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;13157:8;:66::i;:::-;13241:4;13234:11;;;13013:240;;;;:::o;21591:47::-;;;;;;;;;;;;;;;;;:::o;22076:35::-;;;;:::o;26904:225::-;2184:12;:10;:12::i;:::-;2173:23;;:7;:5;:7::i;:::-;:23;;;2165:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26975:17:::1;:15;:17::i;:::-;26960:12;:32;;;;27027:1;27011:12;;:17:::0;27003:47:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;27061:22;27070:12;;27061:8;:22::i;:::-;27099;27108:12;;27099:22;;;;;;:::i;:::-;;;;;;;;26904:225::o:0;29538:333::-;2184:12;:10;:12::i;:::-;2173:23;;:7;:5;:7::i;:::-;:23;;;2165:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29656:1:::1;29635:17;:22;;29627:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;29726:2;29705:17;:23;;29697:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29789:17;29770:16;:36;;;;29822:41;29846:16;;29822:41;;;;;;:::i;:::-;;;;;;;;29538:333:::0;:::o;21679:26::-;;;;;;;;;;;;;:::o;28235:344::-;2184:12;:10;:12::i;:::-;2173:23;;:7;:5;:7::i;:::-;:23;;;2165:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28370:2:::1;28353:13;28338:12;:28;;;;:::i;:::-;:34;;28330:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28431:12;28417:11;:26;;;;28469:13;28454:12;:28;;;;28518:12;;28504:11;;:26;;;;:::i;:::-;28493:8;:37;;;;28546:25;28562:8;;28546:25;;;;;;:::i;:::-;;;;;;;;28235:344:::0;;:::o;10468:127::-;10542:7;10569:9;:18;10579:7;10569:18;;;;;;;;;;;;;;;;10562:25;;10468:127;;;:::o;2604:103::-;2184:12;:10;:12::i;:::-;2173:23;;:7;:5;:7::i;:::-;:23;;;2165:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2669:30:::1;2696:1;2669:18;:30::i;:::-;2604:103::o:0;22220:31::-;;;;:::o;28920:577::-;2184:12;:10;:12::i;:::-;2173:23;;:7;:5;:7::i;:::-;:23;;;2165:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29075:1:::1;29049:23;:27;29041:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29163:1;29136:23;:28;;29128:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;29252:1;29227:21;:26;;29219:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29331:23;29306:22;:48;;;;29388:21;29365:20;:44;;;;29425:64;29444:22;;29468:20;;29425:64;;;;;;;:::i;:::-;;;;;;;;28920:577:::0;;:::o;27798:409::-;27885:10;2184:12;:10;:12::i;:::-;2173:23;;:7;:5;:7::i;:::-;:23;;;2165:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27934:1:::1;27916:20;;:6;:20;;::::0;27908:74:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28019:4;28001:23;;:6;:23;;::::0;27993:64:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28068:24;28102:6;28095:24;;;28128:4;28095:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28068:66;;28160:6;28153:23;;;28177:3;28182:16;28153:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28145:54;;27897:310;27798:409:::0;;;;:::o;27171:260::-;2184:12;:10;:12::i;:::-;2173:23;;:7;:5;:7::i;:::-;:23;;;2165:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27283:1:::1;27260:25;;:11;:25;;::::0;27252:84:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;27360:11;27347:10;;:24;;;;;;;;;;;;;;;;;;27412:10;;;;;;;;;;;27387:36;;;;;;;;;;;;27171:260:::0;:::o;22120:25::-;;;;:::o;1953:87::-;1999:7;2026:6;;;;;;;;;;;2019:13;;1953:87;:::o;21647:25::-;;;;;;;;;;;;;:::o;21966:27::-;;;;:::o;9396:104::-;9452:13;9485:7;9478:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9396:104;:::o;21775:27::-;;;;:::o;22000:37::-;;;;:::o;22152:27::-;;;;:::o;13756:438::-;13849:4;13866:13;13882:12;:10;:12::i;:::-;13866:28;;13905:24;13932:11;:18;13944:5;13932:18;;;;;;;;;;;;;;;:27;13951:7;13932:27;;;;;;;;;;;;;;;;13905:54;;13998:15;13978:16;:35;;13970:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;14091:60;14100:5;14107:7;14135:15;14116:16;:34;14091:8;:60::i;:::-;14182:4;14175:11;;;;13756:438;;;;:::o;10801:193::-;10880:4;10897:13;10913:12;:10;:12::i;:::-;10897:28;;10936;10946:5;10953:2;10957:6;10936:9;:28::i;:::-;10982:4;10975:11;;;10801:193;;;;:::o;26698:129::-;2184:12;:10;:12::i;:::-;2173:23;;:7;:5;:7::i;:::-;:23;;;2165:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26811:8:::1;26783:16;:25;26800:7;26783:25;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;26698:129:::0;;:::o;22186:27::-;;;;:::o;21809:26::-;;;;:::o;29965:269::-;2184:12;:10;:12::i;:::-;2173:23;;:7;:5;:7::i;:::-;:23;;;2165:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30118:6:::1;30110:4;30106:1;30090:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;30089:35;;;;:::i;:::-;30066:19;:58;;30058:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30221:6;30199:19;:28;;;;:::i;:::-;30178:18;:49;;;;29965:269:::0;:::o;11057:151::-;11146:7;11173:11;:18;11185:5;11173:18;;;;;;;;;;;;;;;:27;11192:7;11173:27;;;;;;;;;;;;;;;;11166:34;;11057:151;;;;:::o;21745:23::-;;;;:::o;34267:260::-;34315:7;34339:15;:29;;;34369:10;34381:16;34339:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34335:185;;34507:1;34500:8;;;;34335:185;34456:7;34464:1;34456:10;;;;;;;;:::i;:::-;;;;;;;;34449:17;;;34267:260;;:::o;27478:277::-;2184:12;:10;:12::i;:::-;2173:23;;:7;:5;:7::i;:::-;:23;;;2165:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27593:1:::1;27569:26;;:12;:26;;::::0;27561:86:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;27680:12;27658:11;;:35;;;;;;;;;;;;;;;;;;27735:11;;;;;;;;;;;27709:38;;;;;;;;;;;;27478:277:::0;:::o;26006:337::-;26081:1;26055:11;:23;26067:10;26055:23;;;;;;;;;;;;;;;;:27;26047:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;26157:21;26167:10;;;;;;;;;;;26157:9;:21::i;:::-;26130:11;:23;26142:10;26130:23;;;;;;;;;;;;;;;;:48;;26122:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;26230:64;26246:10;;;;;;;;;;;26258;26270:11;:23;26282:10;26270:23;;;;;;;;;;;;;;;;26230:15;:64::i;:::-;26312:11;:23;26324:10;26312:23;;;;;;;;;;;;;;;26305:30;;;26006:337::o;2862:201::-;2184:12;:10;:12::i;:::-;2173:23;;:7;:5;:7::i;:::-;:23;;;2165:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2971:1:::1;2951:22;;:8;:22;;::::0;2943:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3027:28;3046:8;3027:18;:28::i;:::-;2862:201:::0;:::o;21714:24::-;;;;:::o;679:98::-;732:7;759:10;752:17;;679:98;:::o;17392:380::-;17545:1;17528:19;;:5;:19;;;17520:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17626:1;17607:21;;:7;:21;;;17599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17710:6;17680:11;:18;17692:5;17680:18;;;;;;;;;;;;;;;:27;17699:7;17680:27;;;;;;;;;;;;;;;:36;;;;17748:7;17732:32;;17741:5;17732:32;;;17757:6;17732:32;;;;;;:::i;:::-;;;;;;;;17392:380;;;:::o;18059:453::-;18194:24;18221:25;18231:5;18238:7;18221:9;:25::i;:::-;18194:52;;18281:17;18261:16;:37;18257:248;;18343:6;18323:16;:26;;18315:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18427:51;18436:5;18443:7;18471:6;18452:16;:25;18427:8;:51::i;:::-;18257:248;18183:329;18059:453;;;:::o;23806:2141::-;23920:1;23904:18;;:4;:18;;;23896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23997:1;23983:16;;:2;:16;;;23975:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;24067:1;24058:6;:10;24050:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;24128:16;:22;24145:4;24128:22;;;;;;;;;;;;;;;;;;;;;;;;;24127:23;:48;;;;;24155:16;:20;24172:2;24155:20;;;;;;;;;;;;;;;;;;;;;;;;;24154:21;24127:48;24123:1773;;;24202:13;24196:19;;:2;:19;;;24192:126;;24270:9;;24253:13;24263:2;24253:9;:13::i;:::-;24244:6;:22;;;;:::i;:::-;:35;;24236:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;24192:126;24334:12;:10;:12::i;:::-;24375:13;24367:21;;:4;:21;;;24363:1522;;24409:13;24483:11;:15;24495:2;24483:15;;;;;;;;;;;;;;;;24477:3;24462:12;;24453:6;:21;;;;:::i;:::-;:27;;;;:::i;:::-;:45;;;;:::i;:::-;24445:53;;24529:1;24521:5;:9;24517:312;;;24568:21;24578:10;;;;;;;;;;;24568:9;:21::i;:::-;24559:5;:30;24555:255;;24618:38;24634:10;;;;;;;;;;;24646:2;24650:5;24618:15;:38::i;:::-;24690:11;:15;24702:2;24690:15;;;;;;;;;;;;;;;24683:22;;;24555:255;;;24781:5;24762:11;:15;24774:2;24762:15;;;;;;;;;;;;;;;;:24;;;;;;;:::i;:::-;;;;;;;;24555:255;24517:312;24390:454;24363:1522;;;24860:13;24854:19;;:2;:19;;;:35;;;;;24888:1;24877:8;;:12;24854:35;24850:1035;;;24942:18;;24914:24;24932:4;24914:9;:24::i;:::-;:46;24910:105;;24985:10;:8;:10::i;:::-;24910:105;25035:12;25070:19;25139:3;25128:8;;25119:6;:17;;;;:::i;:::-;:23;;;;:::i;:::-;25112:30;;25197:3;25184:10;;25175:6;:19;;;;:::i;:::-;:25;;;;:::i;:::-;25161:39;;25261:8;;25247:11;;25240:4;:18;;;;:::i;:::-;:29;;;;:::i;:::-;25219:17;;:50;;;;;;;:::i;:::-;;;;;;;;25332:8;;25317:12;;25310:4;:19;;;;:::i;:::-;:30;;;;:::i;:::-;25288:18;;:52;;;;;;;:::i;:::-;;;;;;;;25370:1;25363:4;:8;25359:99;;;25396:42;25412:4;25426;25433;25396:15;:42::i;:::-;25359:99;25496:1;25482:11;:15;25478:110;;;25522:46;25538:4;25544:10;;;;;;;;;;;25556:11;25522:15;:46::i;:::-;25478:110;25632:1;25612:11;:17;25624:4;25612:17;;;;;;;;;;;;;;;;:21;:67;;;;;25658:21;25668:10;;;;;;;;;;;25658:9;:21::i;:::-;25637:11;:17;25649:4;25637:17;;;;;;;;;;;;;;;;:42;;25612:67;25608:215;;;25704:52;25720:10;;;;;;;;;;;25732:4;25738:11;:17;25750:4;25738:17;;;;;;;;;;;;;;;;25704:15;:52::i;:::-;25786:11;:17;25798:4;25786:17;;;;;;;;;;;;;;;25779:24;;;25608:215;25858:11;25851:4;:18;;;;:::i;:::-;25841:28;;;;;:::i;:::-;;;24891:994;;24850:1035;24363:1522;24123:1773;25906:33;25922:4;25928:2;25932:6;25906:15;:33::i;:::-;23806:2141;;;:::o;32229:173::-;32302:13;32289:10;:26;;;;32341:1;32326:12;:16;;;;32368:1;32353:12;:16;;;;32393:1;32380:10;:14;;;;32229:173;:::o;3223:191::-;3297:16;3316:6;;;;;;;;;;;3297:25;;3342:8;3333:6;;:17;;;;;;;;;;;;;;;;;;3397:8;3366:40;;3387:8;3366:40;;;;;;;;;;;;3286:128;3223:191;:::o;14673:671::-;14820:1;14804:18;;:4;:18;;;14796:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14897:1;14883:16;;:2;:16;;;14875:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;14952:38;14973:4;14979:2;14983:6;14952:20;:38::i;:::-;15003:19;15025:9;:15;15035:4;15025:15;;;;;;;;;;;;;;;;15003:37;;15074:6;15059:11;:21;;15051:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;15191:6;15177:11;:20;15159:9;:15;15169:4;15159:15;;;;;;;;;;;;;;;:38;;;;15236:6;15219:9;:13;15229:2;15219:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;15275:2;15260:26;;15269:4;15260:26;;;15279:6;15260:26;;;;;;:::i;:::-;;;;;;;;15299:37;15319:4;15325:2;15329:6;15299:19;:37::i;:::-;14785:559;14673:671;;;:::o;30835:1341::-;30891:17;:15;:17::i;:::-;30876:12;:32;;;;30943:1;30927:12;;:17;30919:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;30999:10;;30983:12;;:26;;:45;;;;31027:1;31013:10;;:15;30983:45;30979:1190;;;31045:22;31054:12;;31045:8;:22::i;:::-;30979:1190;;;31104:10;;31089:12;;:25;31085:1084;;;31151:1;31135:12;;:17;31131:243;;31206:10;31188:15;:28;;;;:::i;:::-;31173:12;:43;;;;31131:243;;;31280:12;;31261:15;:31;31257:102;;31317:22;31326:12;;31317:8;:22::i;:::-;31257:102;31131:243;31390:23;31447:12;;31434:10;;31426:5;:18;;;;:::i;:::-;:33;;;;:::i;:::-;31417:5;:43;;;;:::i;:::-;31390:71;;31507:16;;31500:3;31482:15;:21;;;;:::i;:::-;:41;31478:680;;31584:16;;31559:22;;:41;;;;:::i;:::-;31544:12;:56;;;;31655:16;;31632:20;;:39;;;;:::i;:::-;31619:10;:52;;;;31478:680;;;31741:2;31734:3;31716:15;:21;;;;:::i;:::-;:27;31712:431;;31835:1;31828:3;31810:15;:21;;;;:::i;:::-;31809:27;;;;:::i;:::-;31783:22;;:54;;;;:::i;:::-;31768:12;:69;;;;31923:1;31916:3;31898:15;:21;;;;:::i;:::-;31897:27;;;;:::i;:::-;31873:20;;:52;;;;:::i;:::-;31860:10;:65;;;;31712:431;;;32034:3;32016:15;:21;;;;:::i;:::-;31989:22;;:50;;;;:::i;:::-;31974:12;:65;;;;32118:3;32100:15;:21;;;;:::i;:::-;32075:20;;:48;;;;:::i;:::-;32062:10;:61;;;;31712:431;31478:680;31116:1053;31085:1084;30979:1190;30835:1341::o;32460:1118::-;32499:23;32525:24;32543:4;32525:9;:24::i;:::-;32499:50;;32560:25;32608:18;;32588:17;;:38;;;;:::i;:::-;32560:66;;32670:1;32651:15;:20;:46;;;;32696:1;32675:17;:22;32651:46;32647:85;;;32714:7;;;;32647:85;32787:2;32766:18;;:23;;;;:::i;:::-;32748:15;:41;32744:115;;;32845:2;32824:18;;:23;;;;:::i;:::-;32806:41;;32744:115;32871:12;32894:23;32979:1;32959:17;32938:18;;32920:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;32894:86;;32991:51;33026:15;33008;:33;;;;:::i;:::-;32991:16;:51::i;:::-;33056:18;33077:21;33056:42;;33109:22;33210:1;33189:18;;:22;;;;:::i;:::-;33168:17;:44;;;;:::i;:::-;33147:17;;33134:10;:30;;;;:::i;:::-;:79;;;;:::i;:::-;33109:104;;33224:23;33263:14;33250:10;:27;;;;:::i;:::-;33224:53;;33311:1;33290:18;:22;;;;33343:1;33323:17;:21;;;;33387:1;33369:15;:19;:42;;;;;33410:1;33392:15;:19;33369:42;33365:121;;;33428:46;33441:15;33458;33428:12;:46::i;:::-;33365:121;33519:11;;;;;;;;;;;33511:25;;33544:21;33511:59;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33498:72;;;;;32488:1090;;;;;;;32460:1118;:::o;19112:125::-;;;;:::o;19841:124::-;;;;:::o;33620:471::-;33686:21;33724:1;33710:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33686:40;;33755:4;33737;33742:1;33737:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;33781:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33771:4;33776:1;33771:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;33814:62;33831:4;33846:15;33864:11;33814:8;:62::i;:::-;33887:15;:66;;;33968:11;33994:1;34010:4;34037;34057:15;33887:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33675:416;33620:471;:::o;30388:360::-;30469:62;30486:4;30501:15;30519:11;30469:8;:62::i;:::-;30542:15;:31;;;30581:9;30614:4;30634:11;30660:1;30676;30692:7;:5;:7::i;:::-;30714:15;30542:198;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;30388:360;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1397:75::-;1430:6;1463:2;1457:9;1447:19;;1397:75;:::o;1478:117::-;1587:1;1584;1577:12;1601:117;1710:1;1707;1700:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:329::-;3905:6;3954:2;3942:9;3933:7;3929:23;3925:32;3922:119;;;3960:79;;:::i;:::-;3922:119;4080:1;4105:53;4150:7;4141:6;4130:9;4126:22;4105:53;:::i;:::-;4095:63;;4051:117;3846:329;;;;:::o;4181:619::-;4258:6;4266;4274;4323:2;4311:9;4302:7;4298:23;4294:32;4291:119;;;4329:79;;:::i;:::-;4291:119;4449:1;4474:53;4519:7;4510:6;4499:9;4495:22;4474:53;:::i;:::-;4464:63;;4420:117;4576:2;4602:53;4647:7;4638:6;4627:9;4623:22;4602:53;:::i;:::-;4592:63;;4547:118;4704:2;4730:53;4775:7;4766:6;4755:9;4751:22;4730:53;:::i;:::-;4720:63;;4675:118;4181:619;;;;;:::o;4806:86::-;4841:7;4881:4;4874:5;4870:16;4859:27;;4806:86;;;:::o;4898:112::-;4981:22;4997:5;4981:22;:::i;:::-;4976:3;4969:35;4898:112;;:::o;5016:214::-;5105:4;5143:2;5132:9;5128:18;5120:26;;5156:67;5220:1;5209:9;5205:17;5196:6;5156:67;:::i;:::-;5016:214;;;;:::o;5236:329::-;5295:6;5344:2;5332:9;5323:7;5319:23;5315:32;5312:119;;;5350:79;;:::i;:::-;5312:119;5470:1;5495:53;5540:7;5531:6;5520:9;5516:22;5495:53;:::i;:::-;5485:63;;5441:117;5236:329;;;;:::o;5571:118::-;5658:24;5676:5;5658:24;:::i;:::-;5653:3;5646:37;5571:118;;:::o;5695:222::-;5788:4;5826:2;5815:9;5811:18;5803:26;;5839:71;5907:1;5896:9;5892:17;5883:6;5839:71;:::i;:::-;5695:222;;;;:::o;5923:474::-;5991:6;5999;6048:2;6036:9;6027:7;6023:23;6019:32;6016:119;;;6054:79;;:::i;:::-;6016:119;6174:1;6199:53;6244:7;6235:6;6224:9;6220:22;6199:53;:::i;:::-;6189:63;;6145:117;6301:2;6327:53;6372:7;6363:6;6352:9;6348:22;6327:53;:::i;:::-;6317:63;;6272:118;5923:474;;;;;:::o;6403:::-;6471:6;6479;6528:2;6516:9;6507:7;6503:23;6499:32;6496:119;;;6534:79;;:::i;:::-;6496:119;6654:1;6679:53;6724:7;6715:6;6704:9;6700:22;6679:53;:::i;:::-;6669:63;;6625:117;6781:2;6807:53;6852:7;6843:6;6832:9;6828:22;6807:53;:::i;:::-;6797:63;;6752:118;6403:474;;;;;:::o;6883:116::-;6953:21;6968:5;6953:21;:::i;:::-;6946:5;6943:32;6933:60;;6989:1;6986;6979:12;6933:60;6883:116;:::o;7005:133::-;7048:5;7086:6;7073:20;7064:29;;7102:30;7126:5;7102:30;:::i;:::-;7005:133;;;;:::o;7144:468::-;7209:6;7217;7266:2;7254:9;7245:7;7241:23;7237:32;7234:119;;;7272:79;;:::i;:::-;7234:119;7392:1;7417:53;7462:7;7453:6;7442:9;7438:22;7417:53;:::i;:::-;7407:63;;7363:117;7519:2;7545:50;7587:7;7578:6;7567:9;7563:22;7545:50;:::i;:::-;7535:60;;7490:115;7144:468;;;;;:::o;7618:180::-;7666:77;7663:1;7656:88;7763:4;7760:1;7753:15;7787:4;7784:1;7777:15;7804:320;7848:6;7885:1;7879:4;7875:12;7865:22;;7932:1;7926:4;7922:12;7953:18;7943:81;;8009:4;8001:6;7997:17;7987:27;;7943:81;8071:2;8063:6;8060:14;8040:18;8037:38;8034:84;;8090:18;;:::i;:::-;8034:84;7855:269;7804:320;;;:::o;8130:182::-;8270:34;8266:1;8258:6;8254:14;8247:58;8130:182;:::o;8318:366::-;8460:3;8481:67;8545:2;8540:3;8481:67;:::i;:::-;8474:74;;8557:93;8646:3;8557:93;:::i;:::-;8675:2;8670:3;8666:12;8659:19;;8318:366;;;:::o;8690:419::-;8856:4;8894:2;8883:9;8879:18;8871:26;;8943:9;8937:4;8933:20;8929:1;8918:9;8914:17;8907:47;8971:131;9097:4;8971:131;:::i;:::-;8963:139;;8690:419;;;:::o;9115:221::-;9255:34;9251:1;9243:6;9239:14;9232:58;9324:4;9319:2;9311:6;9307:15;9300:29;9115:221;:::o;9342:366::-;9484:3;9505:67;9569:2;9564:3;9505:67;:::i;:::-;9498:74;;9581:93;9670:3;9581:93;:::i;:::-;9699:2;9694:3;9690:12;9683:19;;9342:366;;;:::o;9714:419::-;9880:4;9918:2;9907:9;9903:18;9895:26;;9967:9;9961:4;9957:20;9953:1;9942:9;9938:17;9931:47;9995:131;10121:4;9995:131;:::i;:::-;9987:139;;9714:419;;;:::o;10139:180::-;10187:77;10184:1;10177:88;10284:4;10281:1;10274:15;10308:4;10305:1;10298:15;10325:348;10365:7;10388:20;10406:1;10388:20;:::i;:::-;10383:25;;10422:20;10440:1;10422:20;:::i;:::-;10417:25;;10610:1;10542:66;10538:74;10535:1;10532:81;10527:1;10520:9;10513:17;10509:105;10506:131;;;10617:18;;:::i;:::-;10506:131;10665:1;10662;10658:9;10647:20;;10325:348;;;;:::o;10679:180::-;10727:77;10724:1;10717:88;10824:4;10821:1;10814:15;10848:4;10845:1;10838:15;10865:185;10905:1;10922:20;10940:1;10922:20;:::i;:::-;10917:25;;10956:20;10974:1;10956:20;:::i;:::-;10951:25;;10995:1;10985:35;;11000:18;;:::i;:::-;10985:35;11042:1;11039;11035:9;11030:14;;10865:185;;;;:::o;11056:147::-;11157:11;11194:3;11179:18;;11056:147;;;;:::o;11209:114::-;;:::o;11329:398::-;11488:3;11509:83;11590:1;11585:3;11509:83;:::i;:::-;11502:90;;11601:93;11690:3;11601:93;:::i;:::-;11719:1;11714:3;11710:11;11703:18;;11329:398;;;:::o;11733:379::-;11917:3;11939:147;12082:3;11939:147;:::i;:::-;11932:154;;12103:3;12096:10;;11733:379;;;:::o;12118:305::-;12158:3;12177:20;12195:1;12177:20;:::i;:::-;12172:25;;12211:20;12229:1;12211:20;:::i;:::-;12206:25;;12365:1;12297:66;12293:74;12290:1;12287:81;12284:107;;;12371:18;;:::i;:::-;12284:107;12415:1;12412;12408:9;12401:16;;12118:305;;;;:::o;12429:167::-;12569:19;12565:1;12557:6;12553:14;12546:43;12429:167;:::o;12602:366::-;12744:3;12765:67;12829:2;12824:3;12765:67;:::i;:::-;12758:74;;12841:93;12930:3;12841:93;:::i;:::-;12959:2;12954:3;12950:12;12943:19;;12602:366;;;:::o;12974:419::-;13140:4;13178:2;13167:9;13163:18;13155:26;;13227:9;13221:4;13217:20;13213:1;13202:9;13198:17;13191:47;13255:131;13381:4;13255:131;:::i;:::-;13247:139;;12974:419;;;:::o;13399:173::-;13539:25;13535:1;13527:6;13523:14;13516:49;13399:173;:::o;13578:366::-;13720:3;13741:67;13805:2;13800:3;13741:67;:::i;:::-;13734:74;;13817:93;13906:3;13817:93;:::i;:::-;13935:2;13930:3;13926:12;13919:19;;13578:366;;;:::o;13950:419::-;14116:4;14154:2;14143:9;14139:18;14131:26;;14203:9;14197:4;14193:20;14189:1;14178:9;14174:17;14167:47;14231:131;14357:4;14231:131;:::i;:::-;14223:139;;13950:419;;;:::o;14375:176::-;14515:28;14511:1;14503:6;14499:14;14492:52;14375:176;:::o;14557:366::-;14699:3;14720:67;14784:2;14779:3;14720:67;:::i;:::-;14713:74;;14796:93;14885:3;14796:93;:::i;:::-;14914:2;14909:3;14905:12;14898:19;;14557:366;;;:::o;14929:419::-;15095:4;15133:2;15122:9;15118:18;15110:26;;15182:9;15176:4;15172:20;15168:1;15157:9;15153:17;15146:47;15210:131;15336:4;15210:131;:::i;:::-;15202:139;;14929:419;;;:::o;15354:179::-;15494:31;15490:1;15482:6;15478:14;15471:55;15354:179;:::o;15539:366::-;15681:3;15702:67;15766:2;15761:3;15702:67;:::i;:::-;15695:74;;15778:93;15867:3;15778:93;:::i;:::-;15896:2;15891:3;15887:12;15880:19;;15539:366;;;:::o;15911:419::-;16077:4;16115:2;16104:9;16100:18;16092:26;;16164:9;16158:4;16154:20;16150:1;16139:9;16135:17;16128:47;16192:131;16318:4;16192:131;:::i;:::-;16184:139;;15911:419;;;:::o;16336:223::-;16476:34;16472:1;16464:6;16460:14;16453:58;16545:6;16540:2;16532:6;16528:15;16521:31;16336:223;:::o;16565:366::-;16707:3;16728:67;16792:2;16787:3;16728:67;:::i;:::-;16721:74;;16804:93;16893:3;16804:93;:::i;:::-;16922:2;16917:3;16913:12;16906:19;;16565:366;;;:::o;16937:419::-;17103:4;17141:2;17130:9;17126:18;17118:26;;17190:9;17184:4;17180:20;17176:1;17165:9;17161:17;17154:47;17218:131;17344:4;17218:131;:::i;:::-;17210:139;;16937:419;;;:::o;17362:226::-;17502:34;17498:1;17490:6;17486:14;17479:58;17571:9;17566:2;17558:6;17554:15;17547:34;17362:226;:::o;17594:366::-;17736:3;17757:67;17821:2;17816:3;17757:67;:::i;:::-;17750:74;;17833:93;17922:3;17833:93;:::i;:::-;17951:2;17946:3;17942:12;17935:19;;17594:366;;;:::o;17966:419::-;18132:4;18170:2;18159:9;18155:18;18147:26;;18219:9;18213:4;18209:20;18205:1;18194:9;18190:17;18183:47;18247:131;18373:4;18247:131;:::i;:::-;18239:139;;17966:419;;;:::o;18391:224::-;18531:34;18527:1;18519:6;18515:14;18508:58;18600:7;18595:2;18587:6;18583:15;18576:32;18391:224;:::o;18621:366::-;18763:3;18784:67;18848:2;18843:3;18784:67;:::i;:::-;18777:74;;18860:93;18949:3;18860:93;:::i;:::-;18978:2;18973:3;18969:12;18962:19;;18621:366;;;:::o;18993:419::-;19159:4;19197:2;19186:9;19182:18;19174:26;;19246:9;19240:4;19236:20;19232:1;19221:9;19217:17;19210:47;19274:131;19400:4;19274:131;:::i;:::-;19266:139;;18993:419;;;:::o;19418:332::-;19539:4;19577:2;19566:9;19562:18;19554:26;;19590:71;19658:1;19647:9;19643:17;19634:6;19590:71;:::i;:::-;19671:72;19739:2;19728:9;19724:18;19715:6;19671:72;:::i;:::-;19418:332;;;;;:::o;19756:228::-;19896:34;19892:1;19884:6;19880:14;19873:58;19965:11;19960:2;19952:6;19948:15;19941:36;19756:228;:::o;19990:366::-;20132:3;20153:67;20217:2;20212:3;20153:67;:::i;:::-;20146:74;;20229:93;20318:3;20229:93;:::i;:::-;20347:2;20342:3;20338:12;20331:19;;19990:366;;;:::o;20362:419::-;20528:4;20566:2;20555:9;20551:18;20543:26;;20615:9;20609:4;20605:20;20601:1;20590:9;20586:17;20579:47;20643:131;20769:4;20643:131;:::i;:::-;20635:139;;20362:419;;;:::o;20787:178::-;20927:30;20923:1;20915:6;20911:14;20904:54;20787:178;:::o;20971:366::-;21113:3;21134:67;21198:2;21193:3;21134:67;:::i;:::-;21127:74;;21210:93;21299:3;21210:93;:::i;:::-;21328:2;21323:3;21319:12;21312:19;;20971:366;;;:::o;21343:419::-;21509:4;21547:2;21536:9;21532:18;21524:26;;21596:9;21590:4;21586:20;21582:1;21571:9;21567:17;21560:47;21624:131;21750:4;21624:131;:::i;:::-;21616:139;;21343:419;;;:::o;21768:143::-;21825:5;21856:6;21850:13;21841:22;;21872:33;21899:5;21872:33;:::i;:::-;21768:143;;;;:::o;21917:351::-;21987:6;22036:2;22024:9;22015:7;22011:23;22007:32;22004:119;;;22042:79;;:::i;:::-;22004:119;22162:1;22187:64;22243:7;22234:6;22223:9;22219:22;22187:64;:::i;:::-;22177:74;;22133:128;21917:351;;;;:::o;22274:332::-;22395:4;22433:2;22422:9;22418:18;22410:26;;22446:71;22514:1;22503:9;22499:17;22490:6;22446:71;:::i;:::-;22527:72;22595:2;22584:9;22580:18;22571:6;22527:72;:::i;:::-;22274:332;;;;;:::o;22612:137::-;22666:5;22697:6;22691:13;22682:22;;22713:30;22737:5;22713:30;:::i;:::-;22612:137;;;;:::o;22755:345::-;22822:6;22871:2;22859:9;22850:7;22846:23;22842:32;22839:119;;;22877:79;;:::i;:::-;22839:119;22997:1;23022:61;23075:7;23066:6;23055:9;23051:22;23022:61;:::i;:::-;23012:71;;22968:125;22755:345;;;;:::o;23106:233::-;23246:34;23242:1;23234:6;23230:14;23223:58;23315:16;23310:2;23302:6;23298:15;23291:41;23106:233;:::o;23345:366::-;23487:3;23508:67;23572:2;23567:3;23508:67;:::i;:::-;23501:74;;23584:93;23673:3;23584:93;:::i;:::-;23702:2;23697:3;23693:12;23686:19;;23345:366;;;:::o;23717:419::-;23883:4;23921:2;23910:9;23906:18;23898:26;;23970:9;23964:4;23960:20;23956:1;23945:9;23941:17;23934:47;23998:131;24124:4;23998:131;:::i;:::-;23990:139;;23717:419;;;:::o;24142:224::-;24282:34;24278:1;24270:6;24266:14;24259:58;24351:7;24346:2;24338:6;24334:15;24327:32;24142:224;:::o;24372:366::-;24514:3;24535:67;24599:2;24594:3;24535:67;:::i;:::-;24528:74;;24611:93;24700:3;24611:93;:::i;:::-;24729:2;24724:3;24720:12;24713:19;;24372:366;;;:::o;24744:419::-;24910:4;24948:2;24937:9;24933:18;24925:26;;24997:9;24991:4;24987:20;24983:1;24972:9;24968:17;24961:47;25025:131;25151:4;25025:131;:::i;:::-;25017:139;;24744:419;;;:::o;25169:226::-;25309:34;25305:1;25297:6;25293:14;25286:58;25378:9;25373:2;25365:6;25361:15;25354:34;25169:226;:::o;25401:366::-;25543:3;25564:67;25628:2;25623:3;25564:67;:::i;:::-;25557:74;;25640:93;25729:3;25640:93;:::i;:::-;25758:2;25753:3;25749:12;25742:19;;25401:366;;;:::o;25773:419::-;25939:4;25977:2;25966:9;25962:18;25954:26;;26026:9;26020:4;26016:20;26012:1;26001:9;25997:17;25990:47;26054:131;26180:4;26054:131;:::i;:::-;26046:139;;25773:419;;;:::o;26198:103::-;26261:7;26290:5;26279:16;;26198:103;;;:::o;26307:60::-;26335:3;26356:5;26349:12;;26307:60;;;:::o;26373:194::-;26449:9;26482:79;26500:60;26509:50;26553:5;26509:50;:::i;:::-;26500:60;:::i;:::-;26482:79;:::i;:::-;26469:92;;26373:194;;;:::o;26573:183::-;26686:63;26743:5;26686:63;:::i;:::-;26681:3;26674:76;26573:183;;:::o;26762:111::-;26826:6;26860:5;26854:12;26844:22;;26762:111;;;:::o;26879:184::-;26978:11;27012:6;27007:3;27000:19;27052:4;27047:3;27043:14;27028:29;;26879:184;;;;:::o;27069:156::-;27133:4;27156:3;27148:11;;27179:3;27176:1;27169:14;27213:4;27210:1;27200:18;27192:26;;27069:156;;;:::o;27231:108::-;27308:24;27326:5;27308:24;:::i;:::-;27303:3;27296:37;27231:108;;:::o;27345:179::-;27414:10;27435:46;27477:3;27469:6;27435:46;:::i;:::-;27513:4;27508:3;27504:14;27490:28;;27345:179;;;;:::o;27530:102::-;27572:8;27619:5;27616:1;27612:13;27591:34;;27530:102;;;:::o;27638:139::-;27688:7;27728:42;27721:5;27717:54;27706:65;;27638:139;;;:::o;27783:166::-;27852:5;27877:66;27908:34;27931:10;27908:34;:::i;:::-;27877:66;:::i;:::-;27868:75;;27783:166;;;:::o;27955:144::-;28010:5;28035:57;28086:4;28080:11;28035:57;:::i;:::-;28026:66;;27955:144;;;:::o;28105:110::-;28172:4;28204;28199:3;28195:14;28187:22;;28105:110;;;:::o;28251:751::-;28367:3;28396:51;28441:5;28396:51;:::i;:::-;28463:86;28542:6;28537:3;28463:86;:::i;:::-;28456:93;;28573:53;28620:5;28573:53;:::i;:::-;28649:7;28680:1;28665:312;28690:6;28687:1;28684:13;28665:312;;;28760:44;28797:6;28760:44;:::i;:::-;28824:63;28883:3;28868:13;28824:63;:::i;:::-;28817:70;;28910:57;28960:6;28910:57;:::i;:::-;28900:67;;28725:252;28712:1;28709;28705:9;28700:14;;28665:312;;;28669:14;28993:3;28986:10;;28372:630;;;28251:751;;;;:::o;29008:529::-;29202:4;29240:2;29229:9;29225:18;29217:26;;29253:97;29347:1;29336:9;29332:17;29323:6;29253:97;:::i;:::-;29397:9;29391:4;29387:20;29382:2;29371:9;29367:18;29360:48;29425:105;29525:4;29516:6;29425:105;:::i;:::-;29417:113;;29008:529;;;;;:::o;29543:117::-;29652:1;29649;29642:12;29666:180;29714:77;29711:1;29704:88;29811:4;29808:1;29801:15;29835:4;29832:1;29825:15;29852:281;29935:27;29957:4;29935:27;:::i;:::-;29927:6;29923:40;30065:6;30053:10;30050:22;30029:18;30017:10;30014:34;30011:62;30008:88;;;30076:18;;:::i;:::-;30008:88;30116:10;30112:2;30105:22;29895:238;29852:281;;:::o;30139:129::-;30173:6;30200:20;;:::i;:::-;30190:30;;30229:33;30257:4;30249:6;30229:33;:::i;:::-;30139:129;;;:::o;30274:311::-;30351:4;30441:18;30433:6;30430:30;30427:56;;;30463:18;;:::i;:::-;30427:56;30513:4;30505:6;30501:17;30493:25;;30573:4;30567;30563:15;30555:23;;30274:311;;;:::o;30591:117::-;30700:1;30697;30690:12;30731:732;30838:5;30863:81;30879:64;30936:6;30879:64;:::i;:::-;30863:81;:::i;:::-;30854:90;;30964:5;30993:6;30986:5;30979:21;31027:4;31020:5;31016:16;31009:23;;31080:4;31072:6;31068:17;31060:6;31056:30;31109:3;31101:6;31098:15;31095:122;;;31128:79;;:::i;:::-;31095:122;31243:6;31226:231;31260:6;31255:3;31252:15;31226:231;;;31335:3;31364:48;31408:3;31396:10;31364:48;:::i;:::-;31359:3;31352:61;31442:4;31437:3;31433:14;31426:21;;31302:155;31286:4;31281:3;31277:14;31270:21;;31226:231;;;31230:21;30844:619;;30731:732;;;;;:::o;31486:385::-;31568:5;31617:3;31610:4;31602:6;31598:17;31594:27;31584:122;;31625:79;;:::i;:::-;31584:122;31735:6;31729:13;31760:105;31861:3;31853:6;31846:4;31838:6;31834:17;31760:105;:::i;:::-;31751:114;;31574:297;31486:385;;;;:::o;31877:554::-;31972:6;32021:2;32009:9;32000:7;31996:23;31992:32;31989:119;;;32027:79;;:::i;:::-;31989:119;32168:1;32157:9;32153:17;32147:24;32198:18;32190:6;32187:30;32184:117;;;32220:79;;:::i;:::-;32184:117;32325:89;32406:7;32397:6;32386:9;32382:22;32325:89;:::i;:::-;32315:99;;32118:306;31877:554;;;;:::o;32437:180::-;32485:77;32482:1;32475:88;32582:4;32579:1;32572:15;32606:4;32603:1;32596:15;32623:234;32763:34;32759:1;32751:6;32747:14;32740:58;32832:17;32827:2;32819:6;32815:15;32808:42;32623:234;:::o;32863:366::-;33005:3;33026:67;33090:2;33085:3;33026:67;:::i;:::-;33019:74;;33102:93;33191:3;33102:93;:::i;:::-;33220:2;33215:3;33211:12;33204:19;;32863:366;;;:::o;33235:419::-;33401:4;33439:2;33428:9;33424:18;33416:26;;33488:9;33482:4;33478:20;33474:1;33463:9;33459:17;33452:47;33516:131;33642:4;33516:131;:::i;:::-;33508:139;;33235:419;;;:::o;33660:174::-;33800:26;33796:1;33788:6;33784:14;33777:50;33660:174;:::o;33840:366::-;33982:3;34003:67;34067:2;34062:3;34003:67;:::i;:::-;33996:74;;34079:93;34168:3;34079:93;:::i;:::-;34197:2;34192:3;34188:12;34181:19;;33840:366;;;:::o;34212:419::-;34378:4;34416:2;34405:9;34401:18;34393:26;;34465:9;34459:4;34455:20;34451:1;34440:9;34436:17;34429:47;34493:131;34619:4;34493:131;:::i;:::-;34485:139;;34212:419;;;:::o;34637:223::-;34777:34;34773:1;34765:6;34761:14;34754:58;34846:6;34841:2;34833:6;34829:15;34822:31;34637:223;:::o;34866:366::-;35008:3;35029:67;35093:2;35088:3;35029:67;:::i;:::-;35022:74;;35105:93;35194:3;35105:93;:::i;:::-;35223:2;35218:3;35214:12;35207:19;;34866:366;;;:::o;35238:419::-;35404:4;35442:2;35431:9;35427:18;35419:26;;35491:9;35485:4;35481:20;35477:1;35466:9;35462:17;35455:47;35519:131;35645:4;35519:131;:::i;:::-;35511:139;;35238:419;;;:::o;35663:225::-;35803:34;35799:1;35791:6;35787:14;35780:58;35872:8;35867:2;35859:6;35855:15;35848:33;35663:225;:::o;35894:366::-;36036:3;36057:67;36121:2;36116:3;36057:67;:::i;:::-;36050:74;;36133:93;36222:3;36133:93;:::i;:::-;36251:2;36246:3;36242:12;36235:19;;35894:366;;;:::o;36266:419::-;36432:4;36470:2;36459:9;36455:18;36447:26;;36519:9;36513:4;36509:20;36505:1;36494:9;36490:17;36483:47;36547:131;36673:4;36547:131;:::i;:::-;36539:139;;36266:419;;;:::o;36691:223::-;36831:34;36827:1;36819:6;36815:14;36808:58;36900:6;36895:2;36887:6;36883:15;36876:31;36691:223;:::o;36920:366::-;37062:3;37083:67;37147:2;37142:3;37083:67;:::i;:::-;37076:74;;37159:93;37248:3;37159:93;:::i;:::-;37277:2;37272:3;37268:12;37261:19;;36920:366;;;:::o;37292:419::-;37458:4;37496:2;37485:9;37481:18;37473:26;;37545:9;37539:4;37535:20;37531:1;37520:9;37516:17;37509:47;37573:131;37699:4;37573:131;:::i;:::-;37565:139;;37292:419;;;:::o;37717:221::-;37857:34;37853:1;37845:6;37841:14;37834:58;37926:4;37921:2;37913:6;37909:15;37902:29;37717:221;:::o;37944:366::-;38086:3;38107:67;38171:2;38166:3;38107:67;:::i;:::-;38100:74;;38183:93;38272:3;38183:93;:::i;:::-;38301:2;38296:3;38292:12;38285:19;;37944:366;;;:::o;38316:419::-;38482:4;38520:2;38509:9;38505:18;38497:26;;38569:9;38563:4;38559:20;38555:1;38544:9;38540:17;38533:47;38597:131;38723:4;38597:131;:::i;:::-;38589:139;;38316:419;;;:::o;38741:179::-;38881:31;38877:1;38869:6;38865:14;38858:55;38741:179;:::o;38926:366::-;39068:3;39089:67;39153:2;39148:3;39089:67;:::i;:::-;39082:74;;39165:93;39254:3;39165:93;:::i;:::-;39283:2;39278:3;39274:12;39267:19;;38926:366;;;:::o;39298:419::-;39464:4;39502:2;39491:9;39487:18;39479:26;;39551:9;39545:4;39541:20;39537:1;39526:9;39522:17;39515:47;39579:131;39705:4;39579:131;:::i;:::-;39571:139;;39298:419;;;:::o;39723:224::-;39863:34;39859:1;39851:6;39847:14;39840:58;39932:7;39927:2;39919:6;39915:15;39908:32;39723:224;:::o;39953:366::-;40095:3;40116:67;40180:2;40175:3;40116:67;:::i;:::-;40109:74;;40192:93;40281:3;40192:93;:::i;:::-;40310:2;40305:3;40301:12;40294:19;;39953:366;;;:::o;40325:419::-;40491:4;40529:2;40518:9;40514:18;40506:26;;40578:9;40572:4;40568:20;40564:1;40553:9;40549:17;40542:47;40606:131;40732:4;40606:131;:::i;:::-;40598:139;;40325:419;;;:::o;40750:222::-;40890:34;40886:1;40878:6;40874:14;40867:58;40959:5;40954:2;40946:6;40942:15;40935:30;40750:222;:::o;40978:366::-;41120:3;41141:67;41205:2;41200:3;41141:67;:::i;:::-;41134:74;;41217:93;41306:3;41217:93;:::i;:::-;41335:2;41330:3;41326:12;41319:19;;40978:366;;;:::o;41350:419::-;41516:4;41554:2;41543:9;41539:18;41531:26;;41603:9;41597:4;41593:20;41589:1;41578:9;41574:17;41567:47;41631:131;41757:4;41631:131;:::i;:::-;41623:139;;41350:419;;;:::o;41775:179::-;41915:31;41911:1;41903:6;41899:14;41892:55;41775:179;:::o;41960:366::-;42102:3;42123:67;42187:2;42182:3;42123:67;:::i;:::-;42116:74;;42199:93;42288:3;42199:93;:::i;:::-;42317:2;42312:3;42308:12;42301:19;;41960:366;;;:::o;42332:419::-;42498:4;42536:2;42525:9;42521:18;42513:26;;42585:9;42579:4;42575:20;42571:1;42560:9;42556:17;42549:47;42613:131;42739:4;42613:131;:::i;:::-;42605:139;;42332:419;;;:::o;42757:168::-;42897:20;42893:1;42885:6;42881:14;42874:44;42757:168;:::o;42931:366::-;43073:3;43094:67;43158:2;43153:3;43094:67;:::i;:::-;43087:74;;43170:93;43259:3;43170:93;:::i;:::-;43288:2;43283:3;43279:12;43272:19;;42931:366;;;:::o;43303:419::-;43469:4;43507:2;43496:9;43492:18;43484:26;;43556:9;43550:4;43546:20;43542:1;43531:9;43527:17;43520:47;43584:131;43710:4;43584:131;:::i;:::-;43576:139;;43303:419;;;:::o;43728:191::-;43768:4;43788:20;43806:1;43788:20;:::i;:::-;43783:25;;43822:20;43840:1;43822:20;:::i;:::-;43817:25;;43861:1;43858;43855:8;43852:34;;;43866:18;;:::i;:::-;43852:34;43911:1;43908;43904:9;43896:17;;43728:191;;;;:::o;43925:225::-;44065:34;44061:1;44053:6;44049:14;44042:58;44134:8;44129:2;44121:6;44117:15;44110:33;43925:225;:::o;44156:366::-;44298:3;44319:67;44383:2;44378:3;44319:67;:::i;:::-;44312:74;;44395:93;44484:3;44395:93;:::i;:::-;44513:2;44508:3;44504:12;44497:19;;44156:366;;;:::o;44528:419::-;44694:4;44732:2;44721:9;44717:18;44709:26;;44781:9;44775:4;44771:20;44767:1;44756:9;44752:17;44745:47;44809:131;44935:4;44809:131;:::i;:::-;44801:139;;44528:419;;;:::o;44953:176::-;44985:1;45002:20;45020:1;45002:20;:::i;:::-;44997:25;;45036:20;45054:1;45036:20;:::i;:::-;45031:25;;45075:1;45065:35;;45080:18;;:::i;:::-;45065:35;45121:1;45118;45114:9;45109:14;;44953:176;;;;:::o;45135:143::-;45192:5;45223:6;45217:13;45208:22;;45239:33;45266:5;45239:33;:::i;:::-;45135:143;;;;:::o;45284:351::-;45354:6;45403:2;45391:9;45382:7;45378:23;45374:32;45371:119;;;45409:79;;:::i;:::-;45371:119;45529:1;45554:64;45610:7;45601:6;45590:9;45586:22;45554:64;:::i;:::-;45544:74;;45500:128;45284:351;;;;:::o;45641:85::-;45686:7;45715:5;45704:16;;45641:85;;;:::o;45732:158::-;45790:9;45823:61;45841:42;45850:32;45876:5;45850:32;:::i;:::-;45841:42;:::i;:::-;45823:61;:::i;:::-;45810:74;;45732:158;;;:::o;45896:147::-;45991:45;46030:5;45991:45;:::i;:::-;45986:3;45979:58;45896:147;;:::o;46049:114::-;46116:6;46150:5;46144:12;46134:22;;46049:114;;;:::o;46169:132::-;46236:4;46259:3;46251:11;;46289:4;46284:3;46280:14;46272:22;;46169:132;;;:::o;46307:113::-;46377:4;46409;46404:3;46400:14;46392:22;;46307:113;;;:::o;46456:732::-;46575:3;46604:54;46652:5;46604:54;:::i;:::-;46674:86;46753:6;46748:3;46674:86;:::i;:::-;46667:93;;46784:56;46834:5;46784:56;:::i;:::-;46863:7;46894:1;46879:284;46904:6;46901:1;46898:13;46879:284;;;46980:6;46974:13;47007:63;47066:3;47051:13;47007:63;:::i;:::-;47000:70;;47093:60;47146:6;47093:60;:::i;:::-;47083:70;;46939:224;46926:1;46923;46919:9;46914:14;;46879:284;;;46883:14;47179:3;47172:10;;46580:608;;;46456:732;;;;:::o;47194:831::-;47457:4;47495:3;47484:9;47480:19;47472:27;;47509:71;47577:1;47566:9;47562:17;47553:6;47509:71;:::i;:::-;47590:80;47666:2;47655:9;47651:18;47642:6;47590:80;:::i;:::-;47717:9;47711:4;47707:20;47702:2;47691:9;47687:18;47680:48;47745:108;47848:4;47839:6;47745:108;:::i;:::-;47737:116;;47863:72;47931:2;47920:9;47916:18;47907:6;47863:72;:::i;:::-;47945:73;48013:3;48002:9;47998:19;47989:6;47945:73;:::i;:::-;47194:831;;;;;;;;:::o;48031:807::-;48280:4;48318:3;48307:9;48303:19;48295:27;;48332:71;48400:1;48389:9;48385:17;48376:6;48332:71;:::i;:::-;48413:72;48481:2;48470:9;48466:18;48457:6;48413:72;:::i;:::-;48495:80;48571:2;48560:9;48556:18;48547:6;48495:80;:::i;:::-;48585;48661:2;48650:9;48646:18;48637:6;48585:80;:::i;:::-;48675:73;48743:3;48732:9;48728:19;48719:6;48675:73;:::i;:::-;48758;48826:3;48815:9;48811:19;48802:6;48758:73;:::i;:::-;48031:807;;;;;;;;;:::o;48844:663::-;48932:6;48940;48948;48997:2;48985:9;48976:7;48972:23;48968:32;48965:119;;;49003:79;;:::i;:::-;48965:119;49123:1;49148:64;49204:7;49195:6;49184:9;49180:22;49148:64;:::i;:::-;49138:74;;49094:128;49261:2;49287:64;49343:7;49334:6;49323:9;49319:22;49287:64;:::i;:::-;49277:74;;49232:129;49400:2;49426:64;49482:7;49473:6;49462:9;49458:22;49426:64;:::i;:::-;49416:74;;49371:129;48844:663;;;;;:::o

Swarm Source

ipfs://24cc959935af2319992605466391be45ecbece230c5613dde171eb96685b0a92
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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