ETH Price: $2,935.61 (+4.10%)
 

Overview

Max Total Supply

10,000,000,000 DURDEN

Holders

21

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
90,000,000 DURDEN

Value
$0.00
0xA45EE2A6C3eF087251F560F6A4B9120d8b24eae1
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DurdenInu

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) internal view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key)
        internal
        view
        returns (int256)
    {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index)
        internal
        view
        returns (address)
    {
        return map.keys[index];
    }

    function size(Map storage map) internal view returns (uint256) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint256 val
    ) internal {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) internal {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        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
    );
}

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);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        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)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(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)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, 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 = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(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);

        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(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 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 to 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 {}
}

interface DividendPayingTokenOptionalInterface {
    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function withdrawableDividendOf(address _owner)
        external
        view
        returns (uint256);

    /// @notice View the amount of dividend in wei that an address has withdrawn.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has withdrawn.
    function withdrawnDividendOf(address _owner)
        external
        view
        returns (uint256);

    /// @notice View the amount of dividend in wei that an address has earned in total.
    /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has earned in total.
    function accumulativeDividendOf(address _owner)
        external
        view
        returns (uint256);
}

interface DividendPayingTokenInterface {
    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function dividendOf(address _owner) external view returns (uint256);

    /// @notice Distributes ether to token holders as dividends.
    /// @dev SHOULD distribute the paid ether to token holders as dividends.
    ///  SHOULD NOT directly transfer ether to token holders in this function.
    ///  MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0.
    function distributeDividends() external payable;

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
    ///  MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
    function withdrawDividend() external;

    /// @dev This event MUST emit when ether is distributed to token holders.
    /// @param from The address which sends ether to this contract.
    /// @param weiAmount The amount of distributed ether in wei.
    event DividendsDistributed(address indexed from, uint256 weiAmount);

    /// @dev This event MUST emit when an address withdraws their dividend.
    /// @param to The address which withdraws ether from this contract.
    /// @param weiAmount The amount of withdrawn ether in wei.
    event DividendWithdrawn(address indexed to, uint256 weiAmount);
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract DividendPayingToken is
    ERC20,
    DividendPayingTokenInterface,
    DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
    // For more discussion about choosing the value of `magnitude`,
    //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
    uint256 internal constant magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;

    // About dividendCorrection:
    // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
    //   `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
    // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
    //   `dividendOf(_user)` should not be changed,
    //   but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
    // To keep the `dividendOf(_user)` unchanged, we add a correction term:
    //   `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
    //   where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
    //   `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
    // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    uint256 public totalDividendsDistributed;

    constructor(string memory _name, string memory _symbol)
        ERC20(_name, _symbol)
    {}

    /// @dev Distributes dividends whenever ether is paid to this contract.
    receive() external payable {
        distributeDividends();
    }

    /// @notice Distributes ether to token holders as dividends.
    /// @dev It reverts if the total supply of tokens is 0.
    /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0.
    /// About undistributed ether:
    ///   In each distribution, there is a small amount of ether not distributed,
    ///     the magnified amount of which is
    ///     `(msg.value * magnitude) % totalSupply()`.
    ///   With a well-chosen `magnitude`, the amount of undistributed ether
    ///     (de-magnified) in a distribution can be less than 1 wei.
    ///   We can actually keep track of the undistributed ether in a distribution
    ///     and try to distribute it in the next distribution,
    ///     but keeping track of such data on-chain costs much more than
    ///     the saved ether, so we don't do that.
    function distributeDividends() public payable override {
        require(totalSupply() > 0);

        if (msg.value > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (msg.value).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, msg.value);

            totalDividendsDistributed = totalDividendsDistributed.add(
                msg.value
            );
        }
    }

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
    function _withdrawDividendOfUser(address payable user)
        internal
        virtual
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            emit DividendWithdrawn(user, _withdrawableDividend);
            (bool success, ) = user.call{
                value: _withdrawableDividend,
                gas: 3000
            }("");

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _withdrawableDividend
                );
                return 0;
            }

            return _withdrawableDividend;
        }

        return 0;
    }

    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function dividendOf(address _owner) public view override returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function withdrawableDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    /// @notice View the amount of dividend in wei that an address has withdrawn.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has withdrawn.
    function withdrawnDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return withdrawnDividends[_owner];
    }

    /// @notice View the amount of dividend in wei that an address has earned in total.
    /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
    /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has earned in total.
    function accumulativeDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return
            magnifiedDividendPerShare
                .mul(balanceOf(_owner))
                .toInt256Safe()
                .add(magnifiedDividendCorrections[_owner])
                .toUint256Safe() / magnitude;
    }

    /// @dev Internal function that transfer tokens from one address to another.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param from The address to transfer from.
    /// @param to The address to transfer to.
    /// @param value The amount to be transferred.
    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        require(false);

        int256 _magCorrection = magnifiedDividendPerShare
            .mul(value)
            .toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from]
            .add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(
            _magCorrection
        );
    }

    /// @dev Internal function that mints tokens to an account.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param account The account that will receive the created tokens.
    /// @param value The amount that will be created.
    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    /// @dev Internal function that burns an amount of the token of a given account.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param account The account whose tokens will be burnt.
    /// @param value The amount that will be burnt.
    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);

        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }
}

contract DurdenInu is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;

    address public uniswapV2Pair;

    bool private swapping;
    bool private stakingEnabled = false;
    bool public tradingEnabled = false;
    // Thursday, November 11, 2021 00:00:00 GMT
    uint public immutable forceStartTradingAt = 1636588800000;
    uint256 public sellAmount = 0;
    uint256 public buyAmount = 0;
    uint256 private totalSellFees;
    uint256 private totalBuyFees;

    DurdenInuDividendTracker public dividendTracker;

    address public liquidityWallet;

    address payable public operations1Address =
        payable(0x32230D0303c0d04fEB9d49a099d0dd989F276551);
    address payable public operations2Address =
        payable(0x7e66F137B0eC9D83c93a310cFe1417224Dd06A6F);

    uint256 public maxSellTransactionAmount = 0;
    // Set the level of tokens in the pool to trigger the distribution
    uint256 public swapTokensAtAmount = 25000000 * (10**9);

    uint256 public operationsFees = 6;
    uint256 public liquidityFee = 3;
    uint256 public ETHRewardsBuyFee = 1;
    uint256 public ETHRewardsSellFee = 1;
    bool public swapAndLiquifyEnabled = true;

    // use by default 500,000 gas to process auto-claiming dividends
    uint256 public gasForProcessing = 500000;

    // exlcude from fees and max transaction amount
    mapping(address => bool) private _isExcludedFromFees;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;

    mapping(address => uint256) public stakingBonus;
    mapping(address => uint256) public stakingUntilDate;
    mapping(uint256 => uint256) public stakingAmounts;

    mapping(address => bool) private canTransferBeforeTradingIsEnabled;

    event EnableAccountStaking(address indexed account, uint256 duration);
    event UpdateStakingAmounts(uint256 duration, uint256 amount);

    event EnableSwapAndLiquify(bool enabled);
    event EnableStaking(bool enabled);

    event SetPreSaleWallet(address wallet);

    event UpdateDividendTracker(
        address indexed newAddress,
        address indexed oldAddress
    );

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event TradingEnabled();

    event UpdateFees(
        uint256 operations,
        uint256 liquidity,
        uint256 ETHRewardsBuy,
        uint256 ETHRewardsSell
    );

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

    event LiquidityWalletUpdated(
        address indexed newLiquidityWallet,
        address indexed oldLiquidityWallet
    );

    event GasForProcessingUpdated(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event SendDividends(uint256 amount, uint256 opAmount, bool success);

    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    event UpdatePayoutToken(address account, address token);
    event UpdateAllowTokens(address token, bool allow);

    constructor() ERC20("Durden Inu", "DURDEN") {
        dividendTracker = new DurdenInuDividendTracker(payable(this));

        liquidityWallet = owner();

        uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
                address(this),
                uniswapV2Router.WETH()
            );

        _setAutomatedMarketMakerPair(uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(
            0x000000000000000000000000000000000000dEaD
        );
        dividendTracker.excludedFromDividends(address(0));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(uniswapV2Router));

        // exclude from paying fees or having max transaction amount
        _isExcludedFromFees[liquidityWallet] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[address(dividendTracker)] = true;
        _isExcludedFromFees[operations1Address] = true;
        _isExcludedFromFees[operations2Address] = true;

        totalSellFees = ETHRewardsSellFee.add(liquidityFee).add(operationsFees);
        totalBuyFees = ETHRewardsBuyFee.add(liquidityFee).add(operationsFees);

        canTransferBeforeTradingIsEnabled[owner()] = true;
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */

        _mint(owner(), 10000000000 * (10**9));
    }

    function decimals() public view virtual override returns (uint8) {
        return 9;
    }

    receive() external payable {}

    function updateStakingAmounts(uint256 duration, uint256 bonus)
        public
        onlyOwner
    {
        require(stakingAmounts[duration] != bonus);
        require(bonus <= 100, "Staking bonus can't exceed 100%");

        stakingAmounts[duration] = bonus;
        emit UpdateStakingAmounts(duration, bonus);
    }

    function enableTrading() external onlyOwner {
        require(!tradingEnabled);

        tradingEnabled = true;
        emit TradingEnabled();
    }

    function setPresaleWallet(address wallet) external onlyOwner {
        canTransferBeforeTradingIsEnabled[wallet] = true;
        _isExcludedFromFees[wallet] = true;
        dividendTracker.excludeFromDividends(wallet);

        emit SetPreSaleWallet(wallet);
    }

    function enableStaking(bool enable) public onlyOwner {
        require(stakingEnabled != enable);
        stakingEnabled = enable;

        emit EnableStaking(enable);
    }

    function stake(uint256 duration) public {
        require(stakingEnabled, "Staking is not enabled");
        require(stakingAmounts[duration] != 0, "Invalid staking duration");
        require(
            stakingUntilDate[_msgSender()] < block.timestamp.add(duration),
            "already staked for a longer duration"
        );

        stakingBonus[_msgSender()] = stakingAmounts[duration];
        stakingUntilDate[_msgSender()] = block.timestamp.add(duration);

        dividendTracker.setBalance(
            _msgSender(),
            getStakingBalance(_msgSender())
        );

        emit EnableAccountStaking(_msgSender(), duration);
    }

    function updateMaxAmount(uint256 newNum) public onlyOwner {
        require(maxSellTransactionAmount != newNum);
        // 0 means disabled
        require(
            maxSellTransactionAmount == 0 ||
                maxSellTransactionAmount >= 10000000 * (10**9),
            "max sell amount must either be disabled or greater than 10 million"
        );
        maxSellTransactionAmount = newNum * (10**9);
    }

    function updateDividendTracker(address newAddress) public onlyOwner {
        require(newAddress != address(dividendTracker));

        DurdenInuDividendTracker newDividendTracker = DurdenInuDividendTracker(
            payable(newAddress)
        );

        require(newDividendTracker.owner() == address(this));

        newDividendTracker.excludeFromDividends(address(newDividendTracker));
        newDividendTracker.excludeFromDividends(address(this));
        newDividendTracker.excludeFromDividends(owner());
        newDividendTracker.excludeFromDividends(address(uniswapV2Router));

        emit UpdateDividendTracker(newAddress, address(dividendTracker));

        dividendTracker = newDividendTracker;
    }

    function updateOperations1Address(address payable newAddress)
        public
        onlyOwner
    {
        operations1Address = newAddress;
    }

    function updateOperations2Address(address payable newAddress)
        public
        onlyOwner
    {
        operations2Address = newAddress;
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router));
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
        dividendTracker.updateUniswapV2Router(newAddress);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(_isExcludedFromFees[account] != excluded);
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function enableSwapAndLiquify(bool enabled) public onlyOwner {
        require(swapAndLiquifyEnabled != enabled);
        swapAndLiquifyEnabled = enabled;

        emit EnableSwapAndLiquify(enabled);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(pair != uniswapV2Pair);

        _setAutomatedMarketMakerPair(pair, value);
    }

    function setAllowCustomTokens(bool allow) public onlyOwner {
        dividendTracker.setAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) public onlyOwner {
        dividendTracker.setAllowAutoReinvest(allow);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        if (value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateLiquidityWallet(address newLiquidityWallet)
        public
        onlyOwner
    {
        excludeFromFees(newLiquidityWallet, true);
        emit LiquidityWalletUpdated(newLiquidityWallet, liquidityWallet);
        liquidityWallet = newLiquidityWallet;
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200000 && newValue <= 5000000);
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function updateFees(
        uint256 operations,
        uint256 liquidity,
        uint256 ETHRewardsBuy,
        uint256 ETHRewardsSell
    ) public onlyOwner {
        require(operations <= 6, "operation fees can't exceed 6%");
        require(liquidity <= 4, "liquidity fees can't exceed 4%");
        require(
            ETHRewardsBuy >= 1 && ETHRewardsBuy <= 3,
            "ETH reward fees must be between 1% and 3%"
        );
        require(
            ETHRewardsSell >= 1 && ETHRewardsSell <= 3,
            "ETH reward fees must be between 1% and 3%"
        );

        operationsFees = operations;
        liquidityFee = liquidity;
        ETHRewardsBuyFee = ETHRewardsBuy;
        ETHRewardsSellFee = ETHRewardsSell;

        totalSellFees = ETHRewardsSellFee.add(liquidityFee).add(operationsFees);
        totalBuyFees = ETHRewardsBuyFee.add(liquidityFee).add(operationsFees);

        emit UpdateFees(operations, liquidity, ETHRewardsBuy, ETHRewardsSell);
    }

    function getStakingInfo(address account)
        external
        view
        returns (uint256, uint256)
    {
        return (stakingUntilDate[account], stakingBonus[account]);
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function withdrawableDividendOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function dividendTokenBalanceOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.balanceOf(account);
    }

    function getAccountDividendsInfo(address account)
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccount(account);
    }

    function getAccountDividendsInfoAtIndex(uint256 index)
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccountAtIndex(index);
    }

    function processDividendTracker(uint256 gas) external {
        (
            uint256 iterations,
            uint256 claims,
            uint256 lastProcessedIndex
        ) = dividendTracker.process(gas);
        emit ProcessedDividendTracker(
            iterations,
            claims,
            lastProcessedIndex,
            false,
            gas,
            tx.origin
        );
    }

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return dividendTracker.getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns (uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

    function setAutoClaim(bool value) external {
        dividendTracker.setAutoClaim(msg.sender, value);
    }

    function setReinvest(bool value) external {
        dividendTracker.setReinvest(msg.sender, value);
    }

    function setDividendsPaused(bool value) external onlyOwner {
        dividendTracker.setDividendsPaused(value);
    }

    function isExcludedFromAutoClaim(address account)
        external
        view
        returns (bool)
    {
        return dividendTracker.isExcludedFromAutoClaim(account);
    }

    function isReinvest(address account) external view returns (bool) {
        return dividendTracker.isReinvest(account);
    }

    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(
            tradingEnabled || canTransferBeforeTradingIsEnabled[from] || block.timestamp >= forceStartTradingAt,
            "Trading has not yet been enabled"
        );

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        } else if (
            !swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]
        ) {
            bool isSelling = automatedMarketMakerPairs[to];

            if (!automatedMarketMakerPairs[from] && stakingEnabled) {
                require(
                    stakingUntilDate[from] <= block.timestamp,
                    "Tokens are staked and locked!"
                );
                if (stakingUntilDate[from] != 0) {
                    stakingUntilDate[from] = 0;
                    stakingBonus[from] = 0;
                }
            }

            uint256 ETHRewardsFee;

            if (isSelling) {
                ETHRewardsFee = ETHRewardsSellFee;
            } else {
                ETHRewardsFee = ETHRewardsBuyFee;
            }

            uint256 totalFees = ETHRewardsFee.add(liquidityFee).add(operationsFees);

            if (
                maxSellTransactionAmount != 0 &&
                isSelling && // sells only by detecting transfer to automated market maker pair
                from != address(uniswapV2Router) //router -> pair is removing liquidity which shouldn't have max
            ) {
                require(
                    amount <= maxSellTransactionAmount,
                    "maxSellTransactionAmount."
                );
            }

            uint256 contractTokenBalance = balanceOf(address(this));

            bool canSwap = contractTokenBalance >= swapTokensAtAmount;

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

                if (swapAndLiquifyEnabled) {
                    uint256 totalBuySell = buyAmount.add(sellAmount);
                    uint256 swapAmountBought = contractTokenBalance
                        .mul(buyAmount)
                        .div(totalBuySell);
                    uint256 swapAmountSold = contractTokenBalance
                        .mul(sellAmount)
                        .div(totalBuySell);

                    uint256 swapBuyTokens = swapAmountBought
                        .mul(liquidityFee)
                        .div(totalBuyFees);

                    uint256 swapSellTokens = swapAmountSold
                        .mul(liquidityFee)
                        .div(totalSellFees);

                    uint256 swapTokens = swapSellTokens.add(swapBuyTokens);

                    swapAndLiquify(swapTokens);
                }

                uint256 remainingBalance = balanceOf(address(this));

                swapAndSendDividends(remainingBalance);

                buyAmount = 0;
                sellAmount = 0;

                swapping = false;
            }

            uint256 fees = amount.mul(totalFees).div(100);

            amount = amount.sub(fees);

            if (isSelling) {
                sellAmount = sellAmount.add(fees);
            } else {
                buyAmount = buyAmount.add(fees);
            }

            super._transfer(from, address(this), fees);

            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (
                uint256 iterations,
                uint256 claims,
                uint256 lastProcessedIndex
            ) {
                emit ProcessedDividendTracker(
                    iterations,
                    claims,
                    lastProcessedIndex,
                    true,
                    gas,
                    tx.origin
                );
            } catch {}
        }

        super._transfer(from, to, amount);

        dividendTracker.setBalance(from, getStakingBalance(from));
        dividendTracker.setBalance(to, getStakingBalance(to));
    }

    function getStakingBalance(address account) private view returns (uint256) {
        return
            stakingEnabled
                ? balanceOf(account).mul(stakingBonus[account].add(100)).div(
                    100
                )
                : balanceOf(account);
    }

    function swapAndLiquify(uint256 tokens) private {
        // split the contract balance into halves
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

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

    function updatePayoutToken(address token) public {
        require(balanceOf(msg.sender) > 0);
        require(token != address(this));

        dividendTracker.updatePayoutToken(msg.sender, token);
        emit UpdatePayoutToken(msg.sender, token);
    }

    function getPayoutToken(address account) public view returns (address) {
        return dividendTracker.getPayoutToken(account);
    }

    function updateAllowTokens(address token, bool allow) public onlyOwner {
        require(token != address(this));

        dividendTracker.updateAllowTokens(token, allow);
        emit UpdateAllowTokens(token, allow);
    }

    function getAllowTokens(address token) public view returns (bool) {
        return dividendTracker.getAllowTokens(token);
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            liquidityWallet,
            block.timestamp
        );
    }

    function forceSwapAndSendDividends(uint256 tokens) public onlyOwner {
        uint256 totalAmount = buyAmount.add(sellAmount);
        uint256 fromBuy = tokens.mul(buyAmount).div(totalAmount);
        uint256 fromSell = tokens.mul(sellAmount).div(totalAmount);

        swapAndSendDividends(tokens);

        buyAmount = buyAmount.sub(fromBuy);
        sellAmount = sellAmount.sub(fromSell);
    }

    function swapAndSendDividends(uint256 tokens) private {
        swapTokensForEth(tokens);
        uint256 totalAmount = buyAmount.add(sellAmount);

        uint256 dividendsFromBuy = address(this)
            .balance
            .mul(buyAmount)
            .div(totalAmount)
            .mul(ETHRewardsBuyFee)
            .div(ETHRewardsBuyFee.add(operationsFees));

        uint256 dividendsFromSell = address(this)
            .balance
            .mul(sellAmount)
            .div(totalAmount)
            .mul(ETHRewardsSellFee)
            .div(ETHRewardsSellFee.add(operationsFees));

        uint256 dividends = dividendsFromBuy.add(dividendsFromSell);

        (bool success, ) = address(dividendTracker).call{value: dividends}("");

        uint256 theRest = address(this).balance;
        uint256 half = theRest.div(2);
        uint256 otherHalf = theRest - half;
        (bool successOp1, ) = address(operations1Address).call{value: half}("");

        (bool successOp2, ) = address(operations2Address).call{
            value: otherHalf
        }("");

        emit SendDividends(
            dividends,
            theRest,
            success && successOp1 && successOp2
        );
    }
}

contract DurdenInuDividendTracker is DividendPayingToken, Ownable {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;
    mapping(address => bool) public excludedFromAutoClaim;
    mapping(address => bool) public autoReinvest;
    mapping(address => address) public payoutToken;
    mapping(address => bool) public allowTokens;
    bool public allowCustomTokens;
    bool public allowAutoReinvest;
    bool public dividendsPaused = false;

    IUniswapV2Router02 public uniswapV2Router;

    DurdenInu public durdenInu;

    mapping(address => uint256) public lastClaimTimes;

    uint256 public immutable minimumTokenBalanceForAutoDividends;
    uint256 public immutable minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event DividendReinvested(
        address indexed acount,
        uint256 value,
        bool indexed automatic
    );
    event Claim(
        address indexed account,
        uint256 amount,
        bool indexed automatic
    );
    event DividendsPaused(bool paused);
    event SetAllowCustomTokens(bool allow);
    event SetAllowAutoReinvest(bool allow);

    constructor(address payable mainContract)
        DividendPayingToken(
            "DurdenInu_Dividend_Tracker",
            "DurdenInu_Dividend_Tracker"
        )
    {
        durdenInu = DurdenInu(mainContract);
        minimumTokenBalanceForAutoDividends = 1000000 * (10**9);
        minimumTokenBalanceForDividends = 1000000 * (10**9);

        uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D 
        );
        allowCustomTokens = false;
        allowAutoReinvest = true;
    }

    function decimals() public view virtual override returns (uint8) {
        return 9;
    }

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "DurdenInu_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "DurdenInu_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main DurdenInu contract."
        );
    }

    function isExcludedFromAutoClaim(address account)
        external
        view
        onlyOwner
        returns (bool)
    {
        return excludedFromAutoClaim[account];
    }

    function isReinvest(address account)
        external
        view
        onlyOwner
        returns (bool)
    {
        return autoReinvest[account];
    }

    function setAllowCustomTokens(bool allow) external onlyOwner {
        require(allowCustomTokens != allow);
        allowCustomTokens = allow;
        emit SetAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) external onlyOwner {
        require(allowAutoReinvest != allow);
        allowAutoReinvest = allow;
        emit SetAllowAutoReinvest(allow);
    }

    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;

        _setBalance(account, 0);
        tokenHoldersMap.remove(account);

        emit ExcludeFromDividends(account);
    }

    function setAutoClaim(address account, bool value) external onlyOwner {
        excludedFromAutoClaim[account] = value;
    }

    function setReinvest(address account, bool value) external onlyOwner {
        autoReinvest[account] = value;
    }

    function setDividendsPaused(bool value) external onlyOwner {
        require(dividendsPaused != value);
        dividendsPaused = value;
        emit DividendsPaused(value);
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.keys.length;
    }

    function getAccount(address _account)
        public
        view
        returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime
        )
    {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(
                    int256(lastProcessedIndex)
                );
            } else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length >
                    lastProcessedIndex
                    ? tokenHoldersMap.keys.length.sub(lastProcessedIndex)
                    : 0;

                iterationsUntilProcessed = index.add(
                    int256(processesUntilEndOfArray)
                );
            }
        }

        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];
    }

    function getAccountAtIndex(uint256 index)
        public
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256
        )
    {
        if (index >= tokenHoldersMap.size()) {
            return (
                0x0000000000000000000000000000000000000000,
                -1,
                -1,
                0,
                0,
                0
            );
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function setBalance(address account, uint256 newBalance)
        external
        onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }

        if (newBalance < minimumTokenBalanceForDividends) {
            tokenHoldersMap.remove(account);
            _setBalance(account, 0);

            return;
        }

        _setBalance(account, newBalance);

        if (newBalance >= minimumTokenBalanceForAutoDividends) {
            tokenHoldersMap.set(account, newBalance);
        } else {
            tokenHoldersMap.remove(account);
        }
    }

    function process(uint256 gas)
        public
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        if (numberOfTokenHolders == 0 || dividendsPaused) {
            return (0, 0, lastProcessedIndex);
        }

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;

            if (_lastProcessedIndex >= numberOfTokenHolders) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (!excludedFromAutoClaim[account]) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }

            iterations++;

            uint256 newGasLeft = gasleft();

            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic)
        public
        onlyOwner
        returns (bool)
    {
        if (dividendsPaused) {
            return false;
        }

        bool reinvest = autoReinvest[account];

        if (automatic && reinvest && !allowAutoReinvest) {
            return false;
        }

        uint256 amount = reinvest
            ? _reinvestDividendOfUser(account)
            : _withdrawDividendOfUser(account);

        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            if (reinvest) {
                emit DividendReinvested(account, amount, automatic);
            } else {
                emit Claim(account, amount, automatic);
            }
            return true;
        }

        return false;
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    function updatePayoutToken(address account, address token)
        public
        onlyOwner
    {
        require(
            allowTokens[token] || token == address(0),
            "Token not in allow list"
        );
        payoutToken[account] = token;
    }

    function getPayoutToken(address account) public view returns (address) {
        return payoutToken[account];
    }

    function updateAllowTokens(address token, bool allow) public onlyOwner {
        allowTokens[token] = allow;
    }

    function getAllowTokens(address token) public view returns (bool) {
        return allowTokens[token];
    }

    function _reinvestDividendOfUser(address account)
        private
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(account);
        if (_withdrawableDividend > 0) {
            bool success;

            withdrawnDividends[account] = withdrawnDividends[account].add(
                _withdrawableDividend
            );

            address[] memory path = new address[](2);
            path[0] = uniswapV2Router.WETH();
            path[1] = address(durdenInu);

            uint256 prevBalance = durdenInu.balanceOf(address(this));

            // make the swap
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableDividend
                }(
                    0, // accept any amount of Tokens
                    path,
                    address(this),
                    block.timestamp
                )
            {
                uint256 received = durdenInu.balanceOf(address(this)).sub(
                    prevBalance
                );
                if (received > 0) {
                    success = true;
                    durdenInu.transfer(account, received);
                } else {
                    success = false;
                }
            } catch {
                success = false;
            }

            if (!success) {
                withdrawnDividends[account] = withdrawnDividends[account].sub(
                    _withdrawableDividend
                );
                return 0;
            }

            return _withdrawableDividend;
        }

        return 0;
    }

    function _withdrawDividendOfUser(address payable user)
        internal
        override
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );

            address tokenAddress = payoutToken[user];
            bool success;

            // if no tokenAddress assume eth payout
            if (
                !allowCustomTokens ||
                tokenAddress == address(0) ||
                !allowTokens[tokenAddress]
            ) {
                (success, ) = user.call{
                    value: _withdrawableDividend,
                    gas: 3000
                }("");
            } else {
                //investor wants to be payed out in a custom token
                address[] memory path = new address[](2);
                path[0] = uniswapV2Router.WETH();
                path[1] = tokenAddress;

                try
                    uniswapV2Router
                        .swapExactETHForTokensSupportingFeeOnTransferTokens{
                        value: _withdrawableDividend
                    }(
                        0, // accept any amount of Tokens
                        path,
                        user,
                        block.timestamp
                    )
                {
                    success = true;
                } catch {
                    success = false;
                }
            }

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _withdrawableDividend
                );
                return 0;
            } else {
                emit DividendWithdrawn(user, _withdrawableDividend);
            }

            return _withdrawableDividend;
        }

        return 0;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"EnableAccountStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableSwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"opAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"SetPreSaleWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","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":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"allow","type":"bool"}],"name":"UpdateAllowTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"operations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ETHRewardsBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ETHRewardsSell","type":"uint256"}],"name":"UpdateFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"UpdatePayoutToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdateStakingAmounts","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"ETHRewardsBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETHRewardsSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","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"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DurdenInuDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"enableStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceStartTradingAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"forceSwapAndSendDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getAllowTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getPayoutToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getStakingInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromAutoClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isReinvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operations1Address","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operations2Address","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowAutoReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowCustomTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutoClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setDividendsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingUntilDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"allow","type":"bool"}],"name":"updateAllowTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"operations","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"ETHRewardsBuy","type":"uint256"},{"internalType":"uint256","name":"ETHRewardsSell","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress","type":"address"}],"name":"updateOperations1Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress","type":"address"}],"name":"updateOperations2Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"updatePayoutToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"updateStakingAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526007805461ffff60a81b1916905565017d0c4b4800608052600060088190556009819055600e80546001600160a01b03199081167332230d0303c0d04feb9d49a099d0dd989f27655117909155600f8054909116737e66f137b0ec9d83c93a310cfe1417224dd06a6f1790556010556658d15e17628000601155600660125560036013556001601481905560158190556016805460ff191690911790556207a120601755348015620000b557600080fd5b50604080518082018252600a81526944757264656e20496e7560b01b602080830191825283518085019094526006845265222aa92222a760d11b908401528151919291620001069160039162000a15565b5080516200011c90600490602084019062000a15565b505050600062000131620007db60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350306040516200018e9062000aa4565b6001600160a01b039091168152602001604051809103906000f080158015620001bb573d6000803e3d6000fd5b50600c80546001600160a01b039283166001600160a01b031991821617909155600554600d80548316919093161790915560068054737a250d5630b4cf539739df2c5dacb4c659f2488d9216821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b1580156200024257600080fd5b505afa15801562000257573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027d919062000ac9565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620002db57600080fd5b505afa158015620002f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000316919062000ac9565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200035f57600080fd5b505af115801562000374573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039a919062000ac9565b600780546001600160a01b0319166001600160a01b03929092169182179055620003c6906001620007df565b600c5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200040d57600080fd5b505af115801562000422573d6000803e3d6000fd5b5050600c5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200046c57600080fd5b505af115801562000481573d6000803e3d6000fd5b5050600c5460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620004cd57600080fd5b505af1158015620004e2573d6000803e3d6000fd5b5050600c54604051634e7b827f60e01b8152600060048201526001600160a01b039091169250634e7b827f915060240160206040518083038186803b1580156200052b57600080fd5b505afa15801562000540573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000566919062000af2565b50600c546001600160a01b03166331e79db06200058b6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620005cd57600080fd5b505af1158015620005e2573d6000803e3d6000fd5b5050600c5460065460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200063057600080fd5b505af115801562000645573d6000803e3d6000fd5b5050600d546001600160a01b031660009081526018602081905260408083208054600160ff19918216811790925530855291842080549092168117909155935091506200069a6005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600c548216815260188452828120805486166001908117909155600e54831682528382208054871682179055600f5490921681529190912080549093161790915560125460135460155462000740936200072c929062002fb0620008ab821b17901c565b620008ab60201b62002fb01790919060201c565b600a819055506200076b6012546200072c601354601454620008ab60201b62002fb01790919060201c565b600b556001601d6000620007876005546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620007d5620007c66005546001600160a01b031690565b678ac7230489e8000062000919565b62000b76565b3390565b6001600160a01b0382166000908152601960205260409020805460ff191682158015919091179091556200086f57600c5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200085557600080fd5b505af11580156200086a573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600080620008ba838562000b14565b905083811015620009125760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6001600160a01b038216620009715760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000909565b6200098d81600254620008ab60201b62002fb01790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620009c091839062002fb0620008ab821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b82805462000a239062000b39565b90600052602060002090601f01602090048101928262000a47576000855562000a92565b82601f1062000a6257805160ff191683800117855562000a92565b8280016001018555821562000a92579182015b8281111562000a9257825182559160200191906001019062000a75565b5062000aa092915062000ab2565b5090565b613484806200527483390190565b5b8082111562000aa0576000815560010162000ab3565b60006020828403121562000adb578081fd5b81516001600160a01b038116811462000912578182fd5b60006020828403121562000b04578081fd5b8151801515811462000912578182fd5b6000821982111562000b3457634e487b7160e01b81526011600452602481fd5b500190565b600181811c9082168062000b4e57607f821691505b6020821081141562000b7057634e487b7160e01b600052602260045260246000fd5b50919050565b6080516146db62000b9960003960008181610e1e01526135cc01526146db6000f3fe6080604052600436106104f05760003560e01c8063871c128d11610294578063c02466681161015e578063dd62ed3e116100d6578063f1c0ddff1161008a578063f2fde38b1161006f578063f2fde38b14610e8d578063f5d3c79a14610ead578063fd957f4214610ecd57600080fd5b8063f1c0ddff14610e40578063f27fd25414610e6d57600080fd5b8063e37ba8f9116100bb578063e37ba8f914610dd7578063e7841ec014610df7578063ed37af0b14610e0c57600080fd5b8063dd62ed3e14610d7b578063e2f4560514610dc157600080fd5b8063d07a091c1161012d578063d5e3725111610112578063d5e3725114610d25578063d8032ed314610d45578063d94535ae14610d6557600080fd5b8063d07a091c14610ce5578063d469801614610d0557600080fd5b8063c024666814610c65578063c32c293d14610c85578063c6616ba114610ca5578063cd66056a14610cc557600080fd5b80639cefc1da1161020c578063aa4704f3116101c0578063b5cc797c116101a5578063b5cc797c14610bff578063b62496f514610c15578063ba079d4914610c4557600080fd5b8063aa4704f314610b50578063ad56c13c14610ba857600080fd5b8063a694fc3a116101f1578063a694fc3a14610af0578063a8b9d24014610b10578063a9059cbb14610b3057600080fd5b80639cefc1da14610ab0578063a457c2d714610ad057600080fd5b806395d89b41116102635780639a7a23d6116102485780639a7a23d614610a5a5780639c1b8af514610a7a5780639c3372ea14610a9057600080fd5b806395d89b4114610a2f57806398118cb414610a4457600080fd5b8063871c128d146109bc57806388bdd9be146109dc5780638a8c523c146109fc5780638da5cb5b14610a1157600080fd5b8063435c89e4116103d55780635b72c18c1161034d578063700bb19111610301578063715018a6116102e6578063715018a61461095a5780637d32f3421461096f578063868730c71461099c57600080fd5b8063700bb1911461090457806370a082311461092457600080fd5b806365b8dbc01161033257806365b8dbc0146108a45780636843cd84146108c45780636d48467b146108e457600080fd5b80635b72c18c1461086f57806364b0f6531461088f57600080fd5b80634ada218b116103a45780634fbee193116103895780634fbee193146107f657806350151d991461082f5780635123425b1461084f57600080fd5b80634ada218b146107c05780634e71d92d146107e157600080fd5b8063435c89e4146107395780634912572c1461076657806349bd5a5e146107865780634a74bb02146107a657600080fd5b806323b872dd116104685780633599bb17116104375780633a7d925c1161041c5780633a7d925c146106ed5780633f407b841461070357806340ffdd801461071957600080fd5b80633599bb17146106ad57806339509351146106cd57600080fd5b806323b872dd1461063c5780632c1f52161461065c57806330bb4cff1461067c578063313ce5671461069157600080fd5b80630ef35b7e116104bf5780631694505e116104a45780631694505e146105d957806318160ddd146106115780631fa705311461062657600080fd5b80630ef35b7e14610599578063106b5da1146105b957600080fd5b806302259e9e146104fc57806305ca5f081461052557806306fdde0314610547578063095ea7b31461056957600080fd5b366104f757005b600080fd5b34801561050857600080fd5b5061051260105481565b6040519081526020015b60405180910390f35b34801561053157600080fd5b506105456105403660046143be565b610eed565b005b34801561055357600080fd5b5061055c610fc4565b60405161051c919061446d565b34801561057557600080fd5b5061058961058436600461435b565b611056565b604051901515815260200161051c565b3480156105a557600080fd5b506105456105b43660046143ee565b61106d565b3480156105c557600080fd5b506105456105d43660046143be565b611171565b3480156105e557600080fd5b506006546105f9906001600160a01b031681565b6040516001600160a01b03909116815260200161051c565b34801561061d57600080fd5b50600254610512565b34801561063257600080fd5b5061051260095481565b34801561064857600080fd5b5061058961065736600461429c565b61128c565b34801561066857600080fd5b50600c546105f9906001600160a01b031681565b34801561068857600080fd5b506105126112f5565b34801561069d57600080fd5b506040516009815260200161051c565b3480156106b957600080fd5b506105456106c8366004614386565b611390565b3480156106d957600080fd5b506105896106e836600461435b565b611454565b3480156106f957600080fd5b5061051260155481565b34801561070f57600080fd5b5061051260085481565b34801561072557600080fd5b50610545610734366004614386565b61148a565b34801561074557600080fd5b506105126107543660046143be565b601c6020526000908152604090205481565b34801561077257600080fd5b50600e546105f9906001600160a01b031681565b34801561079257600080fd5b506007546105f9906001600160a01b031681565b3480156107b257600080fd5b506016546105899060ff1681565b3480156107cc57600080fd5b5060075461058990600160b01b900460ff1681565b3480156107ed57600080fd5b5061054561151d565b34801561080257600080fd5b5061058961081136600461422c565b6001600160a01b031660009081526018602052604090205460ff1690565b34801561083b57600080fd5b5061054561084a36600461422c565b6115bd565b34801561085b57600080fd5b5061054561086a3660046142dc565b611627565b34801561087b57600080fd5b5061058961088a36600461422c565b611746565b34801561089b57600080fd5b506105126117de565b3480156108b057600080fd5b506105456108bf36600461422c565b61183c565b3480156108d057600080fd5b506105126108df36600461422c565b61193c565b3480156108f057600080fd5b506105896108ff36600461422c565b6119d4565b34801561091057600080fd5b5061054561091f3660046143be565b611a20565b34801561093057600080fd5b5061051261093f36600461422c565b6001600160a01b031660009081526020819052604090205490565b34801561096657600080fd5b50610545611b17565b34801561097b57600080fd5b5061051261098a36600461422c565b601b6020526000908152604090205481565b3480156109a857600080fd5b506105456109b7366004614386565b611ba9565b3480156109c857600080fd5b506105456109d73660046143be565b611bfa565b3480156109e857600080fd5b506105456109f736600461422c565b611c94565b348015610a0857600080fd5b50610545611f75565b348015610a1d57600080fd5b506005546001600160a01b03166105f9565b348015610a3b57600080fd5b5061055c61202d565b348015610a5057600080fd5b5061051260135481565b348015610a6657600080fd5b50610545610a753660046142dc565b61203c565b348015610a8657600080fd5b5061051260175481565b348015610a9c57600080fd5b50610545610aab366004614386565b6120ad565b348015610abc57600080fd5b50610545610acb366004614386565b612140565b348015610adc57600080fd5b50610589610aeb36600461435b565b612219565b348015610afc57600080fd5b50610545610b0b3660046143be565b612268565b348015610b1c57600080fd5b50610512610b2b36600461422c565b6124a9565b348015610b3c57600080fd5b50610589610b4b36600461435b565b6124f5565b348015610b5c57600080fd5b50610b93610b6b36600461422c565b6001600160a01b03166000908152601b6020908152604080832054601a909252909120549091565b6040805192835260208301919091520161051c565b348015610bb457600080fd5b50610bc8610bc336600461422c565b612502565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161051c565b348015610c0b57600080fd5b5061051260125481565b348015610c2157600080fd5b50610589610c3036600461422c565b60196020526000908152604090205460ff1681565b348015610c5157600080fd5b50610589610c6036600461422c565b6125ba565b348015610c7157600080fd5b50610545610c803660046142dc565b612606565b348015610c9157600080fd5b506105f9610ca036600461422c565b6126d9565b348015610cb157600080fd5b50610545610cc036600461443c565b612770565b348015610cd157600080fd5b50600f546105f9906001600160a01b031681565b348015610cf157600080fd5b50610545610d0036600461422c565b6129ce565b348015610d1157600080fd5b50600d546105f9906001600160a01b031681565b348015610d3157600080fd5b50610545610d40366004614386565b612ae4565b348015610d5157600080fd5b50610545610d6036600461422c565b612b83565b348015610d7157600080fd5b5061051260145481565b348015610d8757600080fd5b50610512610d96366004614264565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610dcd57600080fd5b5061051260115481565b348015610de357600080fd5b50610545610df236600461422c565b612c70565b348015610e0357600080fd5b50610512612d20565b348015610e1857600080fd5b506105127f000000000000000000000000000000000000000000000000000000000000000081565b348015610e4c57600080fd5b50610512610e5b36600461422c565b601a6020526000908152604090205481565b348015610e7957600080fd5b50610bc8610e883660046143be565b612d7e565b348015610e9957600080fd5b50610545610ea836600461422c565b612dd5565b348015610eb957600080fd5b50610545610ec8366004614386565b612ef5565b348015610ed957600080fd5b50610545610ee836600461422c565b612f46565b6005546001600160a01b03163314610f3a5760405162461bcd60e51b8152602060048201819052602482015260008051602061466183398151915260448201526064015b60405180910390fd5b6000610f53600854600954612fb090919063ffffffff16565b90506000610f7682610f706009548661301690919063ffffffff16565b906130b1565b90506000610f9383610f706008548761301690919063ffffffff16565b9050610f9e846130f3565b600954610fab9083613333565b600955600854610fbb9082613333565b60085550505050565b606060038054610fd39061459e565b80601f0160208091040260200160405190810160405280929190818152602001828054610fff9061459e565b801561104c5780601f106110215761010080835404028352916020019161104c565b820191906000526020600020905b81548152906001019060200180831161102f57829003601f168201915b5050505050905090565b6000611063338484613375565b5060015b92915050565b6005546001600160a01b031633146110b55760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6000828152601c60205260409020548114156110d057600080fd5b60648111156111215760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e6720626f6e75732063616e2774206578636565642031303025006044820152606401610f31565b6000828152601c602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d91015b60405180910390a15050565b6005546001600160a01b031633146111b95760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b8060105414156111c857600080fd5b60105415806111e05750662386f26fc1000060105410155b6112785760405162461bcd60e51b815260206004820152604260248201527f6d61782073656c6c20616d6f756e74206d75737420656974686572206265206460448201527f697361626c6564206f722067726561746572207468616e203130206d696c6c6960648201527f6f6e000000000000000000000000000000000000000000000000000000000000608482015260a401610f31565b61128681633b9aca00614568565b60105550565b60006112998484846134ce565b6112eb84336112e685604051806060016040528060288152602001614639602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613be7565b613375565b5060019392505050565b600c54604080517f85a6b3ae00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b15801561135357600080fd5b505afa158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b91906143d6565b905090565b6005546001600160a01b031633146113d85760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b600c546040517f3599bb1700000000000000000000000000000000000000000000000000000000815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b15801561143957600080fd5b505af115801561144d573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916110639185906112e69086612fb0565b6005546001600160a01b031633146114d25760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b600c546040517f40ffdd8000000000000000000000000000000000000000000000000000000000815282151560048201526001600160a01b03909116906340ffdd809060240161141f565b600c546040517fbc4c4b37000000000000000000000000000000000000000000000000000000008152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b15801561158257600080fd5b505af1158015611596573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ba91906143a2565b50565b6005546001600160a01b031633146116055760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461166f5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6001600160a01b03821630141561168557600080fd5b600c546040517f5123425b0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152831515602483015290911690635123425b90604401600060405180830381600087803b1580156116ed57600080fd5b505af1158015611701573d6000803e3d6000fd5b5050604080516001600160a01b038616815284151560208201527ff8e5e8c18b9fbb7607019e8dab60e0ad981ba259df038a668fc13025a64854d69350019050611165565b600c546040517f5b72c18c0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526000921690635b72c18c906024015b60206040518083038186803b1580156117a657600080fd5b505afa1580156117ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106791906143a2565b600c54604080517f09bbedde00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b15801561135357600080fd5b6005546001600160a01b031633146118845760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6006546001600160a01b038281169116141561189f57600080fd5b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b03838116918217909255600c546040517f65b8dbc00000000000000000000000000000000000000000000000000000000081526004810192909252909116906365b8dbc09060240161141f565b600c546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b15801561199c57600080fd5b505afa1580156119b0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106791906143d6565b600c546040517f6d48467b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526000921690636d48467b9060240161178e565b600c546040517fffb2c47900000000000000000000000000000000000000000000000000000000815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b158015611a8457600080fd5b505af1158015611a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abc919061440f565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b03163314611b5f5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b600c546040517f8bc1d63900000000000000000000000000000000000000000000000000000000815233600482015282151560248201526001600160a01b0390911690638bc1d6399060440161141f565b6005546001600160a01b03163314611c425760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b62030d408110158015611c585750624c4b408111155b611c6157600080fd5b60175460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601755565b6005546001600160a01b03163314611cdc5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b600c546001600160a01b0382811691161415611cf757600080fd5b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3f57600080fd5b505afa158015611d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d779190614248565b6001600160a01b031614611d8a57600080fd5b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611dcc57600080fd5b505af1158015611de0573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611e2557600080fd5b505af1158015611e39573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611e5e6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611e9f57600080fd5b505af1158015611eb3573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611efe57600080fd5b505af1158015611f12573d6000803e3d6000fd5b5050600c546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600c80546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b03163314611fbd5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b600754600160b01b900460ff1615611fd457600080fd5b600780547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16600160b01b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b606060048054610fd39061459e565b6005546001600160a01b031633146120845760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6007546001600160a01b038381169116141561209f57600080fd5b6120a98282613c21565b5050565b6005546001600160a01b031633146120f55760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b600c546040517f9c3372ea00000000000000000000000000000000000000000000000000000000815282151560048201526001600160a01b0390911690639c3372ea9060240161141f565b6005546001600160a01b031633146121885760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b60075460ff600160a81b90910416151581151514156121a657600080fd5b60078054821515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a879061220e90831515815260200190565b60405180910390a150565b600061106333846112e685604051806060016040528060258152602001614681602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613be7565b600754600160a81b900460ff166122c15760405162461bcd60e51b815260206004820152601660248201527f5374616b696e67206973206e6f7420656e61626c6564000000000000000000006044820152606401610f31565b6000818152601c602052604090205461231c5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e00000000000000006044820152606401610f31565b6123264282612fb0565b336000908152601b6020526040902054106123a85760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e676572206475726160448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610f31565b6000818152601c6020908152604080832054338452601a909252909120556123d04282612fb0565b336000818152601b6020526040902091909155600c546001600160a01b03169063e30443bc906123ff81613cea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561244557600080fd5b505af1158015612459573d6000803e3d6000fd5b505050506124643390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c88260405161249e91815260200190565b60405180910390a250565b600c546040517fa8b9d2400000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063a8b9d24090602401611984565b60006110633384846134ce565b600c546040517ffbcbc0f10000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c06040518083038186803b15801561256e57600080fd5b505afa158015612582573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a69190614309565b949c939b5091995097509550909350915050565b600c546040517fba079d490000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063ba079d499060240161178e565b6005546001600160a01b0316331461264e5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6001600160a01b03821660009081526018602052604090205460ff161515811515141561267a57600080fd5b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b600c546040517fc32c293d0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063c32c293d9060240160206040518083038186803b15801561273857600080fd5b505afa15801561274c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110679190614248565b6005546001600160a01b031633146127b85760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b60068411156128095760405162461bcd60e51b815260206004820152601e60248201527f6f7065726174696f6e20666565732063616e27742065786365656420362500006044820152606401610f31565b600483111561285a5760405162461bcd60e51b815260206004820152601e60248201527f6c697175696469747920666565732063616e27742065786365656420342500006044820152606401610f31565b6001821015801561286c575060038211155b6128ca5760405162461bcd60e51b815260206004820152602960248201527f455448207265776172642066656573206d757374206265206265747765656e20604482015268312520616e6420332560b81b6064820152608401610f31565b600181101580156128dc575060038111155b61293a5760405162461bcd60e51b815260206004820152602960248201527f455448207265776172642066656573206d757374206265206265747765656e20604482015268312520616e6420332560b81b6064820152608401610f31565b60128490556013839055601482905560158190556129628461295c8386612fb0565b90612fb0565b600a5560125460135460145461297d929161295c9190612fb0565b600b556040805185815260208101859052908101839052606081018290527f5c3aee3d65f7eb02cded951435d06b06ef307bc7f57b98975c4a41dc116e711c9060800160405180910390a150505050565b6005546001600160a01b03163314612a165760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6001600160a01b038181166000818152601d602090815260408083208054600160ff19918216811790925560189093529281902080549092169092179055600c54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015612a9257600080fd5b505af1158015612aa6573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c59250602001905061220e565b6005546001600160a01b03163314612b2c5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b60165460ff1615158115151415612b4257600080fd5b6016805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef9060200161220e565b3360009081526020819052604081205411612b9d57600080fd5b6001600160a01b038116301415612bb357600080fd5b600c546040517ff7dd53a90000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0383811660248301529091169063f7dd53a990604401600060405180830381600087803b158015612c1957600080fd5b505af1158015612c2d573d6000803e3d6000fd5b5050604080513381526001600160a01b03851660208201527f3640c981ed7cfa9e689ac4e9cafffd8c9240b716b14c982b3e90d54e7b61de24935001905061220e565b6005546001600160a01b03163314612cb85760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b612cc3816001612606565b600d546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600c54604080517fe7841ec000000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b15801561135357600080fd5b600c546040517f5183d6fd00000000000000000000000000000000000000000000000000000000815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401612556565b6005546001600160a01b03163314612e1d5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6001600160a01b038116612e995760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610f31565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600c546040517fb22f8a0400000000000000000000000000000000000000000000000000000000815233600482015282151560248201526001600160a01b039091169063b22f8a049060440161141f565b6005546001600160a01b03163314612f8e5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600080612fbd8385614530565b90508381101561300f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610f31565b9392505050565b60008261302557506000611067565b60006130318385614568565b90508261303e8583614548565b1461300f5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610f31565b600061300f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d68565b6130fc81613d96565b6000613115600854600954612fb090919063ffffffff16565b90506000613158613133601254601454612fb090919063ffffffff16565b610f7060145461315286610f706009544761301690919063ffffffff16565b90613016565b90506000613195613176601254601554612fb090919063ffffffff16565b610f7060155461315287610f706008544761301690919063ffffffff16565b905060006131a38383612fb0565b600c546040519192506000916001600160a01b039091169083908381818185875af1925050503d80600081146131f5576040519150601f19603f3d011682016040523d82523d6000602084013e6131fa565b606091505b50909150479050600061320e8260026130b1565b9050600061321c8284614587565b600e546040519192506000916001600160a01b039091169084908381818185875af1925050503d806000811461326e576040519150601f19603f3d011682016040523d82523d6000602084013e613273565b606091505b5050600f546040519192506000916001600160a01b039091169084908381818185875af1925050503d80600081146132c7576040519150601f19603f3d011682016040523d82523d6000602084013e6132cc565b606091505b505090507f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd087868880156132fd5750845b80156133065750835b60408051938452602084019290925215159082015260600160405180910390a15050505050505050505050565b600061300f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613be7565b6001600160a01b0383166133f05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610f31565b6001600160a01b03821661346c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610f31565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166135325760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f31565b6001600160a01b0382166135945760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f31565b600754600160b01b900460ff16806135c457506001600160a01b0383166000908152601d602052604090205460ff165b806135ef57507f00000000000000000000000000000000000000000000000000000000000000004210155b61363b5760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610f31565b806136515761364c83836000613f4d565b505050565b600754600160a01b900460ff1615801561368457506001600160a01b03831660009081526018602052604090205460ff16155b80156136a957506001600160a01b03821660009081526018602052604090205460ff16155b15613ae3576001600160a01b0380831660009081526019602052604080822054928616825290205460ff91821691161580156136ee5750600754600160a81b900460ff165b156137a0576001600160a01b0384166000908152601b602052604090205442101561375b5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b6564210000006044820152606401610f31565b6001600160a01b0384166000908152601b6020526040902054156137a0576001600160a01b0384166000908152601b60209081526040808320839055601a9091528120555b600081156137b157506015546137b6565b506014545b60006137d360125461295c60135485612fb090919063ffffffff16565b90506010546000141580156137e55750825b80156137ff57506006546001600160a01b03878116911614155b15613856576010548411156138565760405162461bcd60e51b815260206004820152601960248201527f6d617853656c6c5472616e73616374696f6e416d6f756e742e000000000000006044820152606401610f31565b306000908152602081905260409020546011548110801590819061389357506001600160a01b03881660009081526019602052604090205460ff16155b15613999576007805460ff60a01b1916600160a01b17905560165460ff16156139675760006138cf600854600954612fb090919063ffffffff16565b905060006138ec82610f706009548761301690919063ffffffff16565b9050600061390983610f706008548861301690919063ffffffff16565b90506000613928600b54610f706013548661301690919063ffffffff16565b90506000613947600a54610f706013548661301690919063ffffffff16565b905060006139558284612fb0565b9050613960816140d0565b5050505050505b30600090815260208190526040902054613980816130f3565b50600060098190556008556007805460ff60a01b191690555b60006139aa6064610f708987613016565b90506139b68782613333565b965085156139d3576008546139cb9082612fb0565b6008556139e4565b6009546139e09082612fb0565b6009555b6139ef893083613f4d565b601754600c546040517fffb2c479000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b158015613a5157600080fd5b505af1925050508015613a81575060408051601f3d908101601f19168201909252613a7e9181019061440f565b60015b613a8a57613adb565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505050505050505b613aee838383613f4d565b600c546001600160a01b031663e30443bc84613b0981613cea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613b4f57600080fd5b505af1158015613b63573d6000803e3d6000fd5b5050600c546001600160a01b0316915063e30443bc905083613b8481613cea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613bca57600080fd5b505af1158015613bde573d6000803e3d6000fd5b50505050505050565b60008184841115613c0b5760405162461bcd60e51b8152600401610f31919061446d565b506000613c188486614587565b95945050505050565b6001600160a01b0382166000908152601960205260409020805460ff19168215801591909117909155613cae57600c5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613c9557600080fd5b505af1158015613ca9573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600754600090600160a81b900460ff16613d1c576001600160a01b038216600090815260208190526040902054611067565b6001600160a01b0382166000908152601a602052604090205461106790606490610f7090613d4a9083612fb0565b6001600160a01b038616600090815260208190526040902054613152565b60008183613d895760405162461bcd60e51b8152600401610f31919061446d565b506000613c188486614548565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613dd957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015613e4657600080fd5b505afa158015613e5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e7e9190614248565b81600181518110613e9f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654613ec59130911684613375565b6006546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac94790613f179085906000908690309042906004016144c0565b600060405180830381600087803b158015613f3157600080fd5b505af1158015613f45573d6000803e3d6000fd5b505050505050565b6001600160a01b038316613fb15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f31565b6001600160a01b0382166140135760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f31565b61405081604051806060016040528060268152602001614613602691396001600160a01b0386166000908152602081905260409020549190613be7565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461407f9082612fb0565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016134c1565b60006140dd8260026130b1565b905060006140eb8383613333565b9050476140f783613d96565b60006141034783613333565b905061410f8382614157565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b60065461416f9030906001600160a01b031684613375565b600654600d546040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b1580156141f357600080fd5b505af1158015614207573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061144d919061440f565b60006020828403121561423d578081fd5b813561300f816145ef565b600060208284031215614259578081fd5b815161300f816145ef565b60008060408385031215614276578081fd5b8235614281816145ef565b91506020830135614291816145ef565b809150509250929050565b6000806000606084860312156142b0578081fd5b83356142bb816145ef565b925060208401356142cb816145ef565b929592945050506040919091013590565b600080604083850312156142ee578182fd5b82356142f9816145ef565b9150602083013561429181614604565b60008060008060008060c08789031215614321578182fd5b865161432c816145ef565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6000806040838503121561436d578182fd5b8235614378816145ef565b946020939093013593505050565b600060208284031215614397578081fd5b813561300f81614604565b6000602082840312156143b3578081fd5b815161300f81614604565b6000602082840312156143cf578081fd5b5035919050565b6000602082840312156143e7578081fd5b5051919050565b60008060408385031215614400578182fd5b50508035926020909101359150565b600080600060608486031215614423578283fd5b8351925060208401519150604084015190509250925092565b60008060008060808587031215614451578182fd5b5050823594602084013594506040840135936060013592509050565b6000602080835283518082850152825b818110156144995785810183015185820160400152820161447d565b818111156144aa5783604083870101525b50601f01601f1916929092016040019392505050565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561450f5784516001600160a01b0316835293830193918301916001016144ea565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115614543576145436145d9565b500190565b60008261456357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614582576145826145d9565b500290565b600082821015614599576145996145d9565b500390565b600181811c908216806145b257607f821691505b602082108114156145d357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146115ba57600080fd5b80151581146115ba57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ac6f0ce86589efa6d90d9f818a1a85c2163be737f84757c25cd11f5a26b40e0964736f6c6343000804003360c06040526014805462ff0000191690553480156200001d57600080fd5b506040516200348438038062003484833981016040819052620000409162000222565b604080518082018252601a8082527f44757264656e496e755f4469766964656e645f547261636b6572000000000000602080840182815285518087019096529285528401528151919291839183916200009c916003916200017c565b508051620000b29060049060208401906200017c565b50505050506000620000c96200017860201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601580546001600160a01b0319166001600160a01b039290921691909117905566038d7ea4c68000608081905260a0526014805462ff0001600160b81b031916767a250d5630b4cf539739df2c5dacb4c659f2488d0001001790556200028f565b3390565b8280546200018a9062000252565b90600052602060002090601f016020900481019282620001ae5760008555620001f9565b82601f10620001c957805160ff1916838001178555620001f9565b82800160010185558215620001f9579182015b82811115620001f9578251825591602001919060010190620001dc565b50620002079291506200020b565b5090565b5b808211156200020757600081556001016200020c565b60006020828403121562000234578081fd5b81516001600160a01b03811681146200024b578182fd5b9392505050565b600181811c908216806200026757607f821691505b602082108114156200028957634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a0516131c1620002c360003960008181610a1101526117cc0152600081816108c7015261181801526131c16000f3fe6080604052600436106103645760003560e01c806370a08231116101c6578063a9059cbb116100f7578063dd62ed3e11610095578063f2fde38b1161006f578063f2fde38b14610ae7578063f7dd53a914610b07578063fbcbc0f114610b27578063ffb2c47914610b4757600080fd5b8063dd62ed3e14610a6c578063e30443bc14610ab2578063e7841ec014610ad257600080fd5b8063ba079d49116100d1578063ba079d49146109bf578063bc4c4b37146109df578063be10b614146109ff578063c32c293d14610a3357600080fd5b8063a9059cbb14610949578063aafd847a14610969578063b22f8a041461099f57600080fd5b806395d89b4111610164578063a1363cda1161013e578063a1363cda146108b5578063a4234069146108e9578063a457c2d714610909578063a8b9d2401461092957600080fd5b806395d89b41146108665780639c3372ea1461087b5780639eec101e1461089b57600080fd5b806385a6b3ae116101a057806385a6b3ae146107f25780638bc1d639146108085780638da5cb5b1461082857806391b89fba1461084657600080fd5b806370a082311461077157806370d3c747146107a7578063715018a6146107dd57600080fd5b806331e79db0116102a05780635123425b1161023e57806365b8dbc01161021857806365b8dbc0146106ec5780636a4740021461070c5780636b69163b146107215780636d48467b1461075157600080fd5b80635123425b1461063c5780635183d6fd1461065c5780635b72c18c146106b357600080fd5b806340ffdd801161027a57806340ffdd801461059d57806341808904146105bd5780634e5ee1c0146105dc5780634e7b827f1461060c57600080fd5b806331e79db01461053d5780633599bb171461055d578063395093511461057d57600080fd5b806318160ddd1161030d57806323b872dd116102e757806323b872dd146104cb57806327ce0147146104eb5780633009a6091461050b578063313ce5671461052157600080fd5b806318160ddd146104595780631d4ff89a1461046e578063226cfa3d1461049e57600080fd5b806309bbedde1161033e57806309bbedde146103db578063162e7ace146103fa5780631694505e1461043257600080fd5b806303c833021461037857806306fdde0314610380578063095ea7b3146103ab57600080fd5b3661037357610371610b82565b005b600080fd5b610371610b82565b34801561038c57600080fd5b50610395610c22565b6040516103a29190612ef9565b60405180910390f35b3480156103b757600080fd5b506103cb6103c6366004612dee565b610cb4565b60405190151581526020016103a2565b3480156103e757600080fd5b50600a545b6040519081526020016103a2565b34801561040657600080fd5b5060155461041a906001600160a01b031681565b6040516001600160a01b0390911681526020016103a2565b34801561043e57600080fd5b5060145461041a90630100000090046001600160a01b031681565b34801561046557600080fd5b506002546103ec565b34801561047a57600080fd5b506103cb610489366004612cff565b60116020526000908152604090205460ff1681565b3480156104aa57600080fd5b506103ec6104b9366004612cff565b60166020526000908152604090205481565b3480156104d757600080fd5b506103cb6104e6366004612d9c565b610ccb565b3480156104f757600080fd5b506103ec610506366004612cff565b610d34565b34801561051757600080fd5b506103ec600e5481565b34801561052d57600080fd5b50604051600981526020016103a2565b34801561054957600080fd5b50610371610558366004612cff565b610d9d565b34801561056957600080fd5b50610371610578366004612e19565b610e80565b34801561058957600080fd5b506103cb610598366004612dee565b610f3b565b3480156105a957600080fd5b506103716105b8366004612e19565b610f71565b3480156105c957600080fd5b506014546103cb90610100900460ff1681565b3480156105e857600080fd5b506103cb6105f7366004612cff565b60136020526000908152604090205460ff1681565b34801561061857600080fd5b506103cb610627366004612cff565b600f6020526000908152604090205460ff1681565b34801561064857600080fd5b50610371610657366004612ddc565b61101e565b34801561066857600080fd5b5061067c610677366004612e51565b611091565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c0016103a2565b3480156106bf57600080fd5b506103cb6106ce366004612cff565b6001600160a01b031660009081526013602052604090205460ff1690565b3480156106f857600080fd5b50610371610707366004612cff565b6110f1565b34801561071857600080fd5b5061037161117a565b34801561072d57600080fd5b506103cb61073c366004612cff565b60106020526000908152604090205460ff1681565b34801561075d57600080fd5b506103cb61076c366004612cff565b611234565b34801561077d57600080fd5b506103ec61078c366004612cff565b6001600160a01b031660009081526020819052604090205490565b3480156107b357600080fd5b5061041a6107c2366004612cff565b6012602052600090815260409020546001600160a01b031681565b3480156107e957600080fd5b5061037161129e565b3480156107fe57600080fd5b506103ec60085481565b34801561081457600080fd5b50610371610823366004612ddc565b611330565b34801561083457600080fd5b506009546001600160a01b031661041a565b34801561085257600080fd5b506103ec610861366004612cff565b6113a3565b34801561087257600080fd5b506103956113ae565b34801561088757600080fd5b50610371610896366004612e19565b6113bd565b3480156108a757600080fd5b506014546103cb9060ff1681565b3480156108c157600080fd5b506103ec7f000000000000000000000000000000000000000000000000000000000000000081565b3480156108f557600080fd5b506014546103cb9062010000900460ff1681565b34801561091557600080fd5b506103cb610924366004612dee565b61145c565b34801561093557600080fd5b506103ec610944366004612cff565b6114ab565b34801561095557600080fd5b506103cb610964366004612dee565b6114d7565b34801561097557600080fd5b506103ec610984366004612cff565b6001600160a01b031660009081526007602052604090205490565b3480156109ab57600080fd5b506103716109ba366004612ddc565b6114e4565b3480156109cb57600080fd5b506103cb6109da366004612cff565b611557565b3480156109eb57600080fd5b506103cb6109fa366004612d37565b6115c1565b348015610a0b57600080fd5b506103ec7f000000000000000000000000000000000000000000000000000000000000000081565b348015610a3f57600080fd5b5061041a610a4e366004612cff565b6001600160a01b039081166000908152601260205260409020541690565b348015610a7857600080fd5b506103ec610a87366004612d6f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610abe57600080fd5b50610371610acd366004612dee565b61175d565b348015610ade57600080fd5b50600e546103ec565b348015610af357600080fd5b50610371610b02366004612cff565b611854565b348015610b1357600080fd5b50610371610b22366004612d6f565b611974565b348015610b3357600080fd5b5061067c610b42366004612cff565b611a64565b348015610b5357600080fd5b50610b67610b62366004612e51565b611b13565b604080519384526020840192909252908201526060016103a2565b6000610b8d60025490565b11610b9757600080fd5b3415610c2057610bd7610ba960025490565b610bc434700100000000000000000000000000000000611c46565b610bce9190612fbc565b60055490611ce8565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610c1c9034611ce8565b6008555b565b606060038054610c319061306a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5d9061306a565b8015610caa5780601f10610c7f57610100808354040283529160200191610caa565b820191906000526020600020905b815481529060010190602001808311610c8d57829003601f168201915b5050505050905090565b6000610cc1338484611d47565b5060015b92915050565b6000610cd8848484611e9f565b610d2a8433610d258560405180606001604052806028815260200161311f602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611f12565b611d47565b5060019392505050565b6001600160a01b0381166000908152600660209081526040808320549183905282205460055470010000000000000000000000000000000092610d9392610d8e92610d8891610d839190611c46565b611f4c565b90611f5c565b611f9a565b610cc59190612fbc565b6009546001600160a01b03163314610dea5760405162461bcd60e51b8152602060048201819052602482015260008051602061314783398151915260448201526064015b60405180910390fd5b6001600160a01b0381166000908152600f602052604090205460ff1615610e1057600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610e3e908290611fad565b610e49600a8261200c565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610ec85760405162461bcd60e51b815260206004820181905260248201526000805160206131478339815191526044820152606401610de1565b60145460ff620100009091041615158115151415610ee557600080fd5b60148054821515620100000262ff0000199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610f3090831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610cc1918590610d259086611ce8565b6009546001600160a01b03163314610fb95760405162461bcd60e51b815260206004820181905260248201526000805160206131478339815191526044820152606401610de1565b60145460ff6101009091041615158115151415610fd557600080fd5b601480548215156101000261ff00199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610f3090831515815260200190565b6009546001600160a01b031633146110665760405162461bcd60e51b815260206004820181905260248201526000805160206131478339815191526044820152606401610de1565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6000806000806000806110a3600a5490565b87106110c25750600094506000199350839250849150819050806110e8565b60006110cf600a89612171565b90506110da81611a64565b965096509650965096509650505b91939550919395565b6009546001600160a01b031633146111395760405162461bcd60e51b815260206004820181905260248201526000805160206131478339815191526044820152606401610de1565b601480546001600160a01b039092166301000000027fffffffffffffffffff0000000000000000000000000000000000000000ffffff909216919091179055565b60405162461bcd60e51b815260206004820152606f60248201527f44757264656e496e755f4469766964656e645f547261636b65723a207769746860448201527f647261774469766964656e642064697361626c65642e2055736520746865202760648201527f636c61696d272066756e6374696f6e206f6e20746865206d61696e204475726460848201527f656e496e7520636f6e74726163742e000000000000000000000000000000000060a482015260c401610de1565b6009546000906001600160a01b0316331461127f5760405162461bcd60e51b815260206004820181905260248201526000805160206131478339815191526044820152606401610de1565b506001600160a01b031660009081526010602052604090205460ff1690565b6009546001600160a01b031633146112e65760405162461bcd60e51b815260206004820181905260248201526000805160206131478339815191526044820152606401610de1565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6009546001600160a01b031633146113785760405162461bcd60e51b815260206004820181905260248201526000805160206131478339815191526044820152606401610de1565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610cc5826114ab565b606060048054610c319061306a565b6009546001600160a01b031633146114055760405162461bcd60e51b815260206004820181905260248201526000805160206131478339815191526044820152606401610de1565b60145460ff161515811515141561141b57600080fd5b6014805460ff19168215159081179091556040519081527f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890602001610f30565b6000610cc13384610d2585604051806060016040528060258152602001613167602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611f12565b6001600160a01b038116600090815260076020526040812054610cc5906114d184610d34565b906121b2565b6000610cc1338484611e9f565b6009546001600160a01b0316331461152c5760405162461bcd60e51b815260206004820181905260248201526000805160206131478339815191526044820152606401610de1565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b031633146115a25760405162461bcd60e51b815260206004820181905260248201526000805160206131478339815191526044820152606401610de1565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b0316331461160c5760405162461bcd60e51b815260206004820181905260248201526000805160206131478339815191526044820152606401610de1565b60145462010000900460ff161561162557506000610cc5565b6001600160a01b03831660009081526011602052604090205460ff1682801561164b5750805b801561165f5750601454610100900460ff16155b1561166e576000915050610cc5565b6000816116835761167e856121f4565b61168c565b61168c85612532565b90508015611752576001600160a01b0385166000908152601660205260409020429055811561170057831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c836040516116f391815260200190565b60405180910390a3611747565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0928360405161173e91815260200190565b60405180910390a35b600192505050610cc5565b506000949350505050565b6009546001600160a01b031633146117a55760405162461bcd60e51b815260206004820181905260248201526000805160206131478339815191526044820152606401610de1565b6001600160a01b0382166000908152600f602052604090205460ff16156117ca575050565b7f000000000000000000000000000000000000000000000000000000000000000081101561180c576117fd600a8361200c565b611808826000611fad565b5050565b6118168282611fad565b7f0000000000000000000000000000000000000000000000000000000000000000811061184957611808600a8383612927565b611808600a8361200c565b6009546001600160a01b0316331461189c5760405162461bcd60e51b815260206004820181905260248201526000805160206131478339815191526044820152606401610de1565b6001600160a01b0381166119185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610de1565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031633146119bc5760405162461bcd60e51b815260206004820181905260248201526000805160206131478339815191526044820152606401610de1565b6001600160a01b03811660009081526013602052604090205460ff16806119ea57506001600160a01b038116155b611a365760405162461bcd60e51b815260206004820152601760248201527f546f6b656e206e6f7420696e20616c6c6f77206c6973740000000000000000006044820152606401610de1565b6001600160a01b03918216600090815260126020526040902080546001600160a01b03191691909216179055565b80600080808080611a76600a876129d0565b9450600019935060008512611ad857600e54851115611aa457600e54611a9d908690612a1b565b9350611ad8565b600e54600a5460009110611ab9576000611ac8565b600e54600a54611ac8916121b2565b9050611ad48682611f5c565b9450505b611ae1866114ab565b9250611aec86610d34565b6001600160a01b038716600090815260166020526040902054969895975093959294915050565b600a5460009081908190801580611b32575060145462010000900460ff165b15611b48575050600e5460009250829150611c3f565b600e546000805a90506000805b8984108015611b6357508582105b15611c2e5784611b72816130a5565b955050858510611b8157600094505b6000600a6000018681548110611ba757634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff16611bf457611be18160016115c1565b15611bf45781611bf0816130a5565b9250505b82611bfe816130a5565b93505060005a905080851115611c2557611c22611c1b86836121b2565b8790611ce8565b95505b9350611b559050565b600e85905590975095509193505050505b9193909250565b600082611c5557506000610cc5565b6000611c618385612fdc565b905082611c6e8583612fbc565b14611ce15760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610de1565b9392505050565b600080611cf58385612fa4565b905083811015611ce15760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610de1565b6001600160a01b038316611dc25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610de1565b6001600160a01b038216611e3e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610de1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152603060248201527f44757264656e496e755f4469766964656e645f547261636b65723a204e6f207460448201527f72616e736665727320616c6c6f776564000000000000000000000000000000006064820152608401610de1565b505050565b60008184841115611f365760405162461bcd60e51b8152600401610de19190612ef9565b506000611f438486613053565b95945050505050565b60008181811215610cc557600080fd5b600080611f698385612f4c565b905060008312158015611f7c5750838112155b80611f915750600083128015611f9157508381125b611ce157600080fd5b600080821215611fa957600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611fec576000611fda83836121b2565b9050611fe68482612a58565b50505050565b80821015611f0d57600061200082846121b2565b9050611fe68482612abc565b6001600160a01b038116600090815260038301602052604090205460ff16612032575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff191690556001808601835281842084905560028601909252822054845490929161207c91613053565b905060008460000182815481106120a357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0390811680845260028901909252604080842087905590871683528220919091558554909150819086908590811061210057634e487b7160e01b600052603260045260246000fd5b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055845485908061214857634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b600082600001828154811061219657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169392505050565b6000611ce183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f12565b600080612200836114ab565b90508015612529576001600160a01b03831660009081526007602052604090205461222b9082611ce8565b6001600160a01b0380851660009081526007602090815260408083209490945560129052918220546014549116919060ff16158061227057506001600160a01b038216155b8061229457506001600160a01b03821660009081526013602052604090205460ff16155b156122f7576040516001600160a01b03861690610bb89085906000818181858888f193505050503d80600081146122e7576040519150601f19603f3d011682016040523d82523d6000602084013e6122ec565b606091505b50508091505061248f565b604080516002808252606082018352600092602083019080368337019050509050601460039054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561236657600080fd5b505afa15801561237a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239e9190612d1b565b816000815181106123bf57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061240157634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260145460405163b6f9de9560e01b815263010000009091049091169063b6f9de959086906124509060009086908c904290600401612ec4565b6000604051808303818588803b15801561246957600080fd5b505af19350505050801561247b575060015b612488576000915061248d565b600191505b505b806124dd576001600160a01b0385166000908152600760205260409020546124b790846121b2565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8460405161251891815260200190565b60405180910390a250909392505050565b50600092915050565b60008061253e836114ab565b90508015612529576001600160a01b0383166000908152600760205260408120546125699083611ce8565b6001600160a01b0385166000908152600760205260408082209290925581516002808252606082019093529091816020016020820280368337019050509050601460039054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156125f657600080fd5b505afa15801561260a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262e9190612d1b565b8160008151811061264f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260155482519116908290600190811061268e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526015546040516370a0823160e01b815230600482015260009291909116906370a082319060240160206040518083038186803b1580156126e357600080fd5b505afa1580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190612e69565b60145460405163b6f9de9560e01b8152919250630100000090046001600160a01b03169063b6f9de9590869061275c90600090879030904290600401612ec4565b6000604051808303818588803b15801561277557600080fd5b505af193505050508015612787575060015b61279457600092506128ce565b6015546040516370a0823160e01b81523060048201526000916128169184916001600160a01b0316906370a082319060240160206040518083038186803b1580156127de57600080fd5b505afa1580156127f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d19190612e69565b905080156128c7576015546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb90604401602060405180830381600087803b15801561288957600080fd5b505af115801561289d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c19190612e35565b506128cc565b600093505b505b8261291d576001600160a01b0386166000908152600760205260409020546128f690856121b2565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff161561296c576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166129fb5750600019610cc5565b506001600160a01b03166000908152600291909101602052604090205490565b600080612a288385612ffb565b905060008312158015612a3b5750838113155b80611f915750600083128015611f915750838113611ce157600080fd5b612a628282612b00565b612a9c612a7d610d8383600554611c4690919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490612a1b565b6001600160a01b0390921660009081526006602052604090209190915550565b612ac68282612bdf565b612a9c612ae1610d8383600554611c4690919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611f5c565b6001600160a01b038216612b565760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610de1565b600254612b639082611ce8565b6002556001600160a01b038216600090815260208190526040902054612b899082611ce8565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b038216612c5b5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610de1565b612c98816040518060600160405280602281526020016130fd602291396001600160a01b0385166000908152602081905260409020549190611f12565b6001600160a01b038316600090815260208190526040902055600254612cbe90826121b2565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612bd3565b600060208284031215612d10578081fd5b8135611ce1816130d6565b600060208284031215612d2c578081fd5b8151611ce1816130d6565b60008060408385031215612d49578081fd5b8235612d54816130d6565b91506020830135612d64816130ee565b809150509250929050565b60008060408385031215612d81578182fd5b8235612d8c816130d6565b91506020830135612d64816130d6565b600080600060608486031215612db0578081fd5b8335612dbb816130d6565b92506020840135612dcb816130d6565b929592945050506040919091013590565b60008060408385031215612d49578182fd5b60008060408385031215612e00578182fd5b8235612e0b816130d6565b946020939093013593505050565b600060208284031215612e2a578081fd5b8135611ce1816130ee565b600060208284031215612e46578081fd5b8151611ce1816130ee565b600060208284031215612e62578081fd5b5035919050565b600060208284031215612e7a578081fd5b5051919050565b6000815180845260208085019450808401835b83811015612eb95781516001600160a01b031687529582019590820190600101612e94565b509495945050505050565b848152608060208201526000612edd6080830186612e81565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b81811015612f2557858101830151858201604001528201612f09565b81811115612f365783604083870101525b50601f01601f1916929092016040019392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615612f8657612f866130c0565b82600160ff1b038412811615612f9e57612f9e6130c0565b50500190565b60008219821115612fb757612fb76130c0565b500190565b600082612fd757634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612ff657612ff66130c0565b500290565b600080831283600160ff1b01831281151615613019576130196130c0565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831381161561304d5761304d6130c0565b50500390565b600082821015613065576130656130c0565b500390565b600181811c9082168061307e57607f821691505b6020821081141561309f57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156130b9576130b96130c0565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146130eb57600080fd5b50565b80151581146130eb57600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212202219e5202a11e36a127b99c0a4695c7c7aa41519c3b705d9b43d39d2c82bda5064736f6c63430008040033

Deployed Bytecode

0x6080604052600436106104f05760003560e01c8063871c128d11610294578063c02466681161015e578063dd62ed3e116100d6578063f1c0ddff1161008a578063f2fde38b1161006f578063f2fde38b14610e8d578063f5d3c79a14610ead578063fd957f4214610ecd57600080fd5b8063f1c0ddff14610e40578063f27fd25414610e6d57600080fd5b8063e37ba8f9116100bb578063e37ba8f914610dd7578063e7841ec014610df7578063ed37af0b14610e0c57600080fd5b8063dd62ed3e14610d7b578063e2f4560514610dc157600080fd5b8063d07a091c1161012d578063d5e3725111610112578063d5e3725114610d25578063d8032ed314610d45578063d94535ae14610d6557600080fd5b8063d07a091c14610ce5578063d469801614610d0557600080fd5b8063c024666814610c65578063c32c293d14610c85578063c6616ba114610ca5578063cd66056a14610cc557600080fd5b80639cefc1da1161020c578063aa4704f3116101c0578063b5cc797c116101a5578063b5cc797c14610bff578063b62496f514610c15578063ba079d4914610c4557600080fd5b8063aa4704f314610b50578063ad56c13c14610ba857600080fd5b8063a694fc3a116101f1578063a694fc3a14610af0578063a8b9d24014610b10578063a9059cbb14610b3057600080fd5b80639cefc1da14610ab0578063a457c2d714610ad057600080fd5b806395d89b41116102635780639a7a23d6116102485780639a7a23d614610a5a5780639c1b8af514610a7a5780639c3372ea14610a9057600080fd5b806395d89b4114610a2f57806398118cb414610a4457600080fd5b8063871c128d146109bc57806388bdd9be146109dc5780638a8c523c146109fc5780638da5cb5b14610a1157600080fd5b8063435c89e4116103d55780635b72c18c1161034d578063700bb19111610301578063715018a6116102e6578063715018a61461095a5780637d32f3421461096f578063868730c71461099c57600080fd5b8063700bb1911461090457806370a082311461092457600080fd5b806365b8dbc01161033257806365b8dbc0146108a45780636843cd84146108c45780636d48467b146108e457600080fd5b80635b72c18c1461086f57806364b0f6531461088f57600080fd5b80634ada218b116103a45780634fbee193116103895780634fbee193146107f657806350151d991461082f5780635123425b1461084f57600080fd5b80634ada218b146107c05780634e71d92d146107e157600080fd5b8063435c89e4146107395780634912572c1461076657806349bd5a5e146107865780634a74bb02146107a657600080fd5b806323b872dd116104685780633599bb17116104375780633a7d925c1161041c5780633a7d925c146106ed5780633f407b841461070357806340ffdd801461071957600080fd5b80633599bb17146106ad57806339509351146106cd57600080fd5b806323b872dd1461063c5780632c1f52161461065c57806330bb4cff1461067c578063313ce5671461069157600080fd5b80630ef35b7e116104bf5780631694505e116104a45780631694505e146105d957806318160ddd146106115780631fa705311461062657600080fd5b80630ef35b7e14610599578063106b5da1146105b957600080fd5b806302259e9e146104fc57806305ca5f081461052557806306fdde0314610547578063095ea7b31461056957600080fd5b366104f757005b600080fd5b34801561050857600080fd5b5061051260105481565b6040519081526020015b60405180910390f35b34801561053157600080fd5b506105456105403660046143be565b610eed565b005b34801561055357600080fd5b5061055c610fc4565b60405161051c919061446d565b34801561057557600080fd5b5061058961058436600461435b565b611056565b604051901515815260200161051c565b3480156105a557600080fd5b506105456105b43660046143ee565b61106d565b3480156105c557600080fd5b506105456105d43660046143be565b611171565b3480156105e557600080fd5b506006546105f9906001600160a01b031681565b6040516001600160a01b03909116815260200161051c565b34801561061d57600080fd5b50600254610512565b34801561063257600080fd5b5061051260095481565b34801561064857600080fd5b5061058961065736600461429c565b61128c565b34801561066857600080fd5b50600c546105f9906001600160a01b031681565b34801561068857600080fd5b506105126112f5565b34801561069d57600080fd5b506040516009815260200161051c565b3480156106b957600080fd5b506105456106c8366004614386565b611390565b3480156106d957600080fd5b506105896106e836600461435b565b611454565b3480156106f957600080fd5b5061051260155481565b34801561070f57600080fd5b5061051260085481565b34801561072557600080fd5b50610545610734366004614386565b61148a565b34801561074557600080fd5b506105126107543660046143be565b601c6020526000908152604090205481565b34801561077257600080fd5b50600e546105f9906001600160a01b031681565b34801561079257600080fd5b506007546105f9906001600160a01b031681565b3480156107b257600080fd5b506016546105899060ff1681565b3480156107cc57600080fd5b5060075461058990600160b01b900460ff1681565b3480156107ed57600080fd5b5061054561151d565b34801561080257600080fd5b5061058961081136600461422c565b6001600160a01b031660009081526018602052604090205460ff1690565b34801561083b57600080fd5b5061054561084a36600461422c565b6115bd565b34801561085b57600080fd5b5061054561086a3660046142dc565b611627565b34801561087b57600080fd5b5061058961088a36600461422c565b611746565b34801561089b57600080fd5b506105126117de565b3480156108b057600080fd5b506105456108bf36600461422c565b61183c565b3480156108d057600080fd5b506105126108df36600461422c565b61193c565b3480156108f057600080fd5b506105896108ff36600461422c565b6119d4565b34801561091057600080fd5b5061054561091f3660046143be565b611a20565b34801561093057600080fd5b5061051261093f36600461422c565b6001600160a01b031660009081526020819052604090205490565b34801561096657600080fd5b50610545611b17565b34801561097b57600080fd5b5061051261098a36600461422c565b601b6020526000908152604090205481565b3480156109a857600080fd5b506105456109b7366004614386565b611ba9565b3480156109c857600080fd5b506105456109d73660046143be565b611bfa565b3480156109e857600080fd5b506105456109f736600461422c565b611c94565b348015610a0857600080fd5b50610545611f75565b348015610a1d57600080fd5b506005546001600160a01b03166105f9565b348015610a3b57600080fd5b5061055c61202d565b348015610a5057600080fd5b5061051260135481565b348015610a6657600080fd5b50610545610a753660046142dc565b61203c565b348015610a8657600080fd5b5061051260175481565b348015610a9c57600080fd5b50610545610aab366004614386565b6120ad565b348015610abc57600080fd5b50610545610acb366004614386565b612140565b348015610adc57600080fd5b50610589610aeb36600461435b565b612219565b348015610afc57600080fd5b50610545610b0b3660046143be565b612268565b348015610b1c57600080fd5b50610512610b2b36600461422c565b6124a9565b348015610b3c57600080fd5b50610589610b4b36600461435b565b6124f5565b348015610b5c57600080fd5b50610b93610b6b36600461422c565b6001600160a01b03166000908152601b6020908152604080832054601a909252909120549091565b6040805192835260208301919091520161051c565b348015610bb457600080fd5b50610bc8610bc336600461422c565b612502565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161051c565b348015610c0b57600080fd5b5061051260125481565b348015610c2157600080fd5b50610589610c3036600461422c565b60196020526000908152604090205460ff1681565b348015610c5157600080fd5b50610589610c6036600461422c565b6125ba565b348015610c7157600080fd5b50610545610c803660046142dc565b612606565b348015610c9157600080fd5b506105f9610ca036600461422c565b6126d9565b348015610cb157600080fd5b50610545610cc036600461443c565b612770565b348015610cd157600080fd5b50600f546105f9906001600160a01b031681565b348015610cf157600080fd5b50610545610d0036600461422c565b6129ce565b348015610d1157600080fd5b50600d546105f9906001600160a01b031681565b348015610d3157600080fd5b50610545610d40366004614386565b612ae4565b348015610d5157600080fd5b50610545610d6036600461422c565b612b83565b348015610d7157600080fd5b5061051260145481565b348015610d8757600080fd5b50610512610d96366004614264565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610dcd57600080fd5b5061051260115481565b348015610de357600080fd5b50610545610df236600461422c565b612c70565b348015610e0357600080fd5b50610512612d20565b348015610e1857600080fd5b506105127f0000000000000000000000000000000000000000000000000000017d0c4b480081565b348015610e4c57600080fd5b50610512610e5b36600461422c565b601a6020526000908152604090205481565b348015610e7957600080fd5b50610bc8610e883660046143be565b612d7e565b348015610e9957600080fd5b50610545610ea836600461422c565b612dd5565b348015610eb957600080fd5b50610545610ec8366004614386565b612ef5565b348015610ed957600080fd5b50610545610ee836600461422c565b612f46565b6005546001600160a01b03163314610f3a5760405162461bcd60e51b8152602060048201819052602482015260008051602061466183398151915260448201526064015b60405180910390fd5b6000610f53600854600954612fb090919063ffffffff16565b90506000610f7682610f706009548661301690919063ffffffff16565b906130b1565b90506000610f9383610f706008548761301690919063ffffffff16565b9050610f9e846130f3565b600954610fab9083613333565b600955600854610fbb9082613333565b60085550505050565b606060038054610fd39061459e565b80601f0160208091040260200160405190810160405280929190818152602001828054610fff9061459e565b801561104c5780601f106110215761010080835404028352916020019161104c565b820191906000526020600020905b81548152906001019060200180831161102f57829003601f168201915b5050505050905090565b6000611063338484613375565b5060015b92915050565b6005546001600160a01b031633146110b55760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6000828152601c60205260409020548114156110d057600080fd5b60648111156111215760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e6720626f6e75732063616e2774206578636565642031303025006044820152606401610f31565b6000828152601c602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d91015b60405180910390a15050565b6005546001600160a01b031633146111b95760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b8060105414156111c857600080fd5b60105415806111e05750662386f26fc1000060105410155b6112785760405162461bcd60e51b815260206004820152604260248201527f6d61782073656c6c20616d6f756e74206d75737420656974686572206265206460448201527f697361626c6564206f722067726561746572207468616e203130206d696c6c6960648201527f6f6e000000000000000000000000000000000000000000000000000000000000608482015260a401610f31565b61128681633b9aca00614568565b60105550565b60006112998484846134ce565b6112eb84336112e685604051806060016040528060288152602001614639602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613be7565b613375565b5060019392505050565b600c54604080517f85a6b3ae00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b15801561135357600080fd5b505afa158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b91906143d6565b905090565b6005546001600160a01b031633146113d85760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b600c546040517f3599bb1700000000000000000000000000000000000000000000000000000000815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b15801561143957600080fd5b505af115801561144d573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916110639185906112e69086612fb0565b6005546001600160a01b031633146114d25760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b600c546040517f40ffdd8000000000000000000000000000000000000000000000000000000000815282151560048201526001600160a01b03909116906340ffdd809060240161141f565b600c546040517fbc4c4b37000000000000000000000000000000000000000000000000000000008152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b15801561158257600080fd5b505af1158015611596573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ba91906143a2565b50565b6005546001600160a01b031633146116055760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461166f5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6001600160a01b03821630141561168557600080fd5b600c546040517f5123425b0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152831515602483015290911690635123425b90604401600060405180830381600087803b1580156116ed57600080fd5b505af1158015611701573d6000803e3d6000fd5b5050604080516001600160a01b038616815284151560208201527ff8e5e8c18b9fbb7607019e8dab60e0ad981ba259df038a668fc13025a64854d69350019050611165565b600c546040517f5b72c18c0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526000921690635b72c18c906024015b60206040518083038186803b1580156117a657600080fd5b505afa1580156117ba573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106791906143a2565b600c54604080517f09bbedde00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b15801561135357600080fd5b6005546001600160a01b031633146118845760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6006546001600160a01b038281169116141561189f57600080fd5b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b03838116918217909255600c546040517f65b8dbc00000000000000000000000000000000000000000000000000000000081526004810192909252909116906365b8dbc09060240161141f565b600c546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b15801561199c57600080fd5b505afa1580156119b0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106791906143d6565b600c546040517f6d48467b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526000921690636d48467b9060240161178e565b600c546040517fffb2c47900000000000000000000000000000000000000000000000000000000815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b158015611a8457600080fd5b505af1158015611a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abc919061440f565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b03163314611b5f5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b600c546040517f8bc1d63900000000000000000000000000000000000000000000000000000000815233600482015282151560248201526001600160a01b0390911690638bc1d6399060440161141f565b6005546001600160a01b03163314611c425760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b62030d408110158015611c585750624c4b408111155b611c6157600080fd5b60175460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601755565b6005546001600160a01b03163314611cdc5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b600c546001600160a01b0382811691161415611cf757600080fd5b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3f57600080fd5b505afa158015611d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d779190614248565b6001600160a01b031614611d8a57600080fd5b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611dcc57600080fd5b505af1158015611de0573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611e2557600080fd5b505af1158015611e39573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611e5e6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611e9f57600080fd5b505af1158015611eb3573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611efe57600080fd5b505af1158015611f12573d6000803e3d6000fd5b5050600c546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600c80546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b03163314611fbd5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b600754600160b01b900460ff1615611fd457600080fd5b600780547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16600160b01b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b606060048054610fd39061459e565b6005546001600160a01b031633146120845760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6007546001600160a01b038381169116141561209f57600080fd5b6120a98282613c21565b5050565b6005546001600160a01b031633146120f55760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b600c546040517f9c3372ea00000000000000000000000000000000000000000000000000000000815282151560048201526001600160a01b0390911690639c3372ea9060240161141f565b6005546001600160a01b031633146121885760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b60075460ff600160a81b90910416151581151514156121a657600080fd5b60078054821515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a879061220e90831515815260200190565b60405180910390a150565b600061106333846112e685604051806060016040528060258152602001614681602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613be7565b600754600160a81b900460ff166122c15760405162461bcd60e51b815260206004820152601660248201527f5374616b696e67206973206e6f7420656e61626c6564000000000000000000006044820152606401610f31565b6000818152601c602052604090205461231c5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e00000000000000006044820152606401610f31565b6123264282612fb0565b336000908152601b6020526040902054106123a85760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e676572206475726160448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401610f31565b6000818152601c6020908152604080832054338452601a909252909120556123d04282612fb0565b336000818152601b6020526040902091909155600c546001600160a01b03169063e30443bc906123ff81613cea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561244557600080fd5b505af1158015612459573d6000803e3d6000fd5b505050506124643390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c88260405161249e91815260200190565b60405180910390a250565b600c546040517fa8b9d2400000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063a8b9d24090602401611984565b60006110633384846134ce565b600c546040517ffbcbc0f10000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c06040518083038186803b15801561256e57600080fd5b505afa158015612582573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a69190614309565b949c939b5091995097509550909350915050565b600c546040517fba079d490000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063ba079d499060240161178e565b6005546001600160a01b0316331461264e5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6001600160a01b03821660009081526018602052604090205460ff161515811515141561267a57600080fd5b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b600c546040517fc32c293d0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063c32c293d9060240160206040518083038186803b15801561273857600080fd5b505afa15801561274c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110679190614248565b6005546001600160a01b031633146127b85760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b60068411156128095760405162461bcd60e51b815260206004820152601e60248201527f6f7065726174696f6e20666565732063616e27742065786365656420362500006044820152606401610f31565b600483111561285a5760405162461bcd60e51b815260206004820152601e60248201527f6c697175696469747920666565732063616e27742065786365656420342500006044820152606401610f31565b6001821015801561286c575060038211155b6128ca5760405162461bcd60e51b815260206004820152602960248201527f455448207265776172642066656573206d757374206265206265747765656e20604482015268312520616e6420332560b81b6064820152608401610f31565b600181101580156128dc575060038111155b61293a5760405162461bcd60e51b815260206004820152602960248201527f455448207265776172642066656573206d757374206265206265747765656e20604482015268312520616e6420332560b81b6064820152608401610f31565b60128490556013839055601482905560158190556129628461295c8386612fb0565b90612fb0565b600a5560125460135460145461297d929161295c9190612fb0565b600b556040805185815260208101859052908101839052606081018290527f5c3aee3d65f7eb02cded951435d06b06ef307bc7f57b98975c4a41dc116e711c9060800160405180910390a150505050565b6005546001600160a01b03163314612a165760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6001600160a01b038181166000818152601d602090815260408083208054600160ff19918216811790925560189093529281902080549092169092179055600c54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015612a9257600080fd5b505af1158015612aa6573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c59250602001905061220e565b6005546001600160a01b03163314612b2c5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b60165460ff1615158115151415612b4257600080fd5b6016805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef9060200161220e565b3360009081526020819052604081205411612b9d57600080fd5b6001600160a01b038116301415612bb357600080fd5b600c546040517ff7dd53a90000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0383811660248301529091169063f7dd53a990604401600060405180830381600087803b158015612c1957600080fd5b505af1158015612c2d573d6000803e3d6000fd5b5050604080513381526001600160a01b03851660208201527f3640c981ed7cfa9e689ac4e9cafffd8c9240b716b14c982b3e90d54e7b61de24935001905061220e565b6005546001600160a01b03163314612cb85760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b612cc3816001612606565b600d546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600c54604080517fe7841ec000000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b15801561135357600080fd5b600c546040517f5183d6fd00000000000000000000000000000000000000000000000000000000815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401612556565b6005546001600160a01b03163314612e1d5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b6001600160a01b038116612e995760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610f31565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600c546040517fb22f8a0400000000000000000000000000000000000000000000000000000000815233600482015282151560248201526001600160a01b039091169063b22f8a049060440161141f565b6005546001600160a01b03163314612f8e5760405162461bcd60e51b815260206004820181905260248201526000805160206146618339815191526044820152606401610f31565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600080612fbd8385614530565b90508381101561300f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610f31565b9392505050565b60008261302557506000611067565b60006130318385614568565b90508261303e8583614548565b1461300f5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610f31565b600061300f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d68565b6130fc81613d96565b6000613115600854600954612fb090919063ffffffff16565b90506000613158613133601254601454612fb090919063ffffffff16565b610f7060145461315286610f706009544761301690919063ffffffff16565b90613016565b90506000613195613176601254601554612fb090919063ffffffff16565b610f7060155461315287610f706008544761301690919063ffffffff16565b905060006131a38383612fb0565b600c546040519192506000916001600160a01b039091169083908381818185875af1925050503d80600081146131f5576040519150601f19603f3d011682016040523d82523d6000602084013e6131fa565b606091505b50909150479050600061320e8260026130b1565b9050600061321c8284614587565b600e546040519192506000916001600160a01b039091169084908381818185875af1925050503d806000811461326e576040519150601f19603f3d011682016040523d82523d6000602084013e613273565b606091505b5050600f546040519192506000916001600160a01b039091169084908381818185875af1925050503d80600081146132c7576040519150601f19603f3d011682016040523d82523d6000602084013e6132cc565b606091505b505090507f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd087868880156132fd5750845b80156133065750835b60408051938452602084019290925215159082015260600160405180910390a15050505050505050505050565b600061300f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613be7565b6001600160a01b0383166133f05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610f31565b6001600160a01b03821661346c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610f31565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166135325760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f31565b6001600160a01b0382166135945760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f31565b600754600160b01b900460ff16806135c457506001600160a01b0383166000908152601d602052604090205460ff165b806135ef57507f0000000000000000000000000000000000000000000000000000017d0c4b48004210155b61363b5760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610f31565b806136515761364c83836000613f4d565b505050565b600754600160a01b900460ff1615801561368457506001600160a01b03831660009081526018602052604090205460ff16155b80156136a957506001600160a01b03821660009081526018602052604090205460ff16155b15613ae3576001600160a01b0380831660009081526019602052604080822054928616825290205460ff91821691161580156136ee5750600754600160a81b900460ff165b156137a0576001600160a01b0384166000908152601b602052604090205442101561375b5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b6564210000006044820152606401610f31565b6001600160a01b0384166000908152601b6020526040902054156137a0576001600160a01b0384166000908152601b60209081526040808320839055601a9091528120555b600081156137b157506015546137b6565b506014545b60006137d360125461295c60135485612fb090919063ffffffff16565b90506010546000141580156137e55750825b80156137ff57506006546001600160a01b03878116911614155b15613856576010548411156138565760405162461bcd60e51b815260206004820152601960248201527f6d617853656c6c5472616e73616374696f6e416d6f756e742e000000000000006044820152606401610f31565b306000908152602081905260409020546011548110801590819061389357506001600160a01b03881660009081526019602052604090205460ff16155b15613999576007805460ff60a01b1916600160a01b17905560165460ff16156139675760006138cf600854600954612fb090919063ffffffff16565b905060006138ec82610f706009548761301690919063ffffffff16565b9050600061390983610f706008548861301690919063ffffffff16565b90506000613928600b54610f706013548661301690919063ffffffff16565b90506000613947600a54610f706013548661301690919063ffffffff16565b905060006139558284612fb0565b9050613960816140d0565b5050505050505b30600090815260208190526040902054613980816130f3565b50600060098190556008556007805460ff60a01b191690555b60006139aa6064610f708987613016565b90506139b68782613333565b965085156139d3576008546139cb9082612fb0565b6008556139e4565b6009546139e09082612fb0565b6009555b6139ef893083613f4d565b601754600c546040517fffb2c479000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b158015613a5157600080fd5b505af1925050508015613a81575060408051601f3d908101601f19168201909252613a7e9181019061440f565b60015b613a8a57613adb565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505050505050505b613aee838383613f4d565b600c546001600160a01b031663e30443bc84613b0981613cea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613b4f57600080fd5b505af1158015613b63573d6000803e3d6000fd5b5050600c546001600160a01b0316915063e30443bc905083613b8481613cea565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613bca57600080fd5b505af1158015613bde573d6000803e3d6000fd5b50505050505050565b60008184841115613c0b5760405162461bcd60e51b8152600401610f31919061446d565b506000613c188486614587565b95945050505050565b6001600160a01b0382166000908152601960205260409020805460ff19168215801591909117909155613cae57600c5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613c9557600080fd5b505af1158015613ca9573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600754600090600160a81b900460ff16613d1c576001600160a01b038216600090815260208190526040902054611067565b6001600160a01b0382166000908152601a602052604090205461106790606490610f7090613d4a9083612fb0565b6001600160a01b038616600090815260208190526040902054613152565b60008183613d895760405162461bcd60e51b8152600401610f31919061446d565b506000613c188486614548565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613dd957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015613e4657600080fd5b505afa158015613e5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e7e9190614248565b81600181518110613e9f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654613ec59130911684613375565b6006546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac94790613f179085906000908690309042906004016144c0565b600060405180830381600087803b158015613f3157600080fd5b505af1158015613f45573d6000803e3d6000fd5b505050505050565b6001600160a01b038316613fb15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f31565b6001600160a01b0382166140135760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f31565b61405081604051806060016040528060268152602001614613602691396001600160a01b0386166000908152602081905260409020549190613be7565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461407f9082612fb0565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016134c1565b60006140dd8260026130b1565b905060006140eb8383613333565b9050476140f783613d96565b60006141034783613333565b905061410f8382614157565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b60065461416f9030906001600160a01b031684613375565b600654600d546040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b1580156141f357600080fd5b505af1158015614207573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061144d919061440f565b60006020828403121561423d578081fd5b813561300f816145ef565b600060208284031215614259578081fd5b815161300f816145ef565b60008060408385031215614276578081fd5b8235614281816145ef565b91506020830135614291816145ef565b809150509250929050565b6000806000606084860312156142b0578081fd5b83356142bb816145ef565b925060208401356142cb816145ef565b929592945050506040919091013590565b600080604083850312156142ee578182fd5b82356142f9816145ef565b9150602083013561429181614604565b60008060008060008060c08789031215614321578182fd5b865161432c816145ef565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6000806040838503121561436d578182fd5b8235614378816145ef565b946020939093013593505050565b600060208284031215614397578081fd5b813561300f81614604565b6000602082840312156143b3578081fd5b815161300f81614604565b6000602082840312156143cf578081fd5b5035919050565b6000602082840312156143e7578081fd5b5051919050565b60008060408385031215614400578182fd5b50508035926020909101359150565b600080600060608486031215614423578283fd5b8351925060208401519150604084015190509250925092565b60008060008060808587031215614451578182fd5b5050823594602084013594506040840135936060013592509050565b6000602080835283518082850152825b818110156144995785810183015185820160400152820161447d565b818111156144aa5783604083870101525b50601f01601f1916929092016040019392505050565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561450f5784516001600160a01b0316835293830193918301916001016144ea565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115614543576145436145d9565b500190565b60008261456357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614582576145826145d9565b500290565b600082821015614599576145996145d9565b500390565b600181811c908216806145b257607f821691505b602082108114156145d357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146115ba57600080fd5b80151581146115ba57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ac6f0ce86589efa6d90d9f818a1a85c2163be737f84757c25cd11f5a26b40e0964736f6c63430008040033

Deployed Bytecode Sourcemap

45103:24017:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45956:43;;;;;;;;;;;;;;;;;;;16826:25:1;;;16814:2;16799:18;45956:43:0;;;;;;;;67465:406;;;;;;;;;;-1:-1:-1;67465:406:0;;;;;:::i;:::-;;:::i;:::-;;9879:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;12187:210::-;;;;;;;;;;-1:-1:-1;12187:210:0;;;;;:::i;:::-;;:::i;:::-;;;8226:14:1;;8219:22;8201:41;;8189:2;8174:18;12187:210:0;8156:92:1;50734:329:0;;;;;;;;;;-1:-1:-1;50734:329:0;;;;;:::i;:::-;;:::i;52372:426::-;;;;;;;;;;-1:-1:-1;52372:426:0;;;;;:::i;:::-;;:::i;45182:41::-;;;;;;;;;;-1:-1:-1;45182:41:0;;;;-1:-1:-1;;;;;45182:41:0;;;;;;-1:-1:-1;;;;;5253:55:1;;;5235:74;;5223:2;5208:18;45182:41:0;5190:125:1;10999:108:0;;;;;;;;;;-1:-1:-1;11087:12:0;;10999:108;;45529:28;;;;;;;;;;;;;;;;12879:454;;;;;;;;;;-1:-1:-1;12879:454:0;;;;;:::i;:::-;;:::i;45637:47::-;;;;;;;;;;-1:-1:-1;45637:47:0;;;;-1:-1:-1;;;;;45637:47:0;;;57184:141;;;;;;;;;;;;;:::i;50597:92::-;;;;;;;;;;-1:-1:-1;50597:92:0;;50680:1;19345:36:1;;19333:2;19318:18;50597:92:0;19300:87:1;59527:119:0;;;;;;;;;;-1:-1:-1;59527:119:0;;;;;:::i;:::-;;:::i;13742:300::-;;;;;;;;;;-1:-1:-1;13742:300:0;;;;;:::i;:::-;;:::i;46261:36::-;;;;;;;;;;;;;;;;45493:29;;;;;;;;;;;;;;;;55017:121;;;;;;;;;;-1:-1:-1;55017:121:0;;;;;:::i;:::-;;:::i;46913:49::-;;;;;;;;;;-1:-1:-1;46913:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;45732:104;;;;;;;;;;-1:-1:-1;45732:104:0;;;;-1:-1:-1;;;;;45732:104:0;;;45232:28;;;;;;;;;;-1:-1:-1;45232:28:0;;;;-1:-1:-1;;;;;45232:28:0;;;46304:40;;;;;;;;;;-1:-1:-1;46304:40:0;;;;;;;;45339:34;;;;;;;;;;-1:-1:-1;45339:34:0;;;;-1:-1:-1;;;45339:34:0;;;;;;58896:103;;;;;;;;;;;;;:::i;57333:126::-;;;;;;;;;;-1:-1:-1;57333:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;57423:28:0;57399:4;57423:28;;;:19;:28;;;;;;;;;57333:126;53708:152;;;;;;;;;;-1:-1:-1;53708:152:0;;;;;:::i;:::-;;:::i;66563:228::-;;;;;;;;;;-1:-1:-1;66563:228:0;;;;;:::i;:::-;;:::i;66799:129::-;;;;;;;;;;-1:-1:-1;66799:129:0;;;;;:::i;:::-;;:::i;59145:142::-;;;;;;;;;;;;;:::i;53868:328::-;;;;;;;;;;-1:-1:-1;53868:328:0;;;;;:::i;:::-;;:::i;57659:171::-;;;;;;;;;;-1:-1:-1;57659:171:0;;;;;:::i;:::-;;:::i;59654:185::-;;;;;;;;;;-1:-1:-1;59654:185:0;;;;;:::i;:::-;;:::i;58478:410::-;;;;;;;;;;-1:-1:-1;58478:410:0;;;;;:::i;:::-;;:::i;11170:177::-;;;;;;;;;;-1:-1:-1;11170:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;11321:18:0;11289:7;11321:18;;;;;;;;;;;;11170:177;27828:148;;;;;;;;;;;;;:::i;46855:51::-;;;;;;;;;;-1:-1:-1;46855:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;59295:109;;;;;;;;;;-1:-1:-1;59295:109:0;;;;;:::i;:::-;;:::i;55723:241::-;;;;;;;;;;-1:-1:-1;55723:241:0;;;;;:::i;:::-;;:::i;52806:734::-;;;;;;;;;;-1:-1:-1;52806:734:0;;;;;:::i;:::-;;:::i;51071:153::-;;;;;;;;;;;;;:::i;27186:79::-;;;;;;;;;;-1:-1:-1;27251:6:0;;-1:-1:-1;;;;;27251:6:0;27186:79;;10098:104;;;;;;;;;;;;;:::i;46181:31::-;;;;;;;;;;;;;;;;54674:206;;;;;;;;;;-1:-1:-1;54674:206:0;;;;;:::i;:::-;;:::i;46423:40::-;;;;;;;;;;;;;;;;54888:121;;;;;;;;;;-1:-1:-1;54888:121:0;;;;;:::i;:::-;;:::i;51510:178::-;;;;;;;;;;-1:-1:-1;51510:178:0;;;;;:::i;:::-;;:::i;14545:400::-;;;;;;;;;;-1:-1:-1;14545:400:0;;;;;:::i;:::-;;:::i;51696:668::-;;;;;;;;;;-1:-1:-1;51696:668:0;;;;;:::i;:::-;;:::i;57467:184::-;;;;;;;;;;-1:-1:-1;57467:184:0;;;;;:::i;:::-;;:::i;11560:216::-;;;;;;;;;;-1:-1:-1;11560:216:0;;;;;:::i;:::-;;:::i;56986:190::-;;;;;;;;;;-1:-1:-1;56986:190:0;;;;;:::i;:::-;-1:-1:-1;;;;;57119:25:0;57077:7;57119:25;;;:16;:25;;;;;;;;;57146:12;:21;;;;;;;57119:25;;56986:190;;;;;18070:25:1;;;18126:2;18111:18;;18104:34;;;;18043:18;56986:190:0;18025:119:1;57838:307:0;;;;;;;;;;-1:-1:-1;57838:307:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6840:55:1;;;6822:74;;6927:2;6912:18;;6905:34;;;;6955:18;;;6948:34;;;;7013:2;6998:18;;6991:34;7056:3;7041:19;;7034:35;7100:3;7085:19;;7078:35;6809:3;6794:19;57838:307:0;6776:343:1;46141:33:0;;;;;;;;;;;;;;;;46735:57;;;;;;;;;;-1:-1:-1;46735:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;59847:127;;;;;;;;;;-1:-1:-1;59847:127:0;;;;;:::i;:::-;;:::i;54204:244::-;;;;;;;;;;-1:-1:-1;54204:244:0;;;;;:::i;:::-;;:::i;66419:136::-;;;;;;;;;;-1:-1:-1;66419:136:0;;;;;:::i;:::-;;:::i;55972:1006::-;;;;;;;;;;-1:-1:-1;55972:1006:0;;;;;:::i;:::-;;:::i;45843:104::-;;;;;;;;;;-1:-1:-1;45843:104:0;;;;-1:-1:-1;;;;;45843:104:0;;;51232:270;;;;;;;;;;-1:-1:-1;51232:270:0;;;;;:::i;:::-;;:::i;45693:30::-;;;;;;;;;;-1:-1:-1;45693:30:0;;;;-1:-1:-1;;;;;45693:30:0;;;54456:210;;;;;;;;;;-1:-1:-1;54456:210:0;;;;;:::i;:::-;;:::i;66150:261::-;;;;;;;;;;-1:-1:-1;66150:261:0;;;;;:::i;:::-;;:::i;46219:35::-;;;;;;;;;;;;;;;;11839:201;;;;;;;;;;-1:-1:-1;11839:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;12005:18:0;;;11973:7;12005:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11839:201;46078:54;;;;;;;;;;;;;;;;55434:281;;;;;;;;;;-1:-1:-1;55434:281:0;;;;;:::i;:::-;;:::i;59007:130::-;;;;;;;;;;;;;:::i;45429:57::-;;;;;;;;;;;;;;;46801:47;;;;;;;;;;-1:-1:-1;46801:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;58153:317;;;;;;;;;;-1:-1:-1;58153:317:0;;;;;:::i;:::-;;:::i;28131:281::-;;;;;;;;;;-1:-1:-1;28131:281:0;;;;;:::i;:::-;;:::i;59412:107::-;;;;;;;;;;-1:-1:-1;59412:107:0;;;;;:::i;:::-;;:::i;53548:152::-;;;;;;;;;;-1:-1:-1;53548:152:0;;;;;:::i;:::-;;:::i;67465:406::-;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;;;;;;;;;67544:19:::1;67566:25;67580:10;;67566:9;;:13;;:25;;;;:::i;:::-;67544:47;;67602:15;67620:38;67646:11;67620:21;67631:9;;67620:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;67602:56;;67669:16;67688:39;67715:11;67688:22;67699:10;;67688:6;:10;;:22;;;;:::i;:39::-;67669:58;;67740:28;67761:6;67740:20;:28::i;:::-;67793:9;::::0;:22:::1;::::0;67807:7;67793:13:::1;:22::i;:::-;67781:9;:34:::0;67839:10:::1;::::0;:24:::1;::::0;67854:8;67839:14:::1;:24::i;:::-;67826:10;:37:::0;-1:-1:-1;;;;67465:406:0:o;9879:100::-;9933:13;9966:5;9959:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9879:100;:::o;12187:210::-;12306:4;12328:39;173:10;12351:7;12360:6;12328:8;:39::i;:::-;-1:-1:-1;12385:4:0;12187:210;;;;;:::o;50734:329::-;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;50856:24:::1;::::0;;;:14:::1;:24;::::0;;;;;:33;::::1;;50848:42;;;::::0;::::1;;50918:3;50909:5;:12;;50901:56;;;::::0;-1:-1:-1;;;50901:56:0;;14166:2:1;50901:56:0::1;::::0;::::1;14148:21:1::0;14205:2;14185:18;;;14178:30;14244:33;14224:18;;;14217:61;14295:18;;50901:56:0::1;14138:181:1::0;50901:56:0::1;50970:24;::::0;;;:14:::1;:24;::::0;;;;;;;;:32;;;51018:37;;18070:25:1;;;18111:18;;;18104:34;;;51018:37:0::1;::::0;18043:18:1;51018:37:0::1;;;;;;;;50734:329:::0;;:::o;52372:426::-;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;52477:6:::1;52449:24;;:34;;52441:43;;;::::0;::::1;;52546:24;::::0;:29;;:96:::1;;;52624:18;52596:24;;:46;;52546:96;52524:212;;;::::0;-1:-1:-1;;;52524:212:0;;15646:2:1;52524:212:0::1;::::0;::::1;15628:21:1::0;15685:2;15665:18;;;15658:30;15724:34;15704:18;;;15697:62;15795:34;15775:18;;;15768:62;15867:4;15846:19;;;15839:33;15889:19;;52524:212:0::1;15618:296:1::0;52524:212:0::1;52774:16;:6:::0;52784:5:::1;52774:16;:::i;:::-;52747:24;:43:::0;-1:-1:-1;52372:426:0:o;12879:454::-;13019:4;13036:36;13046:6;13054:9;13065:6;13036:9;:36::i;:::-;13083:220;13106:6;173:10;13154:138;13210:6;13154:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13154:19:0;;;;;;:11;:19;;;;;;;;173:10;13154:33;;;;;;;;;;:37;:138::i;:::-;13083:8;:220::i;:::-;-1:-1:-1;13321:4:0;12879:454;;;;;:::o;57184:141::-;57274:15;;:43;;;;;;;;57247:7;;-1:-1:-1;;;;;57274:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57267:50;;57184:141;:::o;59527:119::-;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;59597:15:::1;::::0;:41:::1;::::0;;;;8226:14:1;;8219:22;59597:41:0::1;::::0;::::1;8201::1::0;-1:-1:-1;;;;;59597:15:0;;::::1;::::0;:34:::1;::::0;8174:18:1;;59597:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59527:119:::0;:::o;13742:300::-;173:10;13857:4;13951:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13951:34:0;;;;;;;;;;13857:4;;13879:133;;13929:7;;13951:50;;13990:10;13951:38;:50::i;55017:121::-;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;55087:15:::1;::::0;:43:::1;::::0;;;;8226:14:1;;8219:22;55087:43:0::1;::::0;::::1;8201:41:1::0;-1:-1:-1;;;;;55087:15:0;;::::1;::::0;:36:::1;::::0;8174:18:1;;55087:43:0::1;8156:92:1::0;58896:103:0;58933:15;;:58;;;;;58972:10;58933:58;;;5751:74:1;58933:15:0;5841:18:1;;;5834:50;-1:-1:-1;;;;;58933:15:0;;;;:30;;5724:18:1;;58933:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58896:103::o;53708:152::-;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;53821:18:::1;:31:::0;;-1:-1:-1;;;;;;53821:31:0::1;-1:-1:-1::0;;;;;53821:31:0;;;::::1;::::0;;;::::1;::::0;;53708:152::o;66563:228::-;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;-1:-1:-1;;;;;66653:22:0;::::1;66670:4;66653:22;;66645:31;;;::::0;::::1;;66689:15;::::0;:47:::1;::::0;;;;-1:-1:-1;;;;;5769:55:1;;;66689:47:0::1;::::0;::::1;5751:74:1::0;5868:14;;5861:22;5841:18;;;5834:50;66689:15:0;;::::1;::::0;:33:::1;::::0;5724:18:1;;66689:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;66752:31:0::1;::::0;;-1:-1:-1;;;;;5769:55:1;;5751:74;;5868:14;;5861:22;5856:2;5841:18;;5834:50;66752:31:0::1;::::0;-1:-1:-1;5724:18:1;;-1:-1:-1;66752:31:0::1;5706:184:1::0;66799:129:0;66883:15;;:37;;;;;-1:-1:-1;;;;;5253:55:1;;;66883:37:0;;;5235:74:1;66859:4:0;;66883:15;;:30;;5208:18:1;;66883:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;59145:142::-;59238:15;;:41;;;;;;;;59211:7;;-1:-1:-1;;;;;59238:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;53868:328;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;53977:15:::1;::::0;-1:-1:-1;;;;;53955:38:0;;::::1;53977:15:::0;::::1;53955:38;;53947:47;;;::::0;::::1;;54052:15;::::0;54010:59:::1;::::0;-1:-1:-1;;;;;54052:15:0;;::::1;::::0;54010:59;::::1;::::0;::::1;::::0;54052:15:::1;::::0;54010:59:::1;54080:15;:48:::0;;-1:-1:-1;;;;;;54080:48:0::1;-1:-1:-1::0;;;;;54080:48:0;;::::1;::::0;;::::1;::::0;;;54139:15:::1;::::0;:49:::1;::::0;;;;::::1;::::0;::::1;5235:74:1::0;;;;54139:15:0;;::::1;::::0;:37:::1;::::0;5208:18:1;;54139:49:0::1;5190:125:1::0;57659:171:0;57788:15;;:34;;;;;-1:-1:-1;;;;;5253:55:1;;;57788:34:0;;;5235:74:1;57756:7:0;;57788:15;;:25;;5208:18:1;;57788:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;59654:185::-;59783:15;;:48;;;;;-1:-1:-1;;;;;5253:55:1;;;59783:48:0;;;5235:74:1;59754:4:0;;59783:15;;:39;;5208:18:1;;59783:48:0;5190:125:1;58478:410:0;58660:15;;:28;;;;;;;;16826:25:1;;;58558:18:0;;;;;;-1:-1:-1;;;;;58660:15:0;;:23;;16799:18:1;;58660:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58704:176;;;19038:25:1;;;19094:2;19079:18;;19072:34;;;19122:18;;;19115:34;;;19180:2;19165:18;;19158:34;;;58543:145:0;;-1:-1:-1;58543:145:0;;-1:-1:-1;58543:145:0;-1:-1:-1;58860:9:0;;58822:5;;58704:176;;19025:3:1;19010:19;58704:176:0;;;;;;;58478:410;;;;:::o;27828:148::-;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;27919:6:::1;::::0;27898:40:::1;::::0;27935:1:::1;::::0;-1:-1:-1;;;;;27919:6:0::1;::::0;27898:40:::1;::::0;27935:1;;27898:40:::1;27949:6;:19:::0;;-1:-1:-1;;;;;;27949:19:0::1;::::0;;27828:148::o;59295:109::-;59349:15;;:47;;;;;59378:10;59349:47;;;5751:74:1;5868:14;;5861:22;5841:18;;;5834:50;-1:-1:-1;;;;;59349:15:0;;;;:28;;5724:18:1;;59349:47:0;5706:184:1;55723:241:0;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;55821:6:::1;55809:8;:18;;:41;;;;;55843:7;55831:8;:19;;55809:41;55801:50;;;::::0;::::1;;55901:16;::::0;55867:51:::1;::::0;55891:8;;55867:51:::1;::::0;;;::::1;55929:16;:27:::0;55723:241::o;52806:734::-;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;52915:15:::1;::::0;-1:-1:-1;;;;;52893:38:0;;::::1;52915:15:::0;::::1;52893:38;;52885:47;;;::::0;::::1;;52945:43;53038:10;52945:115;;53119:4;-1:-1:-1::0;;;;;53081:43:0::1;:18;-1:-1:-1::0;;;;;53081:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53081:43:0::1;;53073:52;;;::::0;::::1;;53138:68;::::0;-1:-1:-1;;;53138:68:0;;-1:-1:-1;;;;;53138:39:0;::::1;:68;::::0;::::1;5235:74:1::0;;;53138:39:0;::::1;::::0;5208:18:1;;53138:68:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;53217:54:0::1;::::0;-1:-1:-1;;;53217:54:0;;53265:4:::1;53217:54;::::0;::::1;5235:74:1::0;-1:-1:-1;;;;;53217:39:0;::::1;::::0;-1:-1:-1;53217:39:0::1;::::0;-1:-1:-1;5208:18:1;;53217:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;53282:18;-1:-1:-1::0;;;;;53282:39:0::1;;53322:7;27251:6:::0;;-1:-1:-1;;;;;27251:6:0;;27186:79;53322:7:::1;53282:48;::::0;-1:-1:-1;;;;;;53282:48:0::1;::::0;;;;;;-1:-1:-1;;;;;5253:55:1;;;53282:48:0::1;::::0;::::1;5235:74:1::0;5208:18;;53282:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;53389:15:0::1;::::0;53341:65:::1;::::0;-1:-1:-1;;;53341:65:0;;-1:-1:-1;;;;;53389:15:0;;::::1;53341:65;::::0;::::1;5235:74:1::0;53341:39:0;;::::1;::::0;-1:-1:-1;53341:39:0::1;::::0;-1:-1:-1;5208:18:1;;53341:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;53466:15:0::1;::::0;53424:59:::1;::::0;-1:-1:-1;;;;;53466:15:0;;::::1;::::0;-1:-1:-1;53424:59:0;;::::1;::::0;-1:-1:-1;53424:59:0::1;::::0;53466:15:::1;::::0;53424:59:::1;53496:15;:36:::0;;-1:-1:-1;;;;;;53496:36:0::1;-1:-1:-1::0;;;;;53496:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;52806:734:0:o;51071:153::-;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;51135:14:::1;::::0;-1:-1:-1;;;51135:14:0;::::1;;;51134:15;51126:24;;;::::0;::::1;;51163:14;:21:::0;;;::::1;-1:-1:-1::0;;;51163:21:0::1;::::0;;51200:16:::1;::::0;::::1;::::0;51163:21;;51200:16:::1;51071:153::o:0;10098:104::-;10154:13;10187:7;10180:14;;;;;:::i;54674:206::-;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;54804:13:::1;::::0;-1:-1:-1;;;;;54796:21:0;;::::1;54804:13:::0;::::1;54796:21;;54788:30;;;::::0;::::1;;54831:41;54860:4;54866:5;54831:28;:41::i;:::-;54674:206:::0;;:::o;54888:121::-;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;54958:15:::1;::::0;:43:::1;::::0;;;;8226:14:1;;8219:22;54958:43:0::1;::::0;::::1;8201:41:1::0;-1:-1:-1;;;;;54958:15:0;;::::1;::::0;:36:::1;::::0;8174:18:1;;54958:43:0::1;8156:92:1::0;51510:178:0;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;51582:14:::1;::::0;::::1;-1:-1:-1::0;;;51582:14:0;;::::1;;:24;;::::0;::::1;;;;51574:33;;;::::0;::::1;;51618:14;:23:::0;;;::::1;;-1:-1:-1::0;;;51618:23:0::1;::::0;;;::::1;;::::0;;51659:21:::1;::::0;::::1;::::0;::::1;::::0;51635:6;8226:14:1;8219:22;8201:41;;8189:2;8174:18;;8156:92;51659:21:0::1;;;;;;;;51510:178:::0;:::o;14545:400::-;14665:4;14687:228;173:10;14737:7;14759:145;14816:15;14759:145;;;;;;;;;;;;;;;;;173:10;14759:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14759:34:0;;;;;;;;;;;;:38;:145::i;51696:668::-;51755:14;;-1:-1:-1;;;51755:14:0;;;;51747:49;;;;-1:-1:-1;;;51747:49:0;;16121:2:1;51747:49:0;;;16103:21:1;16160:2;16140:18;;;16133:30;16199:24;16179:18;;;16172:52;16241:18;;51747:49:0;16093:172:1;51747:49:0;51815:24;;;;:14;:24;;;;;;51807:66;;;;-1:-1:-1;;;51807:66:0;;12644:2:1;51807:66:0;;;12626:21:1;12683:2;12663:18;;;12656:30;12722:26;12702:18;;;12695:54;12766:18;;51807:66:0;12616:174:1;51807:66:0;51939:29;:15;51959:8;51939:19;:29::i;:::-;173:10;51906:30;;;;:16;:30;;;;;;:62;51884:148;;;;-1:-1:-1;;;51884:148:0;;11881:2:1;51884:148:0;;;11863:21:1;11920:2;11900:18;;;11893:30;11959:34;11939:18;;;11932:62;12030:6;12010:18;;;12003:34;12054:19;;51884:148:0;11853:226:1;51884:148:0;52074:24;;;;:14;:24;;;;;;;;;173:10;52045:26;;:12;:26;;;;;;:53;52142:29;:15;52074:24;52142:19;:29::i;:::-;173:10;52109:30;;;;:16;:30;;;;;:62;;;;52184:15;;-1:-1:-1;;;;;52184:15:0;;:26;;52252:31;173:10;52252:17;:31::i;:::-;52184:110;;-1:-1:-1;;;;;;52184:110:0;;;;;;;-1:-1:-1;;;;;7316:55:1;;;52184:110:0;;;7298:74:1;7388:18;;;7381:34;7271:18;;52184:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52333:12;173:10;;93:98;52333:12;-1:-1:-1;;;;;52312:44:0;;52347:8;52312:44;;;;16826:25:1;;16814:2;16799:18;;16781:76;52312:44:0;;;;;;;;51696:668;:::o;57467:184::-;57596:15;;:47;;;;;-1:-1:-1;;;;;5253:55:1;;;57596:47:0;;;5235:74:1;57564:7:0;;57596:15;;:38;;5208:18:1;;57596:47:0;5190:125:1;11560:216:0;11682:4;11704:42;173:10;11728:9;11739:6;11704:9;:42::i;57838:307::-;58102:15;;:35;;;;;-1:-1:-1;;;;;5253:55:1;;;58102:35:0;;;5235:74:1;57952:7:0;;;;;;;;;;;;58102:15;;;;:26;;5208:18:1;;58102:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58095:42;;;;-1:-1:-1;58095:42:0;;-1:-1:-1;58095:42:0;-1:-1:-1;58095:42:0;-1:-1:-1;58095:42:0;;-1:-1:-1;57838:307:0;-1:-1:-1;;57838:307:0:o;59847:127::-;59931:15;;:35;;;;;-1:-1:-1;;;;;5253:55:1;;;59931:35:0;;;5235:74:1;59907:4:0;;59931:15;;:26;;5208:18:1;;59931:35:0;5190:125:1;54204:244:0;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;-1:-1:-1;;;;;54297:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;54289:49;;;::::0;::::1;;-1:-1:-1::0;;;;;54349:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;54349:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;54406:34;;8201:41:1;;;54406:34:0::1;::::0;8174:18:1;54406:34:0::1;;;;;;;54204:244:::0;;:::o;66419:136::-;66508:15;;:39;;;;;-1:-1:-1;;;;;5253:55:1;;;66508:39:0;;;5235:74:1;66481:7:0;;66508:15;;:30;;5208:18:1;;66508:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55972:1006::-;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;56171:1:::1;56157:10;:15;;56149:58;;;::::0;-1:-1:-1;;;56149:58:0;;11163:2:1;56149:58:0::1;::::0;::::1;11145:21:1::0;11202:2;11182:18;;;11175:30;11241:32;11221:18;;;11214:60;11291:18;;56149:58:0::1;11135:180:1::0;56149:58:0::1;56239:1;56226:9;:14;;56218:57;;;::::0;-1:-1:-1;;;56218:57:0;;11522:2:1;56218:57:0::1;::::0;::::1;11504:21:1::0;11561:2;11541:18;;;11534:30;11600:32;11580:18;;;11573:60;11650:18;;56218:57:0::1;11494:180:1::0;56218:57:0::1;56325:1;56308:13;:18;;:40;;;;;56347:1;56330:13;:18;;56308:40;56286:131;;;::::0;-1:-1:-1;;;56286:131:0;;16472:2:1;56286:131:0::1;::::0;::::1;16454:21:1::0;16511:2;16491:18;;;16484:30;16550:34;16530:18;;;16523:62;-1:-1:-1;;;16601:18:1;;;16594:39;16650:19;;56286:131:0::1;16444:231:1::0;56286:131:0::1;56468:1;56450:14;:19;;:42;;;;;56491:1;56473:14;:19;;56450:42;56428:133;;;::::0;-1:-1:-1;;;56428:133:0;;16472:2:1;56428:133:0::1;::::0;::::1;16454:21:1::0;16511:2;16491:18;;;16484:30;16550:34;16530:18;;;16523:62;-1:-1:-1;;;16601:18:1;;;16594:39;16650:19;;56428:133:0::1;16444:231:1::0;56428:133:0::1;56574:14;:27:::0;;;56612:12:::1;:24:::0;;;56647:16:::1;:32:::0;;;56690:17:::1;:34:::0;;;56753:55:::1;56591:10:::0;56753:35:::1;56710:14:::0;56627:9;56753:21:::1;:35::i;:::-;:39:::0;::::1;:55::i;:::-;56737:13;:71:::0;56873:14:::1;::::0;56855:12:::1;::::0;56834:16:::1;::::0;:54:::1;::::0;56873:14;56834:34:::1;::::0;:16;:20:::1;:34::i;:54::-;56819:12;:69:::0;56906:64:::1;::::0;;19038:25:1;;;19094:2;19079:18;;19072:34;;;19122:18;;;19115:34;;;19180:2;19165:18;;19158:34;;;56906:64:0::1;::::0;19025:3:1;19010:19;56906:64:0::1;;;;;;;55972:1006:::0;;;;:::o;51232:270::-;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;-1:-1:-1;;;;;51304:41:0;;::::1;;::::0;;;:33:::1;:41;::::0;;;;;;;:48;;51348:4:::1;-1:-1:-1::0;;51304:48:0;;::::1;::::0;::::1;::::0;;;51363:19:::1;:27:::0;;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;51408:15:::1;::::0;:44;;-1:-1:-1;;;51408:44:0;;::::1;::::0;::::1;5235:74:1::0;;;;51408:15:0;;::::1;::::0;:36:::1;::::0;5208:18:1;;51408:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;51470:24:0::1;::::0;-1:-1:-1;;;;;5253:55:1;;5235:74;;51470:24:0::1;::::0;-1:-1:-1;5223:2:1;5208:18;;-1:-1:-1;51470:24:0::1;5190:125:1::0;54456:210:0;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;54536:21:::1;::::0;::::1;;:32;;::::0;::::1;;;;54528:41;;;::::0;::::1;;54580:21;:31:::0;;-1:-1:-1;;54580:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;54629:29:::1;::::0;8201:41:1;;;54629:29:0::1;::::0;8189:2:1;8174:18;54629:29:0::1;8156:92:1::0;66150:261:0;66228:10;66242:1;11321:18;;;;;;;;;;;66218:25;66210:34;;;;;;-1:-1:-1;;;;;66263:22:0;;66280:4;66263:22;;66255:31;;;;;;66299:15;;:52;;;;;66333:10;66299:52;;;6130:34:1;-1:-1:-1;;;;;6200:15:1;;;6180:18;;;6173:43;66299:15:0;;;;:33;;6042:18:1;;66299:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66367:36:0;;;66385:10;6130:34:1;;-1:-1:-1;;;;;6200:15:1;;6195:2;6180:18;;6173:43;66367:36:0;;-1:-1:-1;6042:18:1;;-1:-1:-1;66367:36:0;6024:198:1;55434:281:0;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;55544:41:::1;55560:18;55580:4;55544:15;:41::i;:::-;55644:15;::::0;55601:59:::1;::::0;-1:-1:-1;;;;;55644:15:0;;::::1;::::0;55601:59;::::1;::::0;::::1;::::0;55644:15:::1;::::0;55601:59:::1;55671:15;:36:::0;;-1:-1:-1;;;;;;55671:36:0::1;-1:-1:-1::0;;;;;55671:36:0;;;::::1;::::0;;;::::1;::::0;;55434:281::o;59007:130::-;59090:15;;:39;;;;;;;;59063:7;;-1:-1:-1;;;;;59090:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;58153:317;58422:15;;:40;;;;;;;;16826:25:1;;;58272:7:0;;;;;;;;;;;;-1:-1:-1;;;;;58422:15:0;;;;:33;;16799:18:1;;58422:40:0;16781:76:1;28131:281:0;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;-1:-1:-1;;;;;28234:22:0;::::1;28212:110;;;::::0;-1:-1:-1;;;28212:110:0;;9997:2:1;28212:110:0::1;::::0;::::1;9979:21:1::0;10036:2;10016:18;;;10009:30;10075:34;10055:18;;;10048:62;10146:8;10126:18;;;10119:36;10172:19;;28212:110:0::1;9969:228:1::0;28212:110:0::1;28359:6;::::0;28338:38:::1;::::0;-1:-1:-1;;;;;28338:38:0;;::::1;::::0;28359:6:::1;::::0;28338:38:::1;::::0;28359:6:::1;::::0;28338:38:::1;28387:6;:17:::0;;-1:-1:-1;;;;;;28387:17:0::1;-1:-1:-1::0;;;;;28387:17:0;;;::::1;::::0;;;::::1;::::0;;28131:281::o;59412:107::-;59465:15;;:46;;;;;59493:10;59465:46;;;5751:74:1;5868:14;;5861:22;5841:18;;;5834:50;-1:-1:-1;;;;;59465:15:0;;;;:27;;5724:18:1;;59465:46:0;5706:184:1;53548:152:0;27398:6;;-1:-1:-1;;;;;27398:6:0;173:10;27398:22;27390:67;;;;-1:-1:-1;;;27390:67:0;;13399:2:1;27390:67:0;;;13381:21:1;;;13418:18;;;13411:30;-1:-1:-1;;;;;;;;;;;13457:18:1;;;13450:62;13529:18;;27390:67:0;13371:182:1;27390:67:0;53661:18:::1;:31:::0;;-1:-1:-1;;;;;;53661:31:0::1;-1:-1:-1::0;;;;;53661:31:0;;;::::1;::::0;;;::::1;::::0;;53548:152::o;22108:181::-;22166:7;;22198:5;22202:1;22198;:5;:::i;:::-;22186:17;;22227:1;22222;:6;;22214:46;;;;-1:-1:-1;;;22214:46:0;;10807:2:1;22214:46:0;;;10789:21:1;10846:2;10826:18;;;10819:30;10885:29;10865:18;;;10858:57;10932:18;;22214:46:0;10779:177:1;22214:46:0;22280:1;22108:181;-1:-1:-1;;;22108:181:0:o;23496:471::-;23554:7;23799:6;23795:47;;-1:-1:-1;23829:1:0;23822:8;;23795:47;23854:9;23866:5;23870:1;23866;:5;:::i;:::-;23854:17;-1:-1:-1;23899:1:0;23890:5;23894:1;23854:17;23890:5;:::i;:::-;:10;23882:56;;;;-1:-1:-1;;;23882:56:0;;12997:2:1;23882:56:0;;;12979:21:1;13036:2;13016:18;;;13009:30;13075:34;13055:18;;;13048:62;13146:3;13126:18;;;13119:31;13167:19;;23882:56:0;12969:223:1;24443:132:0;24501:7;24528:39;24532:1;24535;24528:39;;;;;;;;;;;;;;;;;:3;:39::i;67879:1238::-;67944:24;67961:6;67944:16;:24::i;:::-;67979:19;68001:25;68015:10;;68001:9;;:13;;:25;;;;:::i;:::-;67979:47;;68039:24;68066:187;68216:36;68237:14;;68216:16;;:20;;:36;;;;:::i;:::-;68066:131;68180:16;;68066:95;68149:11;68066:64;68120:9;;68066:35;:53;;:64;;;;:::i;:95::-;:113;;:131::i;:187::-;68039:214;;68266:25;68294:190;68446:37;68468:14;;68446:17;;:21;;:37;;;;:::i;:::-;68294:133;68409:17;;68294:96;68378:11;68294:65;68348:10;;68294:35;:53;;:65;;;;:::i;:190::-;68266:218;-1:-1:-1;68497:17:0;68517:39;:16;68266:218;68517:20;:39::i;:::-;68596:15;;68588:51;;68497:59;;-1:-1:-1;68570:12:0;;-1:-1:-1;;;;;68596:15:0;;;;68497:59;;68570:12;68588:51;68570:12;68588:51;68497:59;68596:15;68588:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68569:70:0;;-1:-1:-1;68670:21:0;;-1:-1:-1;68652:15:0;68717:14;68670:21;68729:1;68717:11;:14::i;:::-;68702:29;-1:-1:-1;68742:17:0;68762:14;68702:29;68762:7;:14;:::i;:::-;68817:18;;68809:49;;68742:34;;-1:-1:-1;68788:15:0;;-1:-1:-1;;;;;68817:18:0;;;;68849:4;;68788:15;68809:49;68788:15;68809:49;68849:4;68817:18;68809:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68901:18:0;;68893:78;;68787:71;;-1:-1:-1;68872:15:0;;-1:-1:-1;;;;;68901:18:0;;;;68947:9;;68872:15;68893:78;68872:15;68893:78;68947:9;68901:18;68893:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68871:100;;;68989:120;69017:9;69041:7;69063;:21;;;;;69074:10;69063:21;:35;;;;;69088:10;69063:35;68989:120;;;18345:25:1;;;18401:2;18386:18;;18379:34;;;;18456:14;18449:22;18429:18;;;18422:50;18333:2;18318:18;68989:120:0;;;;;;;67879:1238;;;;;;;;;;;:::o;22572:136::-;22630:7;22657:43;22661:1;22664;22657:43;;;;;;;;;;;;;;;;;:3;:43::i;17936:380::-;-1:-1:-1;;;;;18072:19:0;;18064:68;;;;-1:-1:-1;;;18064:68:0;;14880:2:1;18064:68:0;;;14862:21:1;14919:2;14899:18;;;14892:30;14958:34;14938:18;;;14931:62;15029:6;15009:18;;;15002:34;15053:19;;18064:68:0;14852:226:1;18064:68:0;-1:-1:-1;;;;;18151:21:0;;18143:68;;;;-1:-1:-1;;;18143:68:0;;10404:2:1;18143:68:0;;;10386:21:1;10443:2;10423:18;;;10416:30;10482:34;10462:18;;;10455:62;10553:4;10533:18;;;10526:32;10575:19;;18143:68:0;10376:224:1;18143:68:0;-1:-1:-1;;;;;18224:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18276:32;;16826:25:1;;;18276:32:0;;16799:18:1;18276:32:0;;;;;;;;17936:380;;;:::o;59982:4335::-;-1:-1:-1;;;;;60114:18:0;;60106:68;;;;-1:-1:-1;;;60106:68:0;;13760:2:1;60106:68:0;;;13742:21:1;13799:2;13779:18;;;13772:30;13838:34;13818:18;;;13811:62;-1:-1:-1;;;13889:18:1;;;13882:35;13934:19;;60106:68:0;13732:227:1;60106:68:0;-1:-1:-1;;;;;60193:16:0;;60185:64;;;;-1:-1:-1;;;60185:64:0;;9593:2:1;60185:64:0;;;9575:21:1;9632:2;9612:18;;;9605:30;9671:34;9651:18;;;9644:62;-1:-1:-1;;;9722:18:1;;;9715:33;9765:19;;60185:64:0;9565:225:1;60185:64:0;60282:14;;-1:-1:-1;;;60282:14:0;;;;;:57;;-1:-1:-1;;;;;;60300:39:0;;;;;;:33;:39;;;;;;;;60282:57;:99;;;;60362:19;60343:15;:38;;60282:99;60260:181;;;;-1:-1:-1;;;60260:181:0;;15285:2:1;60260:181:0;;;15267:21:1;;;15304:18;;;15297:30;15363:34;15343:18;;;15336:62;15415:18;;60260:181:0;15257:182:1;60260:181:0;60458:11;60454:3676;;60486:28;60502:4;60508:2;60512:1;60486:15;:28::i;:::-;59982:4335;;;:::o;60454:3676::-;60572:8;;-1:-1:-1;;;60572:8:0;;;;60571:9;:39;;;;-1:-1:-1;;;;;;60585:25:0;;;;;;:19;:25;;;;;;;;60584:26;60571:39;:67;;;;-1:-1:-1;;;;;;60615:23:0;;;;;;:19;:23;;;;;;;;60614:24;60571:67;60553:3577;;;-1:-1:-1;;;;;60682:29:0;;;60665:14;60682:29;;;:25;:29;;;;;;;60733:31;;;;;;;;60682:29;;;;;60733:31;60732:32;:50;;;;-1:-1:-1;60768:14:0;;-1:-1:-1;;;60768:14:0;;;;60732:50;60728:400;;;-1:-1:-1;;;;;60833:22:0;;;;;;:16;:22;;;;;;60859:15;-1:-1:-1;60833:41:0;60803:144;;;;-1:-1:-1;;;60803:144:0;;12286:2:1;60803:144:0;;;12268:21:1;12325:2;12305:18;;;12298:30;12364:31;12344:18;;;12337:59;12413:18;;60803:144:0;12258:179:1;60803:144:0;-1:-1:-1;;;;;60970:22:0;;;;;;:16;:22;;;;;;:27;60966:147;;-1:-1:-1;;;;;61022:22:0;;61047:1;61022:22;;;:16;:22;;;;;;;;:26;;;61071:12;:18;;;;;:22;60966:147;61144:21;61186:9;61182:156;;;-1:-1:-1;61232:17:0;;61182:156;;;-1:-1:-1;61306:16:0;;61182:156;61354:17;61374:51;61410:14;;61374:31;61392:12;;61374:13;:17;;:31;;;;:::i;:51::-;61354:71;;61464:24;;61492:1;61464:29;;:59;;;;;61514:9;61464:59;:179;;;;-1:-1:-1;61627:15:0;;-1:-1:-1;;;;;61611:32:0;;;61627:15;;61611:32;;61464:179;61442:449;;;61782:24;;61772:6;:34;;61742:133;;;;-1:-1:-1;;;61742:133:0;;14526:2:1;61742:133:0;;;14508:21:1;14565:2;14545:18;;;14538:30;14604:27;14584:18;;;14577:55;14649:18;;61742:133:0;14498:175:1;61742:133:0;61956:4;61907:28;11321:18;;;;;;;;;;;62018;;61994:42;;;;;;;62057:43;;-1:-1:-1;;;;;;62069:31:0;;;;;;:25;:31;;;;;;;;62068:32;62057:43;62053:1217;;;62121:8;:15;;-1:-1:-1;;;;62121:15:0;-1:-1:-1;;;62121:15:0;;;62161:21;;62121:15;62161:21;62157:863;;;62207:20;62230:25;62244:10;;62230:9;;:13;;:25;;;;:::i;:::-;62207:48;;62278:24;62305:105;62397:12;62305:61;62356:9;;62305:20;:50;;:61;;;;:::i;:105::-;62278:132;;62433:22;62458:106;62551:12;62458:62;62509:10;;62458:20;:50;;:62;;;;:::i;:106::-;62433:131;;62589:21;62613:104;62704:12;;62613:60;62660:12;;62613:16;:46;;:60;;;;:::i;:104::-;62589:128;;62742:22;62767:103;62856:13;;62767:58;62812:12;;62767:14;:44;;:58;;;;:::i;:103::-;62742:128;-1:-1:-1;62895:18:0;62916:33;62742:128;62935:13;62916:18;:33::i;:::-;62895:54;;62974:26;62989:10;62974:14;:26::i;:::-;62157:863;;;;;;;63085:4;63040:24;11321:18;;;;;;;;;;;63112:38;11321:18;63112:20;:38::i;:::-;-1:-1:-1;63183:1:0;63171:9;:13;;;63203:10;:14;63238:8;:16;;-1:-1:-1;;;;63238:16:0;;;62053:1217;63286:12;63301:30;63327:3;63301:21;:6;63312:9;63301:10;:21::i;:30::-;63286:45;-1:-1:-1;63357:16:0;:6;63286:45;63357:10;:16::i;:::-;63348:25;;63394:9;63390:155;;;63437:10;;:20;;63452:4;63437:14;:20::i;:::-;63424:10;:33;63390:155;;;63510:9;;:19;;63524:4;63510:13;:19::i;:::-;63498:9;:31;63390:155;63561:42;63577:4;63591;63598;63561:15;:42::i;:::-;63634:16;;63671:15;;:28;;;;;;;;16826:25:1;;;-1:-1:-1;;;;;63671:15:0;;;;:23;;16799:18:1;;63671:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63671:28:0;;;;;;;;-1:-1:-1;;63671:28:0;;;;;;;;;;;;:::i;:::-;;;63667:452;;;;;63863:231;;;19038:25:1;;;19094:2;19079:18;;19072:34;;;19122:18;;;19115:34;;;19180:2;19165:18;;19158:34;;;64066:9:0;;64013:4;;63863:231;;19025:3:1;19010:19;63863:231:0;;;;;;;63700:410;;;63667:452;60553:3577;;;;;;;;64142:33;64158:4;64164:2;64168:6;64142:15;:33::i;:::-;64188:15;;-1:-1:-1;;;;;64188:15:0;:26;64215:4;64221:23;64215:4;64221:17;:23::i;:::-;64188:57;;-1:-1:-1;;;;;;64188:57:0;;;;;;;-1:-1:-1;;;;;7316:55:1;;;64188:57:0;;;7298:74:1;7388:18;;;7381:34;7271:18;;64188:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64256:15:0;;-1:-1:-1;;;;;64256:15:0;;-1:-1:-1;64256:26:0;;-1:-1:-1;64283:2:0;64287:21;64283:2;64287:17;:21::i;:::-;64256:53;;-1:-1:-1;;;;;;64256:53:0;;;;;;;-1:-1:-1;;;;;7316:55:1;;;64256:53:0;;;7298:74:1;7388:18;;;7381:34;7271:18;;64256:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59982:4335;;;:::o;23011:226::-;23131:7;23167:12;23159:6;;;;23151:29;;;;-1:-1:-1;;;23151:29:0;;;;;;;;:::i;:::-;-1:-1:-1;23191:9:0;23203:5;23207:1;23203;:5;:::i;:::-;23191:17;23011:226;-1:-1:-1;;;;;23011:226:0:o;55146:280::-;-1:-1:-1;;;;;55229:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;55229:39:0;;;;;;;;;;;;55281:80;;55307:15;;:42;;-1:-1:-1;;;55307:42:0;;-1:-1:-1;;;;;5253:55:1;;;55307:42:0;;;5235:74:1;55307:15:0;;;;:36;;5208:18:1;;55307:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55281:80;55378:40;;;;;;-1:-1:-1;;;;;55378:40:0;;;;;;;;55146:280;;:::o;64325:289::-;64431:14;;64391:7;;-1:-1:-1;;;64431:14:0;;;;:175;;-1:-1:-1;;;;;11321:18:0;;11289:7;11321:18;;;;;;;;;;;64431:175;;;-1:-1:-1;;;;;64488:21:0;;;;;;:12;:21;;;;;;64465:103;;64546:3;;64465:54;;64488:30;;64546:3;64488:25;:30::i;:::-;-1:-1:-1;;;;;11321:18:0;;11289:7;11321:18;;;;;;;;;;;64465;11170:177;25071:312;25191:7;25226:12;25219:5;25211:28;;;;-1:-1:-1;;;25211:28:0;;;;;;;;:::i;:::-;-1:-1:-1;25250:9:0;25262:5;25266:1;25262;:5;:::i;65553:589::-;65703:16;;;65717:1;65703:16;;;;;;;;65679:21;;65703:16;;;;;;;;;;-1:-1:-1;65703:16:0;65679:40;;65748:4;65730;65735:1;65730:7;;;;;;-1:-1:-1;;;65730:7:0;;;;;;;;;-1:-1:-1;;;;;65730:23:0;;;:7;;;;;;;;;;:23;;;;65774:15;;:22;;;;;;;;:15;;;;;:20;;:22;;;;;65730:7;;65774:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65764:4;65769:1;65764:7;;;;;;-1:-1:-1;;;65764:7:0;;;;;;;;;-1:-1:-1;;;;;65764:32:0;;;:7;;;;;;;;;:32;65841:15;;65809:62;;65826:4;;65841:15;65859:11;65809:8;:62::i;:::-;65910:15;;:224;;;;;-1:-1:-1;;;;;65910:15:0;;;;:66;;:224;;65991:11;;65910:15;;66061:4;;66088;;66108:15;;65910:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65553:589;;:::o;15435:610::-;-1:-1:-1;;;;;15575:20:0;;15567:70;;;;-1:-1:-1;;;15567:70:0;;13760:2:1;15567:70:0;;;13742:21:1;13799:2;13779:18;;;13772:30;13838:34;13818:18;;;13811:62;-1:-1:-1;;;13889:18:1;;;13882:35;13934:19;;15567:70:0;13732:227:1;15567:70:0;-1:-1:-1;;;;;15656:23:0;;15648:71;;;;-1:-1:-1;;;15648:71:0;;9593:2:1;15648:71:0;;;9575:21:1;9632:2;9612:18;;;9605:30;9671:34;9651:18;;;9644:62;-1:-1:-1;;;9722:18:1;;;9715:33;9765:19;;15648:71:0;9565:225:1;15648:71:0;15812:108;15848:6;15812:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15812:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;15792:17:0;;;:9;:17;;;;;;;;;;;:128;;;;15954:20;;;;;;;:32;;15979:6;15954:24;:32::i;:::-;-1:-1:-1;;;;;15931:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;16002:35;16826:25:1;;;15931:20:0;;16002:35;;;;;;16799:18:1;16002:35:0;16781:76:1;64622:923:0;64732:12;64747:13;:6;64758:1;64747:10;:13::i;:::-;64732:28;-1:-1:-1;64771:17:0;64791:16;:6;64732:28;64791:10;:16::i;:::-;64771:36;-1:-1:-1;65110:21:0;65176:22;65193:4;65176:16;:22::i;:::-;65329:18;65350:41;:21;65376:14;65350:25;:41::i;:::-;65329:62;;65441:35;65454:9;65465:10;65441:12;:35::i;:::-;65494:43;;;18685:25:1;;;18741:2;18726:18;;18719:34;;;18769:18;;;18762:34;;;65494:43:0;;18673:2:1;18658:18;65494:43:0;;;;;;;64622:923;;;;;:::o;66936:521::-;67116:15;;67084:62;;67101:4;;-1:-1:-1;;;;;67116:15:0;67134:11;67084:8;:62::i;:::-;67189:15;;67393;;67189:260;;;;;67261:4;67189:260;;;7790:34:1;7840:18;;;7833:34;;;67189:15:0;7883:18:1;;;7876:34;;;7926:18;;;7919:34;-1:-1:-1;;;;;67393:15:0;;;7969:19:1;;;7962:44;67423:15:0;8022:19:1;;;8015:35;67189:15:0;;;:31;;67228:9;;7701:19:1;;67189:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:257:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;812:398::-;880:6;888;941:2;929:9;920:7;916:23;912:32;909:2;;;962:6;954;947:22;909:2;1006:9;993:23;1025:31;1050:5;1025:31;:::i;:::-;1075:5;-1:-1:-1;1132:2:1;1117:18;;1104:32;1145:33;1104:32;1145:33;:::i;:::-;1197:7;1187:17;;;899:311;;;;;:::o;1215:466::-;1292:6;1300;1308;1361:2;1349:9;1340:7;1336:23;1332:32;1329:2;;;1382:6;1374;1367:22;1329:2;1426:9;1413:23;1445:31;1470:5;1445:31;:::i;:::-;1495:5;-1:-1:-1;1552:2:1;1537:18;;1524:32;1565:33;1524:32;1565:33;:::i;:::-;1319:362;;1617:7;;-1:-1:-1;;;1671:2:1;1656:18;;;;1643:32;;1319:362::o;1686:392::-;1751:6;1759;1812:2;1800:9;1791:7;1787:23;1783:32;1780:2;;;1833:6;1825;1818:22;1780:2;1877:9;1864:23;1896:31;1921:5;1896:31;:::i;:::-;1946:5;-1:-1:-1;2003:2:1;1988:18;;1975:32;2016:30;1975:32;2016:30;:::i;2083:567::-;2196:6;2204;2212;2220;2228;2236;2289:3;2277:9;2268:7;2264:23;2260:33;2257:2;;;2311:6;2303;2296:22;2257:2;2348:9;2342:16;2367:31;2392:5;2367:31;:::i;:::-;2462:2;2447:18;;2441:25;2506:2;2491:18;;2485:25;2550:2;2535:18;;2529:25;2594:3;2579:19;;2573:26;2639:3;2624:19;;;2618:26;2417:5;;2441:25;;-1:-1:-1;2485:25:1;;2529;;-1:-1:-1;2573:26:1;-1:-1:-1;2618:26:1;;-1:-1:-1;2247:403:1;-1:-1:-1;;;2247:403:1:o;2655:325::-;2723:6;2731;2784:2;2772:9;2763:7;2759:23;2755:32;2752:2;;;2805:6;2797;2790:22;2752:2;2849:9;2836:23;2868:31;2893:5;2868:31;:::i;:::-;2918:5;2970:2;2955:18;;;;2942:32;;-1:-1:-1;;;2742:238:1:o;2985:251::-;3041:6;3094:2;3082:9;3073:7;3069:23;3065:32;3062:2;;;3115:6;3107;3100:22;3062:2;3159:9;3146:23;3178:28;3200:5;3178:28;:::i;3241:255::-;3308:6;3361:2;3349:9;3340:7;3336:23;3332:32;3329:2;;;3382:6;3374;3367:22;3329:2;3419:9;3413:16;3438:28;3460:5;3438:28;:::i;3501:190::-;3560:6;3613:2;3601:9;3592:7;3588:23;3584:32;3581:2;;;3634:6;3626;3619:22;3581:2;-1:-1:-1;3662:23:1;;3571:120;-1:-1:-1;3571:120:1:o;3696:194::-;3766:6;3819:2;3807:9;3798:7;3794:23;3790:32;3787:2;;;3840:6;3832;3825:22;3787:2;-1:-1:-1;3868:16:1;;3777:113;-1:-1:-1;3777:113:1:o;3895:258::-;3963:6;3971;4024:2;4012:9;4003:7;3999:23;3995:32;3992:2;;;4045:6;4037;4030:22;3992:2;-1:-1:-1;;4073:23:1;;;4143:2;4128:18;;;4115:32;;-1:-1:-1;3982:171:1:o;4158:316::-;4246:6;4254;4262;4315:2;4303:9;4294:7;4290:23;4286:32;4283:2;;;4336:6;4328;4321:22;4283:2;4370:9;4364:16;4354:26;;4420:2;4409:9;4405:18;4399:25;4389:35;;4464:2;4453:9;4449:18;4443:25;4433:35;;4273:201;;;;;:::o;4479:395::-;4565:6;4573;4581;4589;4642:3;4630:9;4621:7;4617:23;4613:33;4610:2;;;4664:6;4656;4649:22;4610:2;-1:-1:-1;;4692:23:1;;;4762:2;4747:18;;4734:32;;-1:-1:-1;4813:2:1;4798:18;;4785:32;;4864:2;4849:18;4836:32;;-1:-1:-1;4600:274:1;-1:-1:-1;4600:274:1:o;8783:603::-;8895:4;8924:2;8953;8942:9;8935:21;8985:6;8979:13;9028:6;9023:2;9012:9;9008:18;9001:34;9053:4;9066:140;9080:6;9077:1;9074:13;9066:140;;;9175:14;;;9171:23;;9165:30;9141:17;;;9160:2;9137:26;9130:66;9095:10;;9066:140;;;9224:6;9221:1;9218:13;9215:2;;;9294:4;9289:2;9280:6;9269:9;9265:22;9261:31;9254:45;9215:2;-1:-1:-1;9370:2:1;9349:15;-1:-1:-1;;9345:29:1;9330:45;;;;9377:2;9326:54;;8904:482;-1:-1:-1;;;8904:482:1:o;16862:1029::-;17124:4;17172:3;17161:9;17157:19;17203:6;17192:9;17185:25;17229:2;17267:6;17262:2;17251:9;17247:18;17240:34;17310:3;17305:2;17294:9;17290:18;17283:31;17334:6;17369;17363:13;17400:6;17392;17385:22;17438:3;17427:9;17423:19;17416:26;;17477:2;17469:6;17465:15;17451:29;;17498:4;17511:218;17525:6;17522:1;17519:13;17511:218;;;17590:13;;-1:-1:-1;;;;;17586:62:1;17574:75;;17704:15;;;;17669:12;;;;17547:1;17540:9;17511:218;;;-1:-1:-1;;;;;;;17785:55:1;;;;17780:2;17765:18;;17758:83;-1:-1:-1;;;17872:3:1;17857:19;17850:35;17746:3;17133:758;-1:-1:-1;;;17133:758:1:o;19392:128::-;19432:3;19463:1;19459:6;19456:1;19453:13;19450:2;;;19469:18;;:::i;:::-;-1:-1:-1;19505:9:1;;19440:80::o;19525:274::-;19565:1;19591;19581:2;;-1:-1:-1;;;19623:1:1;19616:88;19727:4;19724:1;19717:15;19755:4;19752:1;19745:15;19581:2;-1:-1:-1;19784:9:1;;19571:228::o;19804:168::-;19844:7;19910:1;19906;19902:6;19898:14;19895:1;19892:21;19887:1;19880:9;19873:17;19869:45;19866:2;;;19917:18;;:::i;:::-;-1:-1:-1;19957:9:1;;19856:116::o;19977:125::-;20017:4;20045:1;20042;20039:8;20036:2;;;20050:18;;:::i;:::-;-1:-1:-1;20087:9:1;;20026:76::o;20107:437::-;20186:1;20182:12;;;;20229;;;20250:2;;20304:4;20296:6;20292:17;20282:27;;20250:2;20357;20349:6;20346:14;20326:18;20323:38;20320:2;;;-1:-1:-1;;;20391:1:1;20384:88;20495:4;20492:1;20485:15;20523:4;20520:1;20513:15;20320:2;;20162:382;;;:::o;20549:184::-;-1:-1:-1;;;20598:1:1;20591:88;20698:4;20695:1;20688:15;20722:4;20719:1;20712:15;20738:154;-1:-1:-1;;;;;20817:5:1;20813:54;20806:5;20803:65;20793:2;;20882:1;20879;20872:12;20897:118;20983:5;20976:13;20969:21;20962:5;20959:32;20949:2;;21005:1;21002;20995:12

Swarm Source

ipfs://2219e5202a11e36a127b99c0a4695c7c7aa41519c3b705d9b43d39d2c82bda50
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.