ETH Price: $3,468.31 (-5.62%)
 

Overview

Max Total Supply

1,000,000,000,000 SHIVA

Holders

79 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Shiva Finance: SHIVA Token
Balance
672,013,206.576799317473717086 SHIVA

Value
$0.00
0xaf3abe3625f1014d6a243e85e22d63cd8f73cfa4
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Shiva Finance is a token based on the Ethereum network that benefits holders with reflections. Earn ETH just for holding the token.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SHIVA

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-18
*/

/**
███████╗██╗  ██╗██╗██╗   ██╗ █████╗ 
██╔════╝██║  ██║██║██║   ██║██╔══██╗
███████╗███████║██║██║   ██║███████║
╚════██║██╔══██║██║╚██╗ ██╔╝██╔══██║
███████║██║  ██║██║ ╚████╔╝ ██║  ██║
╚══════╝╚═╝  ╚═╝╚═╝  ╚═══╝  ╚═╝  ╚═╝
                                  
Telegram: https://t.me/Shiva_Finance
Twitter: https://twitter.com/0xShivaFinance
Website: https://shiva.finance
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.17;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

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

    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(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SignedSafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SignedSafeMath {
    /**
     * @dev Returns the multiplication of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two signed integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        return a / b;
    }

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

    /**
     * @dev Returns the addition of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        return a + b;
    }
}

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // 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 (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @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) {
        return a + b;
    }

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

    /**
     * @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) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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 a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

/**
 * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
 * checks.
 *
 * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
 * easily result in undesired exploitation or bugs, since developers usually
 * assume that overflows raise errors. `SafeCast` restores this intuition by
 * reverting the transaction when such an operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
 * all math on `uint256` and `int256` and then downcasting.
 */
library SafeCast {
    /**
     * @dev Returns the downcasted uint224 from uint256, reverting on
     * overflow (when the input is greater than largest uint224).
     *
     * Counterpart to Solidity's `uint224` operator.
     *
     * Requirements:
     *
     * - input must fit into 224 bits
     */
    function toUint224(uint256 value) internal pure returns (uint224) {
        require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits");
        return uint224(value);
    }

    /**
     * @dev Returns the downcasted uint128 from uint256, reverting on
     * overflow (when the input is greater than largest uint128).
     *
     * Counterpart to Solidity's `uint128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     */
    function toUint128(uint256 value) internal pure returns (uint128) {
        require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits");
        return uint128(value);
    }

    /**
     * @dev Returns the downcasted uint96 from uint256, reverting on
     * overflow (when the input is greater than largest uint96).
     *
     * Counterpart to Solidity's `uint96` operator.
     *
     * Requirements:
     *
     * - input must fit into 96 bits
     */
    function toUint96(uint256 value) internal pure returns (uint96) {
        require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits");
        return uint96(value);
    }

    /**
     * @dev Returns the downcasted uint64 from uint256, reverting on
     * overflow (when the input is greater than largest uint64).
     *
     * Counterpart to Solidity's `uint64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     */
    function toUint64(uint256 value) internal pure returns (uint64) {
        require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits");
        return uint64(value);
    }

    /**
     * @dev Returns the downcasted uint32 from uint256, reverting on
     * overflow (when the input is greater than largest uint32).
     *
     * Counterpart to Solidity's `uint32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     */
    function toUint32(uint256 value) internal pure returns (uint32) {
        require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits");
        return uint32(value);
    }

    /**
     * @dev Returns the downcasted uint16 from uint256, reverting on
     * overflow (when the input is greater than largest uint16).
     *
     * Counterpart to Solidity's `uint16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     */
    function toUint16(uint256 value) internal pure returns (uint16) {
        require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits");
        return uint16(value);
    }

    /**
     * @dev Returns the downcasted uint8 from uint256, reverting on
     * overflow (when the input is greater than largest uint8).
     *
     * Counterpart to Solidity's `uint8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     */
    function toUint8(uint256 value) internal pure returns (uint8) {
        require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits");
        return uint8(value);
    }

    /**
     * @dev Converts a signed int256 into an unsigned uint256.
     *
     * Requirements:
     *
     * - input must be greater than or equal to 0.
     */
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    /**
     * @dev Returns the downcasted int128 from int256, reverting on
     * overflow (when the input is less than smallest int128 or
     * greater than largest int128).
     *
     * Counterpart to Solidity's `int128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     *
     * _Available since v3.1._
     */
    function toInt128(int256 value) internal pure returns (int128) {
        require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits");
        return int128(value);
    }

    /**
     * @dev Returns the downcasted int64 from int256, reverting on
     * overflow (when the input is less than smallest int64 or
     * greater than largest int64).
     *
     * Counterpart to Solidity's `int64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     *
     * _Available since v3.1._
     */
    function toInt64(int256 value) internal pure returns (int64) {
        require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits");
        return int64(value);
    }

    /**
     * @dev Returns the downcasted int32 from int256, reverting on
     * overflow (when the input is less than smallest int32 or
     * greater than largest int32).
     *
     * Counterpart to Solidity's `int32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     *
     * _Available since v3.1._
     */
    function toInt32(int256 value) internal pure returns (int32) {
        require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits");
        return int32(value);
    }

    /**
     * @dev Returns the downcasted int16 from int256, reverting on
     * overflow (when the input is less than smallest int16 or
     * greater than largest int16).
     *
     * Counterpart to Solidity's `int16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     *
     * _Available since v3.1._
     */
    function toInt16(int256 value) internal pure returns (int16) {
        require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits");
        return int16(value);
    }

    /**
     * @dev Returns the downcasted int8 from int256, reverting on
     * overflow (when the input is less than smallest int8 or
     * greater than largest int8).
     *
     * Counterpart to Solidity's `int8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     *
     * _Available since v3.1._
     */
    function toInt8(int256 value) internal pure returns (int8) {
        require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits");
        return int8(value);
    }

    /**
     * @dev Converts an unsigned uint256 into a signed int256.
     *
     * Requirements:
     *
     * - input must be less than or equal to maxInt256.
     */
    function toInt256(uint256 value) internal pure returns (int256) {
        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
        require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256");
        return int256(value);
    }
}

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

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

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `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);
}

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

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

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `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);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `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);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(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 += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

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

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



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

    function set(Map storage map, address key, uint val) public {
        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) public {
        if (!map.inserted[key]) {
            return;
        }

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

        uint index = map.indexOf[key];
        uint 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();
    }
}


/// @title Dividend-Paying Token Optional Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev OPTIONAL functions for a dividend-paying token contract.
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);
}


/// @title Dividend-Paying Token Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev An interface for a dividend-paying token contract.
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
  );
}


/// @title Dividend-Paying Token
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev A mintable ERC20 token that allows anyone to pay and distribute ether
///  to token holders as dividends and allows token holders to withdraw their dividends.
///  Reference: the source code of PoWH3D: https://etherscan.io/address/0xB3775fB83F7D12A36E0475aBdD1FCA35c091efBe#code
contract DividendPayingToken is ERC20, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface {
  using SafeMath for uint256;
  using SignedSafeMath for int256;
  using SafeCast for uint256;
  using SafeCast 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 constant internal 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 override payable {
    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 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)).toInt256()
      .add(magnifiedDividendCorrections[_owner]).toUint256() / 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).toInt256();
    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)).toInt256() );
  }

  /// @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)).toInt256() );
  }

  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 SHIVADividendTracker is DividendPayingToken, Ownable {
    using SafeMath for uint256;
    using SignedSafeMath for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping (address => bool) public excludedFromDividends;

    mapping (address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public immutable minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    constructor() DividendPayingToken("SHIVA_Dividend_Tracker", "SHIVA_Dividend_Tracker") {
        claimWait = 3600;
        minimumTokenBalanceForDividends = 10000 * (10**18); //must hold 10000+ tokens
    }

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

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

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

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

    	emit ExcludeFromDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3600 && newClaimWait <= 86400, "SHIVA_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");	
        require(newClaimWait != claimWait, "SHIVA_Dividend_Tracker: Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    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,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable) {
        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];

        nextClaimTime = lastClaimTime > 0 ?
                                    lastClaimTime.add(claimWait) :
                                    0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ?
                                                    nextClaimTime.sub(block.timestamp) :
                                                    0;
    }

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

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
    	if(lastClaimTime > block.timestamp)  {
    		return false;
    	}

    	return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

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

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

    	processAccount(account, true);
    }

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

    	if(numberOfTokenHolders == 0) {
    		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 >= tokenHoldersMap.keys.length) {
    			_lastProcessedIndex = 0;
    		}

    		address account = tokenHoldersMap.keys[_lastProcessedIndex];

    		if(canAutoClaim(lastClaimTimes[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) {
        uint256 amount = _withdrawDividendOfUser(account);

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

    	return false;
    }
}

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

    IUniswapV2Router02 public uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool private inSwapAndLiquify;

    bool public swapAndLiquifyEnabled = true;

    SHIVADividendTracker public dividendTracker;

    uint256 public maxBuyTransactionAmount = 20000000000 * (10**18);
    uint256 public swapTokensAtAmount = 500000000 * (10**18); //0.05%
    uint256 public _maxTxAmount = 20000000000 * (10**18); // 2%

    uint256 public ETHRewardsFee;
    uint256 public liquidityFee;
    uint256 public totalFees;
    uint256 public marketingFee;
    address payable public  marketingWallet;

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

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

    // 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;

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

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

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

    event SwapAndLiquifyEnabledUpdated(bool enabled);

    event SwapAndLiquify(
        uint256 tokensIntoLiqudity,
        uint256 ethReceived
    );

    event SendDividends(
    	uint256 tokensSwapped,
    	uint256 amount
    );

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

    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    function setFee(uint256 newFee, uint256 liqFee) public onlyOwner {
        require(newFee + liqFee <= 70 , "The fee must be 7% or less.");
        ETHRewardsFee = newFee/2;
        marketingFee = newFee/2;
        liquidityFee = liqFee;
        totalFees = ETHRewardsFee.add(liquidityFee).add(marketingFee);

    }

    function setMaxBuyTx(uint256 _maxBuyPercent) public onlyOwner {
        require(_maxBuyPercent >= 1, "The max buy must be 1% or more.");
        maxBuyTransactionAmount = totalSupply().mul(_maxBuyPercent).div(
            10**2
        );
    }

    function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner() {
        require(maxTxPercent >= 1, "The max buy must be 1% or more.");
        _maxTxAmount = totalSupply().mul(maxTxPercent).div(
            10**2
        );
    }
    
    function setMarketingWallet(address payable _newMarketingWallet) public onlyOwner {
        marketingWallet = _newMarketingWallet;
    }

    constructor() ERC20("Shiva Finance", "SHIVA") {
        ETHRewardsFee = 24;
        liquidityFee = 1;
        marketingFee = 24;
        marketingWallet = payable(0x13D5A318A8Ab7F17169b0b3ab9843B95bd1eFa77);

        totalFees = ETHRewardsFee.add(liquidityFee).add(marketingFee); // total fee transfer and buy

    	dividendTracker = new SHIVADividendTracker();

    	IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
         // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

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

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(marketingWallet, true);
        excludeFromFees(address(this), true);
        
        // exclude from max tx
        _isExcludedFromMaxTx[owner()] = true;
        _isExcludedFromMaxTx[address(this)] = true;
        _isExcludedFromMaxTx[marketingWallet] = true;
        

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), 1000000000000 * (10**18));
    }

    receive() external payable {

  	}

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "SHIVA: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(_isExcludedFromFees[account] != excluded, "SHIVA: Account has already the value of 'excluded'");
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }
    
    function setExcludeFromMaxTx(address _address, bool value) public onlyOwner { 
        _isExcludedFromMaxTx[_address] = value;
    }

    function setExcludeFromAll(address _address) public onlyOwner {
        _isExcludedFromMaxTx[_address] = true;
        _isExcludedFromFees[_address] = true;
        dividendTracker.excludeFromDividends(_address);
    }

    function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) public onlyOwner {
        for(uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = excluded;
        }

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "SHIVA: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }
     
    function setSwapTokensAtAmount(uint256 _newAmount) public onlyOwner {
        swapTokensAtAmount = _newAmount;
    }

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

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200000 && newValue <= 500000, "SHIVA: gasForProcessing must be between 200,000 and 500,000");
        require(newValue != gasForProcessing, "SHIVA: Cannot update gasForProcessing to same value");
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function updateClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }

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

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

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    function isExcludedFromMaxTx(address account) public view returns(bool) {
        return _isExcludedFromMaxTx[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,
            uint256,
            uint256) {
        return dividendTracker.getAccount(account);
    }

	function getAccountDividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            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();
    }

//this will be used to exclude from dividends the presale smart contract address
    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

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

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

        if(automatedMarketMakerPairs[from] && (!_isExcludedFromMaxTx[from]) && (!_isExcludedFromMaxTx[to])){
            require(amount <= maxBuyTransactionAmount, "Sell transfer amount exceeds the maxBuyTransactionAmount.");
        }

    	uint256 contractTokenBalance = balanceOf(address(this));
        
        bool overMinTokenBalance = contractTokenBalance >= swapTokensAtAmount;
       
        if(
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            !automatedMarketMakerPairs[from] && 
            swapAndLiquifyEnabled
        ) {
            swapAndLiquify(contractTokenBalance);
        }

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(!_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
        	uint256 fees = (amount*totalFees)/1000;
        	amount = amount-fees;
            super._transfer(from, address(this), fees); // get total fee first
        }

        super._transfer(from, to, amount);

        try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}

        if(!inSwapAndLiquify) {
	    	uint256 gas = gasForProcessing;

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

	    	}
        }
    }

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        // take liquidity fee, keep a half token
        // halfLiquidityToken = totalAmount * (liquidityFee/2totalFee)
        uint256 tokensToAddLiquidityWith = contractTokenBalance.div(totalFees.mul(2)).mul(liquidityFee);
        // swap the remaining to BNB
        uint256 toSwap = contractTokenBalance-tokensToAddLiquidityWith;
        // 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(toSwap, address(this)); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        uint256 deltaBalance = address(this).balance-initialBalance;

        // take worthy amount bnb to add liquidity
        // worthyBNB = deltaBalance * liquidity/(2totalFees - liquidityFee)
        uint256 bnbToAddLiquidityWith = deltaBalance.mul(liquidityFee).div(totalFees.mul(2).sub(liquidityFee));
        
        // add liquidity to uniswap
        addLiquidity(tokensToAddLiquidityWith, bnbToAddLiquidityWith);
        // worthy marketing fee
        uint256 marketingAmount = deltaBalance.sub(bnbToAddLiquidityWith).div(totalFees.sub(liquidityFee)).mul(marketingFee);
        marketingWallet.transfer(marketingAmount);

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

        if(success) {
   	 		emit SendDividends(toSwap-tokensToAddLiquidityWith, dividends);
        }
        
        emit SwapAndLiquify(tokensToAddLiquidityWith, deltaBalance);
    }

    function swapTokensForEth(uint256 tokenAmount, address _to) private {

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

        if(allowance(address(this), address(uniswapV2Router)) < tokenAmount) {
          _approve(address(this), address(uniswapV2Router), ~uint256(0));
        }

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

    function swapAndSendEthToMarketing(uint256 tokenAmount) private {
        swapTokensForEth(tokenAmount, marketingWallet);
    }
    

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

    function withdrawStuckEth() external onlyOwner{
        require (address(this).balance > 0, "Can't withdraw negative or zero");
        payable(owner()).transfer(address(this).balance);
    }

    function removeStuckToken(address _address) external onlyOwner {
        require(_address != address(this), "Can't withdraw tokens destined for liquidity");
        require(IERC20(_address).balanceOf(address(this)) > 0, "Can't withdraw 0");

        IERC20(_address).transfer(owner(), IERC20(_address).balanceOf(address(this)));
    }
    
}

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":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","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":"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":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"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":"uint256","name":"tokensIntoLiqudity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"ETHRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","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":"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 SHIVADividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","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"},{"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"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"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":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxTx","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":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTransactionAmount","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":"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":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeStuckToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"address","name":"_address","type":"address"}],"name":"setExcludeFromAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExcludeFromMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"},{"internalType":"uint256","name":"liqFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newMarketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBuyPercent","type":"uint256"}],"name":"setMaxBuyTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","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":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckEth","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"}]

60a06040526006805460ff60a81b1916600160a81b1790556b409f9cbc7c4a04c22000000060088190556b019d971e4fe8401e74000000600955600a55620493e06010553480156200005057600080fd5b506040518060400160405280600d81526020016c53686976612046696e616e636560981b81525060405180604001604052806005815260200164534849564160d81b8152508160039081620000a6919062000ae0565b506004620000b5828262000ae0565b505050620000d2620000cc6200061860201b60201c565b6200061c565b6018600b8190556001600c819055600e829055600f80547313d5a318a8ab7f17169b0b3ab9843b95bd1efa776001600160a01b03199091161790556200014091906200012c9082906200066e602090811b62001f1917901c565b6200066e60201b62001f191790919060201c565b600d55604051620001519062000a2e565b604051809103906000f0801580156200016e573d6000803e3d6000fd5b50600760006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000215919062000bac565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000263573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000289919062000bac565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002fd919062000bac565b600680546001600160a01b0319166001600160a01b0385811691909117909155811660805290506200033181600162000685565b60075460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200037857600080fd5b505af11580156200038d573d6000803e3d6000fd5b505060075460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620003d757600080fd5b505af1158015620003ec573d6000803e3d6000fd5b50506007546001600160a01b031691506331e79db09050620004166005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200045857600080fd5b505af11580156200046d573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015620004b957600080fd5b505af1158015620004ce573d6000803e3d6000fd5b505060075460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200051a57600080fd5b505af11580156200052f573d6000803e3d6000fd5b505050506200054f62000547620007ed60201b60201c565b6001620007fc565b600f5462000568906001600160a01b03166001620007fc565b62000575306001620007fc565b6001601260006200058e6005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526012909352818320805485166001908117909155600f5490911683529120805490921617905562000610620005fc6005546001600160a01b031690565b6c0c9f2c9cd04674edea4000000062000944565b505062000c00565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006200067c828462000bde565b90505b92915050565b6001600160a01b03821660009081526013602052604090205481151560ff909116151503620007215760405162461bcd60e51b815260206004820152603f60248201527f53484956413a204175746f6d61746564206d61726b6574206d616b657220706160448201527f697220697320616c72656164792073657420746f20746861742076616c75650060648201526084015b60405180910390fd5b6001600160a01b0382166000908152601360205260409020805460ff19168215801591909117909155620007b15760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200079757600080fd5b505af1158015620007ac573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6005546001600160a01b03163314620008585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000718565b6001600160a01b03821660009081526011602052604090205481151560ff909116151503620008e55760405162461bcd60e51b815260206004820152603260248201527f53484956413a204163636f756e742068617320616c7265616479207468652076604482015271616c7565206f6620276578636c756465642760701b606482015260840162000718565b6001600160a01b038216600081815260116020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166200099c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000718565b8060026000828254620009b0919062000bde565b90915550506001600160a01b03821660009081526020819052604081208054839290620009df90849062000bde565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b6122108062003dc983390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000a6757607f821691505b60208210810362000a8857634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a2957600081815260208120601f850160051c8101602086101562000ab75750805b601f850160051c820191505b8181101562000ad85782815560010162000ac3565b505050505050565b81516001600160401b0381111562000afc5762000afc62000a3c565b62000b148162000b0d845462000a52565b8462000a8e565b602080601f83116001811462000b4c576000841562000b335750858301515b600019600386901b1c1916600185901b17855562000ad8565b600085815260208120601f198616915b8281101562000b7d5788860151825594840194600190910190840162000b5c565b508582101562000b9c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000bbf57600080fd5b81516001600160a01b038116811462000bd757600080fd5b9392505050565b808201808211156200067f57634e487b7160e01b600052601160045260246000fd5b6080516131a662000c2360003960008181610537015261150701526131a66000f3fe60806040526004361061037a5760003560e01c806375f0a874116101d1578063a946163011610102578063d543dbeb116100a0578063e7841ec01161006f578063e7841ec014610a93578063e98030c714610aa8578063f27fd25414610ac8578063f2fde38b14610ae857600080fd5b8063d543dbeb146109f7578063dd62ed3e14610a17578063e083e92214610a5d578063e2f4560514610a7d57600080fd5b8063b62496f5116100dc578063b62496f514610967578063c024666814610997578063c492f046146109b7578063c49b9a80146109d757600080fd5b8063a9461630146108c2578063ad56c13c146108e2578063afa4f3b21461094757600080fd5b806398118cb41161016f578063a26579ad11610149578063a26579ad1461084d578063a457c2d714610862578063a8b9d24014610882578063a9059cbb146108a257600080fd5b806398118cb4146108015780639a7a23d6146108175780639c1b8af51461083757600080fd5b8063871c128d116101ab578063871c128d146107985780638c0344db146107b85780638da5cb5b146107ce57806395d89b41146107ec57600080fd5b806375f0a8741461074d5780637d1db4a51461076d5780637fa787ba1461078357600080fd5b80634e71d92d116102ab578063658c27a9116102495780636b67c4df116102235780636b67c4df146106cc578063700bb191146106e257806370a0823114610702578063715018a61461073857600080fd5b8063658c27a91461065357806365b8dbc01461068c5780636843cd84146106ac57600080fd5b80635aa821a9116102855780635aa821a9146105e85780635b89029c146105fe5780635d098b381461061e57806364b0f6531461063e57600080fd5b80634e71d92d1461057a5780634fbee1931461058f57806352f7c988146105c857600080fd5b806330bb4cff1161031857806339509351116102f257806339509351146104e557806349928a501461050557806349bd5a5e146105255780634a74bb021461055957600080fd5b806330bb4cff14610492578063313ce567146104a757806331e79db0146104c357600080fd5b80631694505e116103545780631694505e1461040557806318160ddd1461043d57806323b872dd146104525780632c1f52161461047257600080fd5b806306fdde0314610386578063095ea7b3146103b157806313114a9d146103e157600080fd5b3661038157005b600080fd5b34801561039257600080fd5b5061039b610b08565b6040516103a89190612be0565b60405180910390f35b3480156103bd57600080fd5b506103d16103cc366004612c43565b610b9a565b60405190151581526020016103a8565b3480156103ed57600080fd5b506103f7600d5481565b6040519081526020016103a8565b34801561041157600080fd5b50600654610425906001600160a01b031681565b6040516001600160a01b0390911681526020016103a8565b34801561044957600080fd5b506002546103f7565b34801561045e57600080fd5b506103d161046d366004612c6f565b610bb1565b34801561047e57600080fd5b50600754610425906001600160a01b031681565b34801561049e57600080fd5b506103f7610c60565b3480156104b357600080fd5b50604051601281526020016103a8565b3480156104cf57600080fd5b506104e36104de366004612cb0565b610cd3565b005b3480156104f157600080fd5b506103d1610500366004612c43565b610d60565b34801561051157600080fd5b506104e3610520366004612cb0565b610d9c565b34801561053157600080fd5b506104257f000000000000000000000000000000000000000000000000000000000000000081565b34801561056557600080fd5b506006546103d190600160a81b900460ff1681565b34801561058657600080fd5b506104e3610e2d565b34801561059b57600080fd5b506103d16105aa366004612cb0565b6001600160a01b031660009081526011602052604090205460ff1690565b3480156105d457600080fd5b506104e36105e3366004612ccd565b610ea5565b3480156105f457600080fd5b506103f760085481565b34801561060a57600080fd5b506104e3610619366004612cfd565b610f6b565b34801561062a57600080fd5b506104e3610639366004612cb0565b610fc0565b34801561064a57600080fd5b506103f761100c565b34801561065f57600080fd5b506103d161066e366004612cb0565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561069857600080fd5b506104e36106a7366004612cb0565b611056565b3480156106b857600080fd5b506103f76106c7366004612cb0565b61114e565b3480156106d857600080fd5b506103f7600e5481565b3480156106ee57600080fd5b506104e36106fd366004612d36565b6111be565b34801561070e57600080fd5b506103f761071d366004612cb0565b6001600160a01b031660009081526020819052604090205490565b34801561074457600080fd5b506104e3611291565b34801561075957600080fd5b50600f54610425906001600160a01b031681565b34801561077957600080fd5b506103f7600a5481565b34801561078f57600080fd5b506104e36112c7565b3480156107a457600080fd5b506104e36107b3366004612d36565b61137a565b3480156107c457600080fd5b506103f7600b5481565b3480156107da57600080fd5b506005546001600160a01b0316610425565b3480156107f857600080fd5b5061039b6114cc565b34801561080d57600080fd5b506103f7600c5481565b34801561082357600080fd5b506104e3610832366004612cfd565b6114db565b34801561084357600080fd5b506103f760105481565b34801561085957600080fd5b506103f76115cf565b34801561086e57600080fd5b506103d161087d366004612c43565b611619565b34801561088e57600080fd5b506103f761089d366004612cb0565b6116b2565b3480156108ae57600080fd5b506103d16108bd366004612c43565b6116e5565b3480156108ce57600080fd5b506104e36108dd366004612d36565b6116f2565b3480156108ee57600080fd5b506109026108fd366004612cb0565b611791565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016103a8565b34801561095357600080fd5b506104e3610962366004612d36565b61182c565b34801561097357600080fd5b506103d1610982366004612cb0565b60136020526000908152604090205460ff1681565b3480156109a357600080fd5b506104e36109b2366004612cfd565b61185b565b3480156109c357600080fd5b506104e36109d2366004612d4f565b61196f565b3480156109e357600080fd5b506104e36109f2366004612dd5565b611a4b565b348015610a0357600080fd5b506104e3610a12366004612d36565b611acd565b348015610a2357600080fd5b506103f7610a32366004612df2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a6957600080fd5b506104e3610a78366004612cb0565b611b60565b348015610a8957600080fd5b506103f760095481565b348015610a9f57600080fd5b506103f7611d9a565b348015610ab457600080fd5b506104e3610ac3366004612d36565b611de4565b348015610ad457600080fd5b50610902610ae3366004612d36565b611e3f565b348015610af457600080fd5b506104e3610b03366004612cb0565b611e81565b606060038054610b1790612e20565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4390612e20565b8015610b905780601f10610b6557610100808354040283529160200191610b90565b820191906000526020600020905b815481529060010190602001808311610b7357829003601f168201915b5050505050905090565b6000610ba7338484611f2c565b5060015b92915050565b6000610bbe848484612050565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610c485760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b610c558533858403611f2c565b506001949350505050565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610caa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cce9190612e5a565b905090565b6005546001600160a01b03163314610cfd5760405162461bcd60e51b8152600401610c3f90612e73565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610d4557600080fd5b505af1158015610d59573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610ba7918590610d97908690612ebe565b611f2c565b6005546001600160a01b03163314610dc65760405162461bcd60e51b8152600401610c3f90612e73565b6001600160a01b0381811660008181526012602090815260408083208054600160ff19918216811790925560119093529281902080549092169092179055600754905163031e79db60e41b81526004810192909252909116906331e79db090602401610d2b565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea29190612ed1565b50565b6005546001600160a01b03163314610ecf5760405162461bcd60e51b8152600401610c3f90612e73565b6046610edb8284612ebe565b1115610f295760405162461bcd60e51b815260206004820152601b60248201527f54686520666565206d757374206265203725206f72206c6573732e00000000006044820152606401610c3f565b610f34600283612eee565b600b55610f42600283612eee565b600e819055600c829055600b54610f649190610f5e9084611f19565b90611f19565b600d555050565b6005546001600160a01b03163314610f955760405162461bcd60e51b8152600401610c3f90612e73565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610fea5760405162461bcd60e51b8152600401610c3f90612e73565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610caa573d6000803e3d6000fd5b6005546001600160a01b031633146110805760405162461bcd60e51b8152600401610c3f90612e73565b6006546001600160a01b03908116908216036110f15760405162461bcd60e51b815260206004820152602a60248201527f53484956413a2054686520726f7574657220616c7265616479206861732074686044820152696174206164647265737360b01b6064820152608401610c3f565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561119a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bab9190612e5a565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611211573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112359190612f10565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98906080015b60405180910390a350505050565b6005546001600160a01b031633146112bb5760405162461bcd60e51b8152600401610c3f90612e73565b6112c56000612486565b565b6005546001600160a01b031633146112f15760405162461bcd60e51b8152600401610c3f90612e73565b600047116113415760405162461bcd60e51b815260206004820152601f60248201527f43616e2774207769746864726177206e65676174697665206f72207a65726f006044820152606401610c3f565b6005546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610ea2573d6000803e3d6000fd5b6005546001600160a01b031633146113a45760405162461bcd60e51b8152600401610c3f90612e73565b62030d4081101580156113ba57506207a1208111155b61142c5760405162461bcd60e51b815260206004820152603b60248201527f53484956413a20676173466f7250726f63657373696e67206d7573742062652060448201527f6265747765656e203230302c30303020616e64203530302c30303000000000006064820152608401610c3f565b60105481036114995760405162461bcd60e51b815260206004820152603360248201527f53484956413a2043616e6e6f742075706461746520676173466f7250726f63656044820152727373696e6720746f2073616d652076616c756560681b6064820152608401610c3f565b60105460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601055565b606060048054610b1790612e20565b6005546001600160a01b031633146115055760405162461bcd60e51b8152600401610c3f90612e73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036115c15760405162461bcd60e51b815260206004820152604c60248201527f53484956413a205468652050616e63616b655377617020706169722063616e6e60448201527f6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b60648201526b65744d616b6572506169727360a01b608482015260a401610c3f565b6115cb82826124d8565b5050565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015610caa573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561169b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c3f565b6116a83385858403611f2c565b5060019392505050565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161117d565b6000610ba7338484612050565b6005546001600160a01b0316331461171c5760405162461bcd60e51b8152600401610c3f90612e73565b600181101561176d5760405162461bcd60e51b815260206004820152601f60248201527f546865206d617820627579206d757374206265203125206f72206d6f72652e006044820152606401610c3f565b61178b60646117858361177f60025490565b90612637565b90612643565b60085550565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa1580156117ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118119190612f3e565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146118565760405162461bcd60e51b8152600401610c3f90612e73565b600955565b6005546001600160a01b031633146118855760405162461bcd60e51b8152600401610c3f90612e73565b6001600160a01b03821660009081526011602052604090205481151560ff9091161515036119105760405162461bcd60e51b815260206004820152603260248201527f53484956413a204163636f756e742068617320616c7265616479207468652076604482015271616c7565206f6620276578636c756465642760701b6064820152608401610c3f565b6001600160a01b038216600081815260116020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146119995760405162461bcd60e51b8152600401610c3f90612e73565b60005b82811015611a0a5781601160008686858181106119bb576119bb612fa8565b90506020020160208101906119d09190612cb0565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a0281612fbe565b91505061199c565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051611a3e93929190612fd7565b60405180910390a1505050565b6005546001600160a01b03163314611a755760405162461bcd60e51b8152600401610c3f90612e73565b60068054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611ac290831515815260200190565b60405180910390a150565b6005546001600160a01b03163314611af75760405162461bcd60e51b8152600401610c3f90612e73565b6001811015611b485760405162461bcd60e51b815260206004820152601f60248201527f546865206d617820627579206d757374206265203125206f72206d6f72652e006044820152606401610c3f565b611b5a60646117858361177f60025490565b600a5550565b6005546001600160a01b03163314611b8a5760405162461bcd60e51b8152600401610c3f90612e73565b306001600160a01b03821603611bf75760405162461bcd60e51b815260206004820152602c60248201527f43616e277420776974686472617720746f6b656e732064657374696e6564206660448201526b6f72206c697175696469747960a01b6064820152608401610c3f565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c629190612e5a565b11611ca25760405162461bcd60e51b815260206004820152601060248201526f043616e277420776974686472617720360841b6044820152606401610c3f565b806001600160a01b031663a9059cbb611cc36005546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015611d07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2b9190612e5a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611d76573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cb9190612ed1565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015610caa573d6000803e3d6000fd5b6005546001600160a01b03163314611e0e5760405162461bcd60e51b8152600401610c3f90612e73565b60075460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610d2b565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016117cf565b6005546001600160a01b03163314611eab5760405162461bcd60e51b8152600401610c3f90612e73565b6001600160a01b038116611f105760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c3f565b610ea281612486565b6000611f258284612ebe565b9392505050565b6001600160a01b038316611f8e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c3f565b6001600160a01b038216611fef5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c3f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166120765760405162461bcd60e51b8152600401610c3f90613030565b6001600160a01b03821661209c5760405162461bcd60e51b8152600401610c3f90613075565b806000036120b5576120b08383600061264f565b505050565b6001600160a01b03831660009081526013602052604090205460ff1680156120f657506001600160a01b03831660009081526012602052604090205460ff16155b801561211b57506001600160a01b03821660009081526012602052604090205460ff16155b15612198576008548111156121985760405162461bcd60e51b815260206004820152603960248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d61784275795472616e73616374696f6e416d6f756e742e000000000000006064820152608401610c3f565b30600090815260208190526040902054600954811080159081906121c65750600654600160a01b900460ff16155b80156121eb57506001600160a01b03851660009081526013602052604090205460ff16155b80156122005750600654600160a81b900460ff165b1561220e5761220e82612796565b6001600160a01b03851660009081526011602052604090205460ff1615801561225057506001600160a01b03841660009081526011602052604090205460ff16155b1561228d5760006103e8600d548561226891906130b8565b6122729190612eee565b905061227e81856130cf565b935061228b86308361264f565b505b61229885858561264f565b6007546001600160a01b031663e30443bc866122c9816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561230f57600080fd5b505af1925050508015612320575060015b506007546001600160a01b031663e30443bc85612352816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561239857600080fd5b505af19250505080156123a9575060015b50600654600160a01b900460ff16610d59576010546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015612428575060408051601f3d908101601f1916820190925261242591810190612f10565b60015b1561247e5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526013602052604090205481151560ff90911615150361256e5760405162461bcd60e51b815260206004820152603f60248201527f53484956413a204175746f6d61746564206d61726b6574206d616b657220706160448201527f697220697320616c72656164792073657420746f20746861742076616c7565006064820152608401610c3f565b6001600160a01b0382166000908152601360205260409020805460ff191682158015919091179091556125fb5760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156125e257600080fd5b505af11580156125f6573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000611f2582846130b8565b6000611f258284612eee565b6001600160a01b0383166126755760405162461bcd60e51b8152600401610c3f90613030565b6001600160a01b03821661269b5760405162461bcd60e51b8152600401610c3f90613075565b6001600160a01b038316600090815260208190526040902054818110156127135760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c3f565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061274a908490612ebe565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161128391815260200190565b6006805460ff60a01b1916600160a01b179055600c54600d546000916127cc9161177f906127c5906002612637565b8590612643565b905060006127da82846130cf565b9050476127e78230612992565b60006127f382476130cf565b9050600061282a61281c600c546128166002600d5461263790919063ffffffff16565b90612b1e565b600c54611785908590612637565b90506128368582612b2a565b6000612862600e5461177f612858600c54600d54612b1e90919063ffffffff16565b6117858787612b1e565b600f546040519192506001600160a01b03169082156108fc029083906000818181858888f1935050505015801561289d573d6000803e3d6000fd5b5060075460405147916000916001600160a01b039091169083908381818185875af1925050503d80600081146128ef576040519150601f19603f3d011682016040523d82523d6000602084013e6128f4565b606091505b505090508015612941577f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc361292989896130cf565b60408051918252602082018590520160405180910390a15b60408051898152602081018790527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f8381486910160405180910390a150506006805460ff60a01b1916905550505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106129c7576129c7612fa8565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4491906130e2565b81600181518110612a5757612a57612fa8565b6001600160a01b0392831660209182029290920181019190915260065430600090815260018352604080822092909416815291522054831115612aae57600654612aae9030906001600160a01b0316600019611f2c565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612ae79086906000908690889042906004016130ff565b600060405180830381600087803b158015612b0157600080fd5b505af1158015612b15573d6000803e3d6000fd5b50505050505050565b6000611f2582846130cf565b6006546001600160a01b031663f305d719823085600080612b536005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612bbb573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d599190612f10565b600060208083528351808285015260005b81811015612c0d57858101830151858201604001528201612bf1565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610ea257600080fd5b60008060408385031215612c5657600080fd5b8235612c6181612c2e565b946020939093013593505050565b600080600060608486031215612c8457600080fd5b8335612c8f81612c2e565b92506020840135612c9f81612c2e565b929592945050506040919091013590565b600060208284031215612cc257600080fd5b8135611f2581612c2e565b60008060408385031215612ce057600080fd5b50508035926020909101359150565b8015158114610ea257600080fd5b60008060408385031215612d1057600080fd5b8235612d1b81612c2e565b91506020830135612d2b81612cef565b809150509250929050565b600060208284031215612d4857600080fd5b5035919050565b600080600060408486031215612d6457600080fd5b833567ffffffffffffffff80821115612d7c57600080fd5b818601915086601f830112612d9057600080fd5b813581811115612d9f57600080fd5b8760208260051b8501011115612db457600080fd5b60209283019550935050840135612dca81612cef565b809150509250925092565b600060208284031215612de757600080fd5b8135611f2581612cef565b60008060408385031215612e0557600080fd5b8235612e1081612c2e565b91506020830135612d2b81612c2e565b600181811c90821680612e3457607f821691505b602082108103612e5457634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612e6c57600080fd5b5051919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610bab57610bab612ea8565b600060208284031215612ee357600080fd5b8151611f2581612cef565b600082612f0b57634e487b7160e01b600052601260045260246000fd5b500490565b600080600060608486031215612f2557600080fd5b8351925060208401519150604084015190509250925092565b600080600080600080600080610100898b031215612f5b57600080fd5b8851612f6681612c2e565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b634e487b7160e01b600052603260045260246000fd5b600060018201612fd057612fd0612ea8565b5060010190565b6040808252810183905260008460608301825b8681101561301a578235612ffd81612c2e565b6001600160a01b0316825260209283019290910190600101612fea565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8082028115828204841417610bab57610bab612ea8565b81810381811115610bab57610bab612ea8565b6000602082840312156130f457600080fd5b8151611f2581612c2e565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561314f5784516001600160a01b03168352938301939183019160010161312a565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220156ca29ca3e2d4e738aac28970fafd4a1ab3f0f1577efe1151dc3965ee0cab1564736f6c6343000811003360a06040523480156200001157600080fd5b5060408051808201825260168082527f53484956415f4469766964656e645f547261636b65720000000000000000000060208084018290528451808601909552918452908301529081816003620000698382620001ac565b506004620000788282620001ac565b50505050506200009762000091620000b160201b60201c565b620000b5565b610e1060115569021e19e0c9bab240000060805262000278565b3390565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200013257607f821691505b6020821081036200015357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001a757600081815260208120601f850160051c81016020861015620001825750805b601f850160051c820191505b81811015620001a3578281556001016200018e565b5050505b505050565b81516001600160401b03811115620001c857620001c862000107565b620001e081620001d984546200011d565b8462000159565b602080601f831160018114620002185760008415620001ff5750858301515b600019600386901b1c1916600185901b178555620001a3565b600085815260208120601f198616915b82811015620002495788860151825594840194600190910190840162000228565b5085821015620002685787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051611f756200029b600039600081816105d80152610ecc0152611f756000f3fe6080604052600436106102085760003560e01c8063715018a611610118578063bc4c4b37116100a0578063e7841ec01161006f578063e7841ec014610660578063e98030c714610675578063f2fde38b14610695578063fbcbc0f1146106b5578063ffb2c479146106d557600080fd5b8063bc4c4b37146105a6578063be10b614146105c6578063dd62ed3e146105fa578063e30443bc1461064057600080fd5b806395d89b41116100e757806395d89b41146104fb578063a457c2d714610510578063a8b9d24014610530578063a9059cbb14610550578063aafd847a1461057057600080fd5b8063715018a61461048857806385a6b3ae1461049d5780638da5cb5b146104b357806391b89fba146104db57600080fd5b80633009a6091161019b5780634e7b827f1161016a5780634e7b827f146103925780635183d6fd146103c25780636a474002146104275780636f2789ec1461043c57806370a082311461045257600080fd5b80633009a60914610320578063313ce5671461033657806331e79db014610352578063395093511461037257600080fd5b806318160ddd116101d757806318160ddd1461029e578063226cfa3d146102b357806323b872dd146102e057806327ce01471461030057600080fd5b806303c833021461021c57806306fdde0314610224578063095ea7b31461024f57806309bbedde1461027f57600080fd5b3661021757610215610710565b005b600080fd5b610215610710565b34801561023057600080fd5b506102396107a3565b6040516102469190611c3c565b60405180910390f35b34801561025b57600080fd5b5061026f61026a366004611c9f565b610835565b6040519015158152602001610246565b34801561028b57600080fd5b50600a545b604051908152602001610246565b3480156102aa57600080fd5b50600254610290565b3480156102bf57600080fd5b506102906102ce366004611ccb565b60106020526000908152604090205481565b3480156102ec57600080fd5b5061026f6102fb366004611ce8565b61084c565b34801561030c57600080fd5b5061029061031b366004611ccb565b6108fb565b34801561032c57600080fd5b50610290600e5481565b34801561034257600080fd5b5060405160128152602001610246565b34801561035e57600080fd5b5061021561036d366004611ccb565b610957565b34801561037e57600080fd5b5061026f61038d366004611c9f565b610a7e565b34801561039e57600080fd5b5061026f6103ad366004611ccb565b600f6020526000908152604090205460ff1681565b3480156103ce57600080fd5b506103e26103dd366004611d29565b610aba565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610246565b34801561043357600080fd5b50610215610c0e565b34801561044857600080fd5b5061029060115481565b34801561045e57600080fd5b5061029061046d366004611ccb565b6001600160a01b031660009081526020819052604090205490565b34801561049457600080fd5b50610215610cb2565b3480156104a957600080fd5b5061029060085481565b3480156104bf57600080fd5b506009546040516001600160a01b039091168152602001610246565b3480156104e757600080fd5b506102906104f6366004611ccb565b610ce6565b34801561050757600080fd5b50610239610cf1565b34801561051c57600080fd5b5061026f61052b366004611c9f565b610d00565b34801561053c57600080fd5b5061029061054b366004611ccb565b610d99565b34801561055c57600080fd5b5061026f61056b366004611c9f565b610dc5565b34801561057c57600080fd5b5061029061058b366004611ccb565b6001600160a01b031660009081526007602052604090205490565b3480156105b257600080fd5b5061026f6105c1366004611d42565b610dd2565b3480156105d257600080fd5b506102907f000000000000000000000000000000000000000000000000000000000000000081565b34801561060657600080fd5b50610290610615366004611d80565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561064c57600080fd5b5061021561065b366004611c9f565b610e80565b34801561066c57600080fd5b50600e54610290565b34801561068157600080fd5b50610215610690366004611d29565b611008565b3480156106a157600080fd5b506102156106b0366004611ccb565b611177565b3480156106c157600080fd5b506103e26106d0366004611ccb565b611212565b3480156106e157600080fd5b506106f56106f0366004611d29565b61137b565b60408051938452602084019290925290820152606001610246565b600061071b60025490565b1161072557600080fd5b34156107a15761075861073760025490565b61074534600160801b611498565b61074f9190611dc4565b600554906114ab565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a260085461079d90346114ab565b6008555b565b6060600380546107b290611de6565b80601f01602080910402602001604051908101604052809291908181526020018280546107de90611de6565b801561082b5780601f106108005761010080835404028352916020019161082b565b820191906000526020600020905b81548152906001019060200180831161080e57829003601f168201915b5050505050905090565b60006108423384846114b7565b5060015b92915050565b60006108598484846115db565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156108e35760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6108f085338584036114b7565b506001949350505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b9261094d92610948926109429161093d9190611498565b611638565b906116a6565b6116b2565b6108469190611dc4565b6009546001600160a01b031633146109815760405162461bcd60e51b81526004016108da90611e20565b6001600160a01b0381166000908152600f602052604090205460ff16156109a757600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff191660011790556109d5908290611704565b60405163131836e760e21b8152600a60048201526001600160a01b038216602482015273955d79b012a6c2d1389f05388d116237aa92358d90634c60db9c9060440160006040518083038186803b158015610a2f57600080fd5b505af4158015610a43573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610842918590610ab5908690611e55565b6114b7565b600080600080600080600080600a73955d79b012a6c2d1389f05388d116237aa92358d63deb3d89690916040518263ffffffff1660e01b8152600401610b0291815260200190565b602060405180830381865af4158015610b1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b439190611e68565b8910610b68575060009650600019955085945086935083925082915081905080610c03565b6040516368d54f3f60e11b8152600a6004820152602481018a905260009073955d79b012a6c2d1389f05388d116237aa92358d9063d1aa9e7e90604401602060405180830381865af4158015610bc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be69190611e81565b9050610bf181611212565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152606760248201527f53484956415f4469766964656e645f547261636b65723a20776974686472617760448201527f4469766964656e642064697361626c65642e20557365207468652027636c616960648201527f6d272066756e6374696f6e206f6e20746865206d61696e20534849564120636f608482015266373a3930b1ba1760c91b60a482015260c4016108da565b6009546001600160a01b03163314610cdc5760405162461bcd60e51b81526004016108da90611e20565b6107a16000611769565b600061084682610d99565b6060600480546107b290611de6565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610d825760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108da565b610d8f33858584036114b7565b5060019392505050565b6001600160a01b03811660009081526007602052604081205461084690610dbf846108fb565b906117bb565b60006108423384846115db565b6009546000906001600160a01b03163314610dff5760405162461bcd60e51b81526004016108da90611e20565b6000610e0a846117c7565b90508015610e76576001600160a01b038416600081815260106020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610e649085815260200190565b60405180910390a36001915050610846565b5060009392505050565b6009546001600160a01b03163314610eaa5760405162461bcd60e51b81526004016108da90611e20565b6001600160a01b0382166000908152600f602052604090205460ff16611004577f00000000000000000000000000000000000000000000000000000000000000008110610f7957610efb8282611704565b604051632f0ad01760e21b8152600a60048201526001600160a01b03831660248201526044810182905273955d79b012a6c2d1389f05388d116237aa92358d9063bc2b405c9060640160006040518083038186803b158015610f5c57600080fd5b505af4158015610f70573d6000803e3d6000fd5b50505050610ff7565b610f84826000611704565b60405163131836e760e21b8152600a60048201526001600160a01b038316602482015273955d79b012a6c2d1389f05388d116237aa92358d90634c60db9c9060440160006040518083038186803b158015610fde57600080fd5b505af4158015610ff2573d6000803e3d6000fd5b505050505b611002826001610dd2565b505b5050565b6009546001600160a01b031633146110325760405162461bcd60e51b81526004016108da90611e20565b610e1081101580156110475750620151808111155b6110cd5760405162461bcd60e51b815260206004820152604b60248201527f53484956415f4469766964656e645f547261636b65723a20636c61696d57616960448201527f74206d757374206265207570646174656420746f206265747765656e2031206160648201526a6e6420323420686f75727360a81b608482015260a4016108da565b60115481036111445760405162461bcd60e51b815260206004820152603d60248201527f53484956415f4469766964656e645f547261636b65723a2043616e6e6f74207560448201527f706461746520636c61696d5761697420746f2073616d652076616c756500000060648201526084016108da565b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b6009546001600160a01b031633146111a15760405162461bcd60e51b81526004016108da90611e20565b6001600160a01b0381166112065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108da565b61120f81611769565b50565b6040516317e142d160e01b8152600a60048201526001600160a01b0382166024820152819060009081908190819081908190819073955d79b012a6c2d1389f05388d116237aa92358d906317e142d190604401602060405180830381865af4158015611282573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a69190611e68565b965060001995506000871261130857600e548711156112d457600e546112cd90889061190d565b9550611308565b600e54600a54600091106112e95760006112f8565b600e54600a546112f8916117bb565b905061130488826116a6565b9650505b61131188610d99565b945061131c886108fb565b6001600160a01b038916600090815260106020526040902054909450925082611346576000611354565b6011546113549084906114ab565b915042821161136457600061136e565b61136e82426117bb565b9050919395975091939597565b600a546000908190819080820361139d575050600e5460009250829150611491565b600e546000805a90506000805b89841080156113b857508582105b1561148057846113c781611e9e565b600a54909650861090506113da57600094505b6000600a60000186815481106113f2576113f2611eb7565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915061142390611919565b1561144657611433816001610dd2565b15611446578161144281611e9e565b9250505b8261145081611e9e565b93505060005a9050808511156114775761147461146d86836117bb565b87906114ab565b95505b93506113aa9050565b600e85905590975095509193505050505b9193909250565b60006114a48284611ecd565b9392505050565b60006114a48284611e55565b6001600160a01b0383166115195760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108da565b6001600160a01b03821661157a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108da565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602c60248201527f53484956415f4469766964656e645f547261636b65723a204e6f207472616e7360448201526b19995c9cc8185b1b1bddd95960a21b60648201526084016108da565b60006001600160ff1b038211156116a25760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016108da565b5090565b60006114a48284611ee4565b6000808212156116a25760405162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f73697469766560448201526064016108da565b6001600160a01b0382166000908152602081905260409020548082111561174357600061173183836117bb565b905061173d8482611940565b50611002565b8082101561100257600061175782846117bb565b905061176384826119a4565b50505050565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006114a48284611f0c565b6000806117d383610d99565b90508015611904576001600160a01b0383166000908152600760205260409020546117fe90826114ab565b6001600160a01b038416600081815260076020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9061184d9084815260200190565b60405180910390a26000836001600160a01b031682610bb890604051600060405180830381858888f193505050503d80600081146118a7576040519150601f19603f3d011682016040523d82523d6000602084013e6118ac565b606091505b50509050806118fd576001600160a01b0384166000908152600760205260409020546118d890836117bb565b6001600160a01b03909416600090815260076020526040812094909455509192915050565b5092915050565b50600092915050565b60006114a48284611f1f565b60004282111561192b57506000919050565b60115461193842846117bb565b101592915050565b61194a82826119e8565b61198461196561093d8360055461149890919063ffffffff16565b6001600160a01b0384166000908152600660205260409020549061190d565b6001600160a01b0390921660009081526006602052604090209190915550565b6119ae8282611adb565b6119846119c961093d8360055461149890919063ffffffff16565b6001600160a01b038416600090815260066020526040902054906116a6565b6001600160a01b038216611a3e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108da565b611a4a60008383611002565b8060026000828254611a5c9190611e55565b90915550506001600160a01b03821660009081526020819052604081208054839290611a89908490611e55565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361100460008383611002565b6001600160a01b038216611b3b5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016108da565b611b4782600083611002565b6001600160a01b03821660009081526020819052604090205481811015611bbb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016108da565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611bea908490611f0c565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361100283600084611002565b600060208083528351808285015260005b81811015611c6957858101830151858201604001528201611c4d565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461120f57600080fd5b60008060408385031215611cb257600080fd5b8235611cbd81611c8a565b946020939093013593505050565b600060208284031215611cdd57600080fd5b81356114a481611c8a565b600080600060608486031215611cfd57600080fd5b8335611d0881611c8a565b92506020840135611d1881611c8a565b929592945050506040919091013590565b600060208284031215611d3b57600080fd5b5035919050565b60008060408385031215611d5557600080fd5b8235611d6081611c8a565b915060208301358015158114611d7557600080fd5b809150509250929050565b60008060408385031215611d9357600080fd5b8235611d9e81611c8a565b91506020830135611d7581611c8a565b634e487b7160e01b600052601160045260246000fd5b600082611de157634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680611dfa57607f821691505b602082108103611e1a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8082018082111561084657610846611dae565b600060208284031215611e7a57600080fd5b5051919050565b600060208284031215611e9357600080fd5b81516114a481611c8a565b600060018201611eb057611eb0611dae565b5060010190565b634e487b7160e01b600052603260045260246000fd5b808202811582820484141761084657610846611dae565b8082018281126000831280158216821582161715611f0457611f04611dae565b505092915050565b8181038181111561084657610846611dae565b81810360008312801583831316838312821617156118fd576118fd611dae56fea2646970667358221220309b824c057f57f409eab9a399f885ed0c7c78b7847e6a2923185ae0494805df64736f6c63430008110033

Deployed Bytecode

0x60806040526004361061037a5760003560e01c806375f0a874116101d1578063a946163011610102578063d543dbeb116100a0578063e7841ec01161006f578063e7841ec014610a93578063e98030c714610aa8578063f27fd25414610ac8578063f2fde38b14610ae857600080fd5b8063d543dbeb146109f7578063dd62ed3e14610a17578063e083e92214610a5d578063e2f4560514610a7d57600080fd5b8063b62496f5116100dc578063b62496f514610967578063c024666814610997578063c492f046146109b7578063c49b9a80146109d757600080fd5b8063a9461630146108c2578063ad56c13c146108e2578063afa4f3b21461094757600080fd5b806398118cb41161016f578063a26579ad11610149578063a26579ad1461084d578063a457c2d714610862578063a8b9d24014610882578063a9059cbb146108a257600080fd5b806398118cb4146108015780639a7a23d6146108175780639c1b8af51461083757600080fd5b8063871c128d116101ab578063871c128d146107985780638c0344db146107b85780638da5cb5b146107ce57806395d89b41146107ec57600080fd5b806375f0a8741461074d5780637d1db4a51461076d5780637fa787ba1461078357600080fd5b80634e71d92d116102ab578063658c27a9116102495780636b67c4df116102235780636b67c4df146106cc578063700bb191146106e257806370a0823114610702578063715018a61461073857600080fd5b8063658c27a91461065357806365b8dbc01461068c5780636843cd84146106ac57600080fd5b80635aa821a9116102855780635aa821a9146105e85780635b89029c146105fe5780635d098b381461061e57806364b0f6531461063e57600080fd5b80634e71d92d1461057a5780634fbee1931461058f57806352f7c988146105c857600080fd5b806330bb4cff1161031857806339509351116102f257806339509351146104e557806349928a501461050557806349bd5a5e146105255780634a74bb021461055957600080fd5b806330bb4cff14610492578063313ce567146104a757806331e79db0146104c357600080fd5b80631694505e116103545780631694505e1461040557806318160ddd1461043d57806323b872dd146104525780632c1f52161461047257600080fd5b806306fdde0314610386578063095ea7b3146103b157806313114a9d146103e157600080fd5b3661038157005b600080fd5b34801561039257600080fd5b5061039b610b08565b6040516103a89190612be0565b60405180910390f35b3480156103bd57600080fd5b506103d16103cc366004612c43565b610b9a565b60405190151581526020016103a8565b3480156103ed57600080fd5b506103f7600d5481565b6040519081526020016103a8565b34801561041157600080fd5b50600654610425906001600160a01b031681565b6040516001600160a01b0390911681526020016103a8565b34801561044957600080fd5b506002546103f7565b34801561045e57600080fd5b506103d161046d366004612c6f565b610bb1565b34801561047e57600080fd5b50600754610425906001600160a01b031681565b34801561049e57600080fd5b506103f7610c60565b3480156104b357600080fd5b50604051601281526020016103a8565b3480156104cf57600080fd5b506104e36104de366004612cb0565b610cd3565b005b3480156104f157600080fd5b506103d1610500366004612c43565b610d60565b34801561051157600080fd5b506104e3610520366004612cb0565b610d9c565b34801561053157600080fd5b506104257f000000000000000000000000a336257a95a351b2737dcadefebafd121ac9ebdc81565b34801561056557600080fd5b506006546103d190600160a81b900460ff1681565b34801561058657600080fd5b506104e3610e2d565b34801561059b57600080fd5b506103d16105aa366004612cb0565b6001600160a01b031660009081526011602052604090205460ff1690565b3480156105d457600080fd5b506104e36105e3366004612ccd565b610ea5565b3480156105f457600080fd5b506103f760085481565b34801561060a57600080fd5b506104e3610619366004612cfd565b610f6b565b34801561062a57600080fd5b506104e3610639366004612cb0565b610fc0565b34801561064a57600080fd5b506103f761100c565b34801561065f57600080fd5b506103d161066e366004612cb0565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561069857600080fd5b506104e36106a7366004612cb0565b611056565b3480156106b857600080fd5b506103f76106c7366004612cb0565b61114e565b3480156106d857600080fd5b506103f7600e5481565b3480156106ee57600080fd5b506104e36106fd366004612d36565b6111be565b34801561070e57600080fd5b506103f761071d366004612cb0565b6001600160a01b031660009081526020819052604090205490565b34801561074457600080fd5b506104e3611291565b34801561075957600080fd5b50600f54610425906001600160a01b031681565b34801561077957600080fd5b506103f7600a5481565b34801561078f57600080fd5b506104e36112c7565b3480156107a457600080fd5b506104e36107b3366004612d36565b61137a565b3480156107c457600080fd5b506103f7600b5481565b3480156107da57600080fd5b506005546001600160a01b0316610425565b3480156107f857600080fd5b5061039b6114cc565b34801561080d57600080fd5b506103f7600c5481565b34801561082357600080fd5b506104e3610832366004612cfd565b6114db565b34801561084357600080fd5b506103f760105481565b34801561085957600080fd5b506103f76115cf565b34801561086e57600080fd5b506103d161087d366004612c43565b611619565b34801561088e57600080fd5b506103f761089d366004612cb0565b6116b2565b3480156108ae57600080fd5b506103d16108bd366004612c43565b6116e5565b3480156108ce57600080fd5b506104e36108dd366004612d36565b6116f2565b3480156108ee57600080fd5b506109026108fd366004612cb0565b611791565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016103a8565b34801561095357600080fd5b506104e3610962366004612d36565b61182c565b34801561097357600080fd5b506103d1610982366004612cb0565b60136020526000908152604090205460ff1681565b3480156109a357600080fd5b506104e36109b2366004612cfd565b61185b565b3480156109c357600080fd5b506104e36109d2366004612d4f565b61196f565b3480156109e357600080fd5b506104e36109f2366004612dd5565b611a4b565b348015610a0357600080fd5b506104e3610a12366004612d36565b611acd565b348015610a2357600080fd5b506103f7610a32366004612df2565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a6957600080fd5b506104e3610a78366004612cb0565b611b60565b348015610a8957600080fd5b506103f760095481565b348015610a9f57600080fd5b506103f7611d9a565b348015610ab457600080fd5b506104e3610ac3366004612d36565b611de4565b348015610ad457600080fd5b50610902610ae3366004612d36565b611e3f565b348015610af457600080fd5b506104e3610b03366004612cb0565b611e81565b606060038054610b1790612e20565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4390612e20565b8015610b905780601f10610b6557610100808354040283529160200191610b90565b820191906000526020600020905b815481529060010190602001808311610b7357829003601f168201915b5050505050905090565b6000610ba7338484611f2c565b5060015b92915050565b6000610bbe848484612050565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610c485760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b610c558533858403611f2c565b506001949350505050565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610caa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cce9190612e5a565b905090565b6005546001600160a01b03163314610cfd5760405162461bcd60e51b8152600401610c3f90612e73565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610d4557600080fd5b505af1158015610d59573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610ba7918590610d97908690612ebe565b611f2c565b6005546001600160a01b03163314610dc65760405162461bcd60e51b8152600401610c3f90612e73565b6001600160a01b0381811660008181526012602090815260408083208054600160ff19918216811790925560119093529281902080549092169092179055600754905163031e79db60e41b81526004810192909252909116906331e79db090602401610d2b565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea29190612ed1565b50565b6005546001600160a01b03163314610ecf5760405162461bcd60e51b8152600401610c3f90612e73565b6046610edb8284612ebe565b1115610f295760405162461bcd60e51b815260206004820152601b60248201527f54686520666565206d757374206265203725206f72206c6573732e00000000006044820152606401610c3f565b610f34600283612eee565b600b55610f42600283612eee565b600e819055600c829055600b54610f649190610f5e9084611f19565b90611f19565b600d555050565b6005546001600160a01b03163314610f955760405162461bcd60e51b8152600401610c3f90612e73565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610fea5760405162461bcd60e51b8152600401610c3f90612e73565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610caa573d6000803e3d6000fd5b6005546001600160a01b031633146110805760405162461bcd60e51b8152600401610c3f90612e73565b6006546001600160a01b03908116908216036110f15760405162461bcd60e51b815260206004820152602a60248201527f53484956413a2054686520726f7574657220616c7265616479206861732074686044820152696174206164647265737360b01b6064820152608401610c3f565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561119a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bab9190612e5a565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611211573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112359190612f10565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98906080015b60405180910390a350505050565b6005546001600160a01b031633146112bb5760405162461bcd60e51b8152600401610c3f90612e73565b6112c56000612486565b565b6005546001600160a01b031633146112f15760405162461bcd60e51b8152600401610c3f90612e73565b600047116113415760405162461bcd60e51b815260206004820152601f60248201527f43616e2774207769746864726177206e65676174697665206f72207a65726f006044820152606401610c3f565b6005546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610ea2573d6000803e3d6000fd5b6005546001600160a01b031633146113a45760405162461bcd60e51b8152600401610c3f90612e73565b62030d4081101580156113ba57506207a1208111155b61142c5760405162461bcd60e51b815260206004820152603b60248201527f53484956413a20676173466f7250726f63657373696e67206d7573742062652060448201527f6265747765656e203230302c30303020616e64203530302c30303000000000006064820152608401610c3f565b60105481036114995760405162461bcd60e51b815260206004820152603360248201527f53484956413a2043616e6e6f742075706461746520676173466f7250726f63656044820152727373696e6720746f2073616d652076616c756560681b6064820152608401610c3f565b60105460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601055565b606060048054610b1790612e20565b6005546001600160a01b031633146115055760405162461bcd60e51b8152600401610c3f90612e73565b7f000000000000000000000000a336257a95a351b2737dcadefebafd121ac9ebdc6001600160a01b0316826001600160a01b0316036115c15760405162461bcd60e51b815260206004820152604c60248201527f53484956413a205468652050616e63616b655377617020706169722063616e6e60448201527f6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b60648201526b65744d616b6572506169727360a01b608482015260a401610c3f565b6115cb82826124d8565b5050565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015610caa573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561169b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c3f565b6116a83385858403611f2c565b5060019392505050565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161117d565b6000610ba7338484612050565b6005546001600160a01b0316331461171c5760405162461bcd60e51b8152600401610c3f90612e73565b600181101561176d5760405162461bcd60e51b815260206004820152601f60248201527f546865206d617820627579206d757374206265203125206f72206d6f72652e006044820152606401610c3f565b61178b60646117858361177f60025490565b90612637565b90612643565b60085550565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa1580156117ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118119190612f3e565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146118565760405162461bcd60e51b8152600401610c3f90612e73565b600955565b6005546001600160a01b031633146118855760405162461bcd60e51b8152600401610c3f90612e73565b6001600160a01b03821660009081526011602052604090205481151560ff9091161515036119105760405162461bcd60e51b815260206004820152603260248201527f53484956413a204163636f756e742068617320616c7265616479207468652076604482015271616c7565206f6620276578636c756465642760701b6064820152608401610c3f565b6001600160a01b038216600081815260116020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146119995760405162461bcd60e51b8152600401610c3f90612e73565b60005b82811015611a0a5781601160008686858181106119bb576119bb612fa8565b90506020020160208101906119d09190612cb0565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a0281612fbe565b91505061199c565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051611a3e93929190612fd7565b60405180910390a1505050565b6005546001600160a01b03163314611a755760405162461bcd60e51b8152600401610c3f90612e73565b60068054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611ac290831515815260200190565b60405180910390a150565b6005546001600160a01b03163314611af75760405162461bcd60e51b8152600401610c3f90612e73565b6001811015611b485760405162461bcd60e51b815260206004820152601f60248201527f546865206d617820627579206d757374206265203125206f72206d6f72652e006044820152606401610c3f565b611b5a60646117858361177f60025490565b600a5550565b6005546001600160a01b03163314611b8a5760405162461bcd60e51b8152600401610c3f90612e73565b306001600160a01b03821603611bf75760405162461bcd60e51b815260206004820152602c60248201527f43616e277420776974686472617720746f6b656e732064657374696e6564206660448201526b6f72206c697175696469747960a01b6064820152608401610c3f565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c629190612e5a565b11611ca25760405162461bcd60e51b815260206004820152601060248201526f043616e277420776974686472617720360841b6044820152606401610c3f565b806001600160a01b031663a9059cbb611cc36005546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015611d07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2b9190612e5a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611d76573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cb9190612ed1565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015610caa573d6000803e3d6000fd5b6005546001600160a01b03163314611e0e5760405162461bcd60e51b8152600401610c3f90612e73565b60075460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610d2b565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016117cf565b6005546001600160a01b03163314611eab5760405162461bcd60e51b8152600401610c3f90612e73565b6001600160a01b038116611f105760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c3f565b610ea281612486565b6000611f258284612ebe565b9392505050565b6001600160a01b038316611f8e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c3f565b6001600160a01b038216611fef5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c3f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166120765760405162461bcd60e51b8152600401610c3f90613030565b6001600160a01b03821661209c5760405162461bcd60e51b8152600401610c3f90613075565b806000036120b5576120b08383600061264f565b505050565b6001600160a01b03831660009081526013602052604090205460ff1680156120f657506001600160a01b03831660009081526012602052604090205460ff16155b801561211b57506001600160a01b03821660009081526012602052604090205460ff16155b15612198576008548111156121985760405162461bcd60e51b815260206004820152603960248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d61784275795472616e73616374696f6e416d6f756e742e000000000000006064820152608401610c3f565b30600090815260208190526040902054600954811080159081906121c65750600654600160a01b900460ff16155b80156121eb57506001600160a01b03851660009081526013602052604090205460ff16155b80156122005750600654600160a81b900460ff165b1561220e5761220e82612796565b6001600160a01b03851660009081526011602052604090205460ff1615801561225057506001600160a01b03841660009081526011602052604090205460ff16155b1561228d5760006103e8600d548561226891906130b8565b6122729190612eee565b905061227e81856130cf565b935061228b86308361264f565b505b61229885858561264f565b6007546001600160a01b031663e30443bc866122c9816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561230f57600080fd5b505af1925050508015612320575060015b506007546001600160a01b031663e30443bc85612352816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561239857600080fd5b505af19250505080156123a9575060015b50600654600160a01b900460ff16610d59576010546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015612428575060408051601f3d908101601f1916820190925261242591810190612f10565b60015b1561247e5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526013602052604090205481151560ff90911615150361256e5760405162461bcd60e51b815260206004820152603f60248201527f53484956413a204175746f6d61746564206d61726b6574206d616b657220706160448201527f697220697320616c72656164792073657420746f20746861742076616c7565006064820152608401610c3f565b6001600160a01b0382166000908152601360205260409020805460ff191682158015919091179091556125fb5760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156125e257600080fd5b505af11580156125f6573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000611f2582846130b8565b6000611f258284612eee565b6001600160a01b0383166126755760405162461bcd60e51b8152600401610c3f90613030565b6001600160a01b03821661269b5760405162461bcd60e51b8152600401610c3f90613075565b6001600160a01b038316600090815260208190526040902054818110156127135760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c3f565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061274a908490612ebe565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161128391815260200190565b6006805460ff60a01b1916600160a01b179055600c54600d546000916127cc9161177f906127c5906002612637565b8590612643565b905060006127da82846130cf565b9050476127e78230612992565b60006127f382476130cf565b9050600061282a61281c600c546128166002600d5461263790919063ffffffff16565b90612b1e565b600c54611785908590612637565b90506128368582612b2a565b6000612862600e5461177f612858600c54600d54612b1e90919063ffffffff16565b6117858787612b1e565b600f546040519192506001600160a01b03169082156108fc029083906000818181858888f1935050505015801561289d573d6000803e3d6000fd5b5060075460405147916000916001600160a01b039091169083908381818185875af1925050503d80600081146128ef576040519150601f19603f3d011682016040523d82523d6000602084013e6128f4565b606091505b505090508015612941577f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc361292989896130cf565b60408051918252602082018590520160405180910390a15b60408051898152602081018790527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f8381486910160405180910390a150506006805460ff60a01b1916905550505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106129c7576129c7612fa8565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4491906130e2565b81600181518110612a5757612a57612fa8565b6001600160a01b0392831660209182029290920181019190915260065430600090815260018352604080822092909416815291522054831115612aae57600654612aae9030906001600160a01b0316600019611f2c565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612ae79086906000908690889042906004016130ff565b600060405180830381600087803b158015612b0157600080fd5b505af1158015612b15573d6000803e3d6000fd5b50505050505050565b6000611f2582846130cf565b6006546001600160a01b031663f305d719823085600080612b536005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612bbb573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d599190612f10565b600060208083528351808285015260005b81811015612c0d57858101830151858201604001528201612bf1565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610ea257600080fd5b60008060408385031215612c5657600080fd5b8235612c6181612c2e565b946020939093013593505050565b600080600060608486031215612c8457600080fd5b8335612c8f81612c2e565b92506020840135612c9f81612c2e565b929592945050506040919091013590565b600060208284031215612cc257600080fd5b8135611f2581612c2e565b60008060408385031215612ce057600080fd5b50508035926020909101359150565b8015158114610ea257600080fd5b60008060408385031215612d1057600080fd5b8235612d1b81612c2e565b91506020830135612d2b81612cef565b809150509250929050565b600060208284031215612d4857600080fd5b5035919050565b600080600060408486031215612d6457600080fd5b833567ffffffffffffffff80821115612d7c57600080fd5b818601915086601f830112612d9057600080fd5b813581811115612d9f57600080fd5b8760208260051b8501011115612db457600080fd5b60209283019550935050840135612dca81612cef565b809150509250925092565b600060208284031215612de757600080fd5b8135611f2581612cef565b60008060408385031215612e0557600080fd5b8235612e1081612c2e565b91506020830135612d2b81612c2e565b600181811c90821680612e3457607f821691505b602082108103612e5457634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612e6c57600080fd5b5051919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610bab57610bab612ea8565b600060208284031215612ee357600080fd5b8151611f2581612cef565b600082612f0b57634e487b7160e01b600052601260045260246000fd5b500490565b600080600060608486031215612f2557600080fd5b8351925060208401519150604084015190509250925092565b600080600080600080600080610100898b031215612f5b57600080fd5b8851612f6681612c2e565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b634e487b7160e01b600052603260045260246000fd5b600060018201612fd057612fd0612ea8565b5060010190565b6040808252810183905260008460608301825b8681101561301a578235612ffd81612c2e565b6001600160a01b0316825260209283019290910190600101612fea565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8082028115828204841417610bab57610bab612ea8565b81810381811115610bab57610bab612ea8565b6000602082840312156130f457600080fd5b8151611f2581612c2e565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561314f5784516001600160a01b03168352938301939183019160010161312a565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220156ca29ca3e2d4e738aac28970fafd4a1ab3f0f1577efe1151dc3965ee0cab1564736f6c63430008110033

Libraries Used


Deployed Bytecode Sourcemap

60753:15916:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28813:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30980:169;;;;;;;;;;-1:-1:-1;30980:169:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;30980:169:0;1023:187:1;61339:24:0;;;;;;;;;;;;;;;;;;;1361:25:1;;;1349:2;1334:18;61339:24:0;1215:177:1;60828:41:0;;;;;;;;;;-1:-1:-1;60828:41:0;;;;-1:-1:-1;;;;;60828:41:0;;;;;;-1:-1:-1;;;;;1587:32:1;;;1569:51;;1557:2;1542:18;60828:41:0;1397:229:1;29933:108:0;;;;;;;;;;-1:-1:-1;30021:12:0;;29933:108;;31631:492;;;;;;;;;;-1:-1:-1;31631:492:0;;;;;:::i;:::-;;:::i;61010:43::-;;;;;;;;;;-1:-1:-1;61010:43:0;;;;-1:-1:-1;;;;;61010:43:0;;;68654:141;;;;;;;;;;;;;:::i;29775:93::-;;;;;;;;;;-1:-1:-1;29775:93:0;;29858:2;2479:36:1;;2467:2;2452:18;29775:93:0;2337:184:1;70755:130:0;;;;;;;;;;-1:-1:-1;70755:130:0;;;;;:::i;:::-;;:::i;:::-;;32532:215;;;;;;;;;;-1:-1:-1;32532:215:0;;;;;:::i;:::-;;:::i;66634:222::-;;;;;;;;;;-1:-1:-1;66634:222:0;;;;;:::i;:::-;;:::i;60876:38::-;;;;;;;;;;;;;;;60961:40;;;;;;;;;;-1:-1:-1;60961:40:0;;;;-1:-1:-1;;;60961:40:0;;;;;;70285:97;;;;;;;;;;;;;:::i;68803:125::-;;;;;;;;;;-1:-1:-1;68803:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;68892:28:0;68868:4;68892:28;;;:19;:28;;;;;;;;;68803:125;62964:321;;;;;;;;;;-1:-1:-1;62964:321:0;;;;;:::i;:::-;;:::i;61062:63::-;;;;;;;;;;;;;;;;66492:134;;;;;;;;;;-1:-1:-1;66492:134:0;;;;;:::i;:::-;;:::i;63802:138::-;;;;;;;;;;-1:-1:-1;63802:138:0;;;;;:::i;:::-;;:::i;70524:141::-;;;;;;;;;;;;;:::i;68940:127::-;;;;;;;;;;-1:-1:-1;68940:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;69030:29:0;69006:4;69030:29;;;:20;:29;;;;;;;;;68940:127;65860:314;;;;;;;;;;-1:-1:-1;65860:314:0;;;;;:::i;:::-;;:::i;69227:130::-;;;;;;;;;;-1:-1:-1;69227:130:0;;;;;:::i;:::-;;:::i;61370:27::-;;;;;;;;;;;;;;;;70018:259;;;;;;;;;;-1:-1:-1;70018:259:0;;;;;:::i;:::-;;:::i;30104:127::-;;;;;;;;;;-1:-1:-1;30104:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;30205:18:0;30178:7;30205:18;;;;;;;;;;;;30104:127;40335:94;;;;;;;;;;;;;:::i;61404:39::-;;;;;;;;;;-1:-1:-1;61404:39:0;;;;-1:-1:-1;;;;;61404:39:0;;;61203:52;;;;;;;;;;;;;;;;76119:194;;;;;;;;;;;;;:::i;67992:406::-;;;;;;;;;;-1:-1:-1;67992:406:0;;;;;:::i;:::-;;:::i;61270:28::-;;;;;;;;;;;;;;;;39684:87;;;;;;;;;;-1:-1:-1;39757:6:0;;-1:-1:-1;;;;;39757:6:0;39684:87;;29032:104;;;;;;;;;;;;;:::i;61305:27::-;;;;;;;;;;;;;;;;67176:263;;;;;;;;;;-1:-1:-1;67176:263:0;;;;;:::i;:::-;;:::i;61522:40::-;;;;;;;;;;;;;;;;68538:108;;;;;;;;;;;;;:::i;33250:413::-;;;;;;;;;;-1:-1:-1;33250:413:0;;;;;:::i;:::-;;:::i;69075:147::-;;;;;;;;;;-1:-1:-1;69075:147:0;;;;;:::i;:::-;;:::i;30444:175::-;;;;;;;;;;-1:-1:-1;30444:175:0;;;;;:::i;:::-;;:::i;63293:249::-;;;;;;;;;;-1:-1:-1;63293:249:0;;;;;:::i;:::-;;:::i;69365:318::-;;;;;;;;;;-1:-1:-1;69365:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4775:32:1;;;4757:51;;4839:2;4824:18;;4817:34;;;;4867:18;;;4860:34;;;;4925:2;4910:18;;4903:34;;;;4968:3;4953:19;;4946:35;4795:3;4997:19;;4990:35;5056:3;5041:19;;5034:35;5100:3;5085:19;;5078:35;4744:3;4729:19;69365:318:0;4418:701:1;67452:118:0;;;;;;;;;;-1:-1:-1;67452:118:0;;;;;:::i;:::-;;:::i;61901:58::-;;;;;;;;;;-1:-1:-1;61901:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;66182:298;;;;;;;;;;-1:-1:-1;66182:298:0;;;;;:::i;:::-;;:::i;66864:304::-;;;;;;;;;;-1:-1:-1;66864:304:0;;;;;:::i;:::-;;:::i;70893:171::-;;;;;;;;;;-1:-1:-1;70893:171:0;;;;;:::i;:::-;;:::i;63550:240::-;;;;;;;;;;-1:-1:-1;63550:240:0;;;;;:::i;:::-;;:::i;30682:151::-;;;;;;;;;;-1:-1:-1;30682:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;30798:18:0;;;30771:7;30798:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;30682:151;76321:339;;;;;;;;;;-1:-1:-1;76321:339:0;;;;;:::i;:::-;;:::i;61132:56::-;;;;;;;;;;;;;;;;70390:126;;;;;;;;;;;;;:::i;68406:124::-;;;;;;;;;;-1:-1:-1;68406:124:0;;;;;:::i;:::-;;:::i;69688:325::-;;;;;;;;;;-1:-1:-1;69688:325:0;;;;;:::i;:::-;;:::i;40584:192::-;;;;;;;;;;-1:-1:-1;40584:192:0;;;;;:::i;:::-;;:::i;28813:100::-;28867:13;28900:5;28893:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28813:100;:::o;30980:169::-;31063:4;31080:39;23419:10;31103:7;31112:6;31080:8;:39::i;:::-;-1:-1:-1;31137:4:0;30980:169;;;;;:::o;31631:492::-;31771:4;31788:36;31798:6;31806:9;31817:6;31788:9;:36::i;:::-;-1:-1:-1;;;;;31864:19:0;;31837:24;31864:19;;;:11;:19;;;;;;;;23419:10;31864:33;;;;;;;;31916:26;;;;31908:79;;;;-1:-1:-1;;;31908:79:0;;7105:2:1;31908:79:0;;;7087:21:1;7144:2;7124:18;;;7117:30;7183:34;7163:18;;;7156:62;-1:-1:-1;;;7234:18:1;;;7227:38;7282:19;;31908:79:0;;;;;;;;;32023:57;32032:6;23419:10;32073:6;32054:16;:25;32023:8;:57::i;:::-;-1:-1:-1;32111:4:0;;31631:492;-1:-1:-1;;;;31631:492:0:o;68654:141::-;68744:15;;:43;;;-1:-1:-1;;;68744:43:0;;;;68717:7;;-1:-1:-1;;;;;68744:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68737:50;;68654:141;:::o;70755:130::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;70832:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;70832:45:0;;-1:-1:-1;;;;;1587:32:1;;;70832:45:0::1;::::0;::::1;1569:51:1::0;70832:15:0;;::::1;::::0;:36:::1;::::0;1542:18:1;;70832:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;70755:130:::0;:::o;32532:215::-;23419:10;32620:4;32669:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;32669:34:0;;;;;;;;;;32620:4;;32637:80;;32660:7;;32669:47;;32706:10;;32669:47;:::i;:::-;32637:8;:80::i;66634:222::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66707:30:0;;::::1;;::::0;;;:20:::1;:30;::::0;;;;;;;:37;;66740:4:::1;-1:-1:-1::0;;66707:37:0;;::::1;::::0;::::1;::::0;;;66755:19:::1;:29:::0;;;;;;;:36;;;;::::1;::::0;;::::1;::::0;;66802:15:::1;::::0;:46;;-1:-1:-1;;;66802:46:0;;::::1;::::0;::::1;1569:51:1::0;;;;66802:15:0;;::::1;::::0;:36:::1;::::0;1542:18:1;;66802:46:0::1;1397:229:1::0;70285:97:0;70316:15;;:58;;-1:-1:-1;;;70316:58:0;;70355:10;70316:58;;;8308:51:1;70316:15:0;8375:18:1;;;8368:50;-1:-1:-1;;;;;70316:15:0;;;;:30;;8281:18:1;;70316:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;70285:97::o;62964:321::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;63067:2:::1;63048:15;63057:6:::0;63048;:15:::1;:::i;:::-;:21;;63040:62;;;::::0;-1:-1:-1;;;63040:62:0;;8881:2:1;63040:62:0::1;::::0;::::1;8863:21:1::0;8920:2;8900:18;;;8893:30;8959:29;8939:18;;;8932:57;9006:18;;63040:62:0::1;8679:351:1::0;63040:62:0::1;63129:8;63136:1;63129:6:::0;:8:::1;:::i;:::-;63113:13;:24:::0;63163:8:::1;63170:1;63163:6:::0;:8:::1;:::i;:::-;63148:12;:23:::0;;;63182:12:::1;:21:::0;;;63226:13:::1;::::0;:49:::1;::::0;63148:23;63226:31:::1;::::0;63197:6;63226:17:::1;:31::i;:::-;:35:::0;::::1;:49::i;:::-;63214:9;:61:::0;-1:-1:-1;;62964:321:0:o;66492:134::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66580:30:0;;;::::1;;::::0;;;:20:::1;:30;::::0;;;;:38;;-1:-1:-1;;66580:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;66492:134::o;63802:138::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;63895:15:::1;:37:::0;;-1:-1:-1;;;;;;63895:37:0::1;-1:-1:-1::0;;;;;63895:37:0;;;::::1;::::0;;;::::1;::::0;;63802:138::o;70524:141::-;70616:15;;:41;;;-1:-1:-1;;;70616:41:0;;;;70589:7;;-1:-1:-1;;;;;70616:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;65860:314;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;65969:15:::1;::::0;-1:-1:-1;;;;;65969:15:0;;::::1;65947:38:::0;;::::1;::::0;65939:93:::1;;;::::0;-1:-1:-1;;;65939:93:0;;9459:2:1;65939:93:0::1;::::0;::::1;9441:21:1::0;9498:2;9478:18;;;9471:30;9537:34;9517:18;;;9510:62;-1:-1:-1;;;9588:18:1;;;9581:40;9638:19;;65939:93:0::1;9257:406:1::0;65939:93:0::1;66090:15;::::0;66048:59:::1;::::0;-1:-1:-1;;;;;66090:15:0;;::::1;::::0;66048:59;::::1;::::0;::::1;::::0;66090:15:::1;::::0;66048:59:::1;66118:15;:48:::0;;-1:-1:-1;;;;;;66118:48:0::1;-1:-1:-1::0;;;;;66118:48:0;;;::::1;::::0;;;::::1;::::0;;65860:314::o;69227:130::-;69318:15;;:34;;-1:-1:-1;;;69318:34:0;;-1:-1:-1;;;;;1587:32:1;;;69318:34:0;;;1569:51:1;69297:7:0;;69318:15;;:25;;1542:18:1;;69318:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;70018:259::-;70144:15;;:28;;-1:-1:-1;;;;;;70144:28:0;;;;;1361:25:1;;;70078:18:0;;;;;;-1:-1:-1;;;;;70144:15:0;;:23;;1334:18:1;;70144:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70182:87;;;10210:25:1;;;10266:2;10251:18;;10244:34;;;10294:18;;;10287:34;;;10352:2;10337:18;;10330:34;;;70077:95:0;;-1:-1:-1;70077:95:0;;-1:-1:-1;70077:95:0;-1:-1:-1;70259:9:0;;70247:5;;70182:87;;10197:3:1;10182:19;70182:87:0;;;;;;;;70072:205;;;70018:259;:::o;40335:94::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;40400:21:::1;40418:1;40400:9;:21::i;:::-;40335:94::o:0;76119:194::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;76209:1:::1;76185:21;:25;76176:70;;;::::0;-1:-1:-1;;;76176:70:0;;10577:2:1;76176:70:0::1;::::0;::::1;10559:21:1::0;10616:2;10596:18;;;10589:30;10655:33;10635:18;;;10628:61;10706:18;;76176:70:0::1;10375:355:1::0;76176:70:0::1;39757:6:::0;;76257:48:::1;::::0;-1:-1:-1;;;;;39757:6:0;;;;76283:21:::1;76257:48:::0;::::1;;;::::0;::::1;::::0;;;76283:21;39757:6;76257:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;67992:406:::0;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;68090:6:::1;68078:8;:18;;:40;;;;;68112:6;68100:8;:18;;68078:40;68070:112;;;::::0;-1:-1:-1;;;68070:112:0;;10937:2:1;68070:112:0::1;::::0;::::1;10919:21:1::0;10976:2;10956:18;;;10949:30;11015:34;10995:18;;;10988:62;11086:29;11066:18;;;11059:57;11133:19;;68070:112:0::1;10735:423:1::0;68070:112:0::1;68213:16;;68201:8;:28:::0;68193:92:::1;;;::::0;-1:-1:-1;;;68193:92:0;;11365:2:1;68193:92:0::1;::::0;::::1;11347:21:1::0;11404:2;11384:18;;;11377:30;11443:34;11423:18;;;11416:62;-1:-1:-1;;;11494:18:1;;;11487:49;11553:19;;68193:92:0::1;11163:415:1::0;68193:92:0::1;68335:16;::::0;68301:51:::1;::::0;68325:8;;68301:51:::1;::::0;;;::::1;68363:16;:27:::0;67992:406::o;29032:104::-;29088:13;29121:7;29114:14;;;;;:::i;67176:263::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;67283:13:::1;-1:-1:-1::0;;;;;67275:21:0::1;:4;-1:-1:-1::0;;;;;67275:21:0::1;::::0;67267:110:::1;;;::::0;-1:-1:-1;;;67267:110:0;;11785:2:1;67267:110:0::1;::::0;::::1;11767:21:1::0;11824:2;11804:18;;;11797:30;11863:34;11843:18;;;11836:62;11934:34;11914:18;;;11907:62;-1:-1:-1;;;11985:19:1;;;11978:43;12038:19;;67267:110:0::1;11583:480:1::0;67267:110:0::1;67390:41;67419:4;67425:5;67390:28;:41::i;:::-;67176:263:::0;;:::o;68538:108::-;68611:15;;:27;;;-1:-1:-1;;;68611:27:0;;;;68584:7;;-1:-1:-1;;;;;68611:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;33250:413;23419:10;33343:4;33387:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;33387:34:0;;;;;;;;;;33440:35;;;;33432:85;;;;-1:-1:-1;;;33432:85:0;;12270:2:1;33432:85:0;;;12252:21:1;12309:2;12289:18;;;12282:30;12348:34;12328:18;;;12321:62;-1:-1:-1;;;12399:18:1;;;12392:35;12444:19;;33432:85:0;12068:401:1;33432:85:0;33553:67;23419:10;33576:7;33604:15;33585:16;:34;33553:8;:67::i;:::-;-1:-1:-1;33651:4:0;;33250:413;-1:-1:-1;;;33250:413:0:o;69075:147::-;69168:15;;:47;;-1:-1:-1;;;69168:47:0;;-1:-1:-1;;;;;1587:32:1;;;69168:47:0;;;1569:51:1;69144:7:0;;69168:15;;:38;;1542:18:1;;69168:47:0;1397:229:1;30444:175:0;30530:4;30547:42;23419:10;30571:9;30582:6;30547:9;:42::i;63293:249::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;63392:1:::1;63374:14;:19;;63366:63;;;::::0;-1:-1:-1;;;63366:63:0;;12676:2:1;63366:63:0::1;::::0;::::1;12658:21:1::0;12715:2;12695:18;;;12688:30;12754:33;12734:18;;;12727:61;12805:18;;63366:63:0::1;12474:355:1::0;63366:63:0::1;63466:68;63518:5;63466:33;63484:14;63466:13;30021:12:::0;;;29933:108;63466:13:::1;:17:::0;::::1;:33::i;:::-;:37:::0;::::1;:68::i;:::-;63440:23;:94:::0;-1:-1:-1;63293:249:0:o;69365:318::-;69640:15;;:35;;-1:-1:-1;;;69640:35:0;;-1:-1:-1;;;;;1587:32:1;;;69640:35:0;;;1569:51:1;69461:7:0;;;;;;;;;;;;;;;;69640:15;;;:26;;1542:18:1;;69640:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69633:42;;;;;;;;;;;;;;;;69365:318;;;;;;;;;:::o;67452:118::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;67531:18:::1;:31:::0;67452:118::o;66182:298::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66275:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:40;::::1;;:28;::::0;;::::1;:40;;::::0;66267:103:::1;;;::::0;-1:-1:-1;;;66267:103:0;;13722:2:1;66267:103:0::1;::::0;::::1;13704:21:1::0;13761:2;13741:18;;;13734:30;13800:34;13780:18;;;13773:62;-1:-1:-1;;;13851:18:1;;;13844:48;13909:19;;66267:103:0::1;13520:414:1::0;66267:103:0::1;-1:-1:-1::0;;;;;66381:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;66381:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;66438:34;;1163:41:1;;;66438:34:0::1;::::0;1136:18:1;66438:34:0::1;;;;;;;66182:298:::0;;:::o;66864:304::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;66981:9:::1;66977:115;66996:19:::0;;::::1;66977:115;;;67072:8;67037:19;:32;67057:8;;67066:1;67057:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67037:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;67037:32:0;:43;;-1:-1:-1;;67037:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;67017:3;::::1;::::0;::::1;:::i;:::-;;;;66977:115;;;;67109:51;67141:8;;67151;67109:51;;;;;;;;:::i;:::-;;;;;;;;66864:304:::0;;;:::o;70893:171::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;70970:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;70970:32:0::1;-1:-1:-1::0;;;;70970:32:0;;::::1;;::::0;;71018:38:::1;::::0;::::1;::::0;::::1;::::0;70994:8;1188:14:1;1181:22;1163:41;;1151:2;1136:18;;1023:187;71018:38:0::1;;;;;;;;70893:171:::0;:::o;63550:240::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;63653:1:::1;63637:12;:17;;63629:61;;;::::0;-1:-1:-1;;;63629:61:0;;12676:2:1;63629:61:0::1;::::0;::::1;12658:21:1::0;12715:2;12695:18;;;12688:30;12754:33;12734:18;;;12727:61;12805:18;;63629:61:0::1;12474:355:1::0;63629:61:0::1;63716:66;63766:5;63716:31;63734:12;63716:13;30021:12:::0;;;29933:108;63716:66:::1;63701:12;:81:::0;-1:-1:-1;63550:240:0:o;76321:339::-;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;76423:4:::1;-1:-1:-1::0;;;;;76403:25:0;::::1;::::0;76395:82:::1;;;::::0;-1:-1:-1;;;76395:82:0;;15212:2:1;76395:82:0::1;::::0;::::1;15194:21:1::0;15251:2;15231:18;;;15224:30;15290:34;15270:18;;;15263:62;-1:-1:-1;;;15341:18:1;;;15334:42;15393:19;;76395:82:0::1;15010:408:1::0;76395:82:0::1;76496:41;::::0;-1:-1:-1;;;76496:41:0;;76531:4:::1;76496:41;::::0;::::1;1569:51:1::0;76540:1:0::1;::::0;-1:-1:-1;;;;;76496:26:0;::::1;::::0;::::1;::::0;1542:18:1;;76496:41:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;76488:74;;;::::0;-1:-1:-1;;;76488:74:0;;15625:2:1;76488:74:0::1;::::0;::::1;15607:21:1::0;15664:2;15644:18;;;15637:30;-1:-1:-1;;;15683:18:1;;;15676:46;15739:18;;76488:74:0::1;15423:340:1::0;76488:74:0::1;76582:8;-1:-1:-1::0;;;;;76575:25:0::1;;76601:7;39757:6:::0;;-1:-1:-1;;;;;39757:6:0;;39684:87;76601:7:::1;76610:41;::::0;-1:-1:-1;;;76610:41:0;;76645:4:::1;76610:41;::::0;::::1;1569:51:1::0;-1:-1:-1;;;;;76610:26:0;::::1;::::0;::::1;::::0;1542:18:1;;76610:41:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76575:77;::::0;-1:-1:-1;;;;;;76575:77:0::1;::::0;;;;;;-1:-1:-1;;;;;15960:32:1;;;76575:77:0::1;::::0;::::1;15942:51:1::0;16009:18;;;16002:34;15915:18;;76575:77:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;70390:126::-:0;70469:15;;:39;;;-1:-1:-1;;;70469:39:0;;;;70445:7;;-1:-1:-1;;;;;70469:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;68406:124;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;68480:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;68480:42:0;;::::1;::::0;::::1;1361:25:1::0;;;-1:-1:-1;;;;;68480:15:0;;::::1;::::0;:31:::1;::::0;1334:18:1;;68480:42:0::1;1215:177:1::0;69688:325:0;69965:15;;:40;;-1:-1:-1;;;69965:40:0;;;;;1361:25:1;;;69789:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;69965:15:0;;;;:33;;1334:18:1;;69965:40:0;1215:177:1;40584:192:0;39757:6;;-1:-1:-1;;;;;39757:6:0;23419:10;39904:23;39896:68;;;;-1:-1:-1;;;39896:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40673:22:0;::::1;40665:73;;;::::0;-1:-1:-1;;;40665:73:0;;16249:2:1;40665:73:0::1;::::0;::::1;16231:21:1::0;16288:2;16268:18;;;16261:30;16327:34;16307:18;;;16300:62;-1:-1:-1;;;16378:18:1;;;16371:36;16424:19;;40665:73:0::1;16047:402:1::0;40665:73:0::1;40749:19;40759:8;40749:9;:19::i;10696:98::-:0;10754:7;10781:5;10785:1;10781;:5;:::i;:::-;10774:12;10696:98;-1:-1:-1;;;10696:98:0:o;36934:380::-;-1:-1:-1;;;;;37070:19:0;;37062:68;;;;-1:-1:-1;;;37062:68:0;;16656:2:1;37062:68:0;;;16638:21:1;16695:2;16675:18;;;16668:30;16734:34;16714:18;;;16707:62;-1:-1:-1;;;16785:18:1;;;16778:34;16829:19;;37062:68:0;16454:400:1;37062:68:0;-1:-1:-1;;;;;37149:21:0;;37141:68;;;;-1:-1:-1;;;37141:68:0;;17061:2:1;37141:68:0;;;17043:21:1;17100:2;17080:18;;;17073:30;17139:34;17119:18;;;17112:62;-1:-1:-1;;;17190:18:1;;;17183:32;17232:19;;37141:68:0;16859:398:1;37141:68:0;-1:-1:-1;;;;;37222:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;37274:32;;1361:25:1;;;37274:32:0;;1334:18:1;37274:32:0;;;;;;;36934:380;;;:::o;71072:1908::-;-1:-1:-1;;;;;71204:18:0;;71196:68;;;;-1:-1:-1;;;71196:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;71283:16:0;;71275:64;;;;-1:-1:-1;;;71275:64:0;;;;;;;:::i;:::-;71355:6;71365:1;71355:11;71352:92;;71383:28;71399:4;71405:2;71409:1;71383:15;:28::i;:::-;71072:1908;;;:::o;71352:92::-;-1:-1:-1;;;;;71459:31:0;;;;;;:25;:31;;;;;;;;:64;;;;-1:-1:-1;;;;;;71496:26:0;;;;;;:20;:26;;;;;;;;71495:27;71459:64;:95;;;;-1:-1:-1;;;;;;71529:24:0;;;;;;:20;:24;;;;;;;;71528:25;71459:95;71456:229;;;71588:23;;71578:6;:33;;71570:103;;;;-1:-1:-1;;;71570:103:0;;18274:2:1;71570:103:0;;;18256:21:1;18313:2;18293:18;;;18286:30;18352:34;18332:18;;;18325:62;18423:27;18403:18;;;18396:55;18468:19;;71570:103:0;18072:421:1;71570:103:0;71743:4;71694:28;30205:18;;;;;;;;;;;71821;;71797:42;;;;;;;71876:53;;-1:-1:-1;71913:16:0;;-1:-1:-1;;;71913:16:0;;;;71912:17;71876:53;:102;;;;-1:-1:-1;;;;;;71947:31:0;;;;;;:25;:31;;;;;;;;71946:32;71876:102;:141;;;;-1:-1:-1;71996:21:0;;-1:-1:-1;;;71996:21:0;;;;71876:141;71859:233;;;72044:36;72059:20;72044:14;:36::i;:::-;-1:-1:-1;;;;;72193:25:0;;;;;;:19;:25;;;;;;;;72192:26;:54;;;;-1:-1:-1;;;;;;72223:23:0;;;;;;:19;:23;;;;;;;;72222:24;72192:54;72189:233;;;72260:12;72294:4;72283:9;;72276:6;:16;;;;:::i;:::-;72275:23;;;;:::i;:::-;72260:38;-1:-1:-1;72319:11:0;72260:38;72319:6;:11;:::i;:::-;72310:20;;72345:42;72361:4;72375;72382;72345:15;:42::i;:::-;72248:174;72189:233;72434:33;72450:4;72456:2;72460:6;72434:15;:33::i;:::-;72484:15;;-1:-1:-1;;;;;72484:15:0;:26;72519:4;72526:15;72519:4;-1:-1:-1;;;;;30205:18:0;30178:7;30205:18;;;;;;;;;;;;30104:127;72526:15;72484:58;;-1:-1:-1;;;;;;72484:58:0;;;;;;;-1:-1:-1;;;;;15960:32:1;;;72484:58:0;;;15942:51:1;16009:18;;;16002:34;15915:18;;72484:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72480:74;72568:15;;-1:-1:-1;;;;;72568:15:0;:26;72603:2;72608:13;72603:2;-1:-1:-1;;;;;30205:18:0;30178:7;30205:18;;;;;;;;;;;;30104:127;72608:13;72568:54;;-1:-1:-1;;;;;;72568:54:0;;;;;;;-1:-1:-1;;;;;15960:32:1;;;72568:54:0;;;15942:51:1;16009:18;;;16002:34;15915:18;;72568:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72564:70;72650:16;;-1:-1:-1;;;72650:16:0;;;;72646:327;;72691:16;;72722:15;;:28;;-1:-1:-1;;;;;;72722:28:0;;;;;1361:25:1;;;-1:-1:-1;;;;;72722:15:0;;;;:23;;1334:18:1;;72722:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;72722:28:0;;;;;;;;-1:-1:-1;;72722:28:0;;;;;;;;;;;;:::i;:::-;;;72718:244;;;72839:86;;;10210:25:1;;;10266:2;10251:18;;10244:34;;;10294:18;;;10287:34;;;10352:2;10337:18;;10330:34;;;72915:9:0;;72904:4;;72839:86;;10197:3:1;10182:19;72839:86:0;;;;;;;72751:184;;;72718:244;72668:305;71185:1795;;71072:1908;;;:::o;40784:173::-;40859:6;;;-1:-1:-1;;;;;40876:17:0;;;-1:-1:-1;;;;;;40876:17:0;;;;;;;40909:40;;40859:6;;;40876:17;40859:6;;40909:40;;40840:16;;40909:40;40829:128;40784:173;:::o;67578:406::-;-1:-1:-1;;;;;67669:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;67661:116;;;;-1:-1:-1;;;67661:116:0;;19301:2:1;67661:116:0;;;19283:21:1;19340:2;19320:18;;;19313:30;19379:34;19359:18;;;19352:62;19450:33;19430:18;;;19423:61;19501:19;;67661:116:0;19099:427:1;67661:116:0;-1:-1:-1;;;;;67788:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;67788:39:0;;;;;;;;;;;;67840:79;;67865:15;;:42;;-1:-1:-1;;;67865:42:0;;-1:-1:-1;;;;;1587:32:1;;;67865:42:0;;;1569:51:1;67865:15:0;;;;:36;;1542:18:1;;67865:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67840:79;67936:40;;;;;;-1:-1:-1;;;;;67936:40:0;;;;;;;;67578:406;;:::o;11434:98::-;11492:7;11519:5;11523:1;11519;:5;:::i;11833:98::-;11891:7;11918:5;11922:1;11918;:5;:::i;34153:733::-;-1:-1:-1;;;;;34293:20:0;;34285:70;;;;-1:-1:-1;;;34285:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34374:23:0;;34366:71;;;;-1:-1:-1;;;34366:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34534:17:0;;34510:21;34534:17;;;;;;;;;;;34570:23;;;;34562:74;;;;-1:-1:-1;;;34562:74:0;;19733:2:1;34562:74:0;;;19715:21:1;19772:2;19752:18;;;19745:30;19811:34;19791:18;;;19784:62;-1:-1:-1;;;19862:18:1;;;19855:36;19908:19;;34562:74:0;19531:402:1;34562:74:0;-1:-1:-1;;;;;34672:17:0;;;:9;:17;;;;;;;;;;;34692:22;;;34672:42;;34736:20;;;;;;;;:30;;34708:6;;34672:9;34736:30;;34708:6;;34736:30;:::i;:::-;;;;;;;;34801:9;-1:-1:-1;;;;;34784:35:0;34793:6;-1:-1:-1;;;;;34784:35:0;;34812:6;34784:35;;;;1361:25:1;;1349:2;1334:18;;1215:177;72988:1866:0;62878:16;:23;;-1:-1:-1;;;;62878:23:0;-1:-1:-1;;;62878:23:0;;;73277:12:::1;::::0;73255:9:::1;::::0;62878:23;;73230:60:::1;::::0;:42:::1;::::0;73255:16:::1;::::0;73269:1:::1;73255:13;:16::i;:::-;73230:20:::0;;:24:::1;:42::i;:60::-;73195:95:::0;-1:-1:-1;73339:14:0::1;73356:45;73195:95:::0;73356:20;:45:::1;:::i;:::-;73339:62:::0;-1:-1:-1;73702:21:0::1;73768:39;73339:62:::0;73801:4:::1;73768:16;:39::i;:::-;73890:20;73913:36;73935:14:::0;73913:21:::1;:36;:::i;:::-;73890:59;;74091:29;74123:70;74158:34;74179:12;;74158:16;74172:1;74158:9;;:13;;:16;;;;:::i;:::-;:20:::0;::::1;:34::i;:::-;74140:12;::::0;74123:30:::1;::::0;:12;;:16:::1;:30::i;:70::-;74091:102;;74251:61;74264:24;74290:21;74251:12;:61::i;:::-;74356:23;74382:90;74459:12;;74382:72;74426:27;74440:12;;74426:9;;:13;;:27;;;;:::i;:::-;74382:39;:12:::0;74399:21;74382:16:::1;:39::i;:90::-;74483:15;::::0;:41:::1;::::0;74356:116;;-1:-1:-1;;;;;;74483:15:0::1;::::0;:41;::::1;;;::::0;74356:116;;74483:15:::1;:41:::0;:15;:41;74356:116;74483:15;:41;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;74615:15:0::1;::::0;74607:51:::1;::::0;74557:21:::1;::::0;74537:17:::1;::::0;-1:-1:-1;;;;;74615:15:0;;::::1;::::0;74557:21;;74537:17;74607:51;74537:17;74607:51;74557:21;74615:15;74607:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74589:69;;;74674:7;74671:96;;;74698:57;74712:31;74719:24:::0;74712:6;:31:::1;:::i;:::-;74698:57;::::0;;20322:25:1;;;20378:2;20363:18;;20356:34;;;20295:18;74698:57:0::1;;;;;;;74671:96;74792:54;::::0;;20322:25:1;;;20378:2;20363:18;;20356:34;;;74792:54:0::1;::::0;20295:18:1;74792:54:0::1;;;;;;;-1:-1:-1::0;;62924:16:0;:24;;-1:-1:-1;;;;62924:24:0;;;-1:-1:-1;;;;;;;72988:1866:0:o;74862:707::-;75037:16;;;75051:1;75037:16;;;;;;;;75013:21;;75037:16;;;;;;;;;;-1:-1:-1;75037:16:0;75013:40;;75082:4;75064;75069:1;75064:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;75064:23:0;;;:7;;;;;;;;;;:23;;;;75108:15;;:22;;;-1:-1:-1;;;75108:22:0;;;;:15;;;;;:20;;:22;;;;;75064:7;;75108:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75098:4;75103:1;75098:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;75098:32:0;;;:7;;;;;;;;;;:32;;;;75179:15;;75164:4;30771:7;30798:18;;;:11;:18;;;;;;75179:15;;;;30798:27;;;;;;75199:11;-1:-1:-1;75143:156:0;;;75257:15;;75225:62;;75242:4;;-1:-1:-1;;;;;75257:15:0;-1:-1:-1;;75225:8:0;:62::i;:::-;75337:15;;:214;;-1:-1:-1;;;75337:214:0;;-1:-1:-1;;;;;75337:15:0;;;;:66;;:214;;75418:11;;75337:15;;75488:4;;75507:3;;75525:15;;75337:214;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74930:639;74862:707;;:::o;11077:98::-;11135:7;11162:5;11166:1;11162;:5;:::i;75720:391::-;75841:15;;-1:-1:-1;;;;;75841:15:0;:31;75880:9;75913:4;75933:11;75841:15;;76045:7;39757:6;;-1:-1:-1;;;;;39757:6:0;;39684:87;76045:7;75841:252;;;;;;-1:-1:-1;;;;;;75841:252:0;;;-1:-1:-1;;;;;22133:15:1;;;75841:252:0;;;22115:34:1;22165:18;;;22158:34;;;;22208:18;;;22201:34;;;;22251:18;;;22244:34;22315:15;;;22294:19;;;22287:44;76067:15:0;22347:19:1;;;22340:35;22049:19;;75841:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1631:456::-;1708:6;1716;1724;1777:2;1765:9;1756:7;1752:23;1748:32;1745:52;;;1793:1;1790;1783:12;1745:52;1832:9;1819:23;1851:31;1876:5;1851:31;:::i;:::-;1901:5;-1:-1:-1;1958:2:1;1943:18;;1930:32;1971:33;1930:32;1971:33;:::i;:::-;1631:456;;2023:7;;-1:-1:-1;;;2077:2:1;2062:18;;;;2049:32;;1631:456::o;2526:247::-;2585:6;2638:2;2626:9;2617:7;2613:23;2609:32;2606:52;;;2654:1;2651;2644:12;2606:52;2693:9;2680:23;2712:31;2737:5;2712:31;:::i;2986:248::-;3054:6;3062;3115:2;3103:9;3094:7;3090:23;3086:32;3083:52;;;3131:1;3128;3121:12;3083:52;-1:-1:-1;;3154:23:1;;;3224:2;3209:18;;;3196:32;;-1:-1:-1;2986:248:1:o;3239:118::-;3325:5;3318:13;3311:21;3304:5;3301:32;3291:60;;3347:1;3344;3337:12;3362:382;3427:6;3435;3488:2;3476:9;3467:7;3463:23;3459:32;3456:52;;;3504:1;3501;3494:12;3456:52;3543:9;3530:23;3562:31;3587:5;3562:31;:::i;:::-;3612:5;-1:-1:-1;3669:2:1;3654:18;;3641:32;3682:30;3641:32;3682:30;:::i;:::-;3731:7;3721:17;;;3362:382;;;;;:::o;4009:180::-;4068:6;4121:2;4109:9;4100:7;4096:23;4092:32;4089:52;;;4137:1;4134;4127:12;4089:52;-1:-1:-1;4160:23:1;;4009:180;-1:-1:-1;4009:180:1:o;5124:750::-;5216:6;5224;5232;5285:2;5273:9;5264:7;5260:23;5256:32;5253:52;;;5301:1;5298;5291:12;5253:52;5341:9;5328:23;5370:18;5411:2;5403:6;5400:14;5397:34;;;5427:1;5424;5417:12;5397:34;5465:6;5454:9;5450:22;5440:32;;5510:7;5503:4;5499:2;5495:13;5491:27;5481:55;;5532:1;5529;5522:12;5481:55;5572:2;5559:16;5598:2;5590:6;5587:14;5584:34;;;5614:1;5611;5604:12;5584:34;5669:7;5662:4;5652:6;5649:1;5645:14;5641:2;5637:23;5633:34;5630:47;5627:67;;;5690:1;5687;5680:12;5627:67;5721:4;5713:13;;;;-1:-1:-1;5745:6:1;-1:-1:-1;;5786:20:1;;5773:34;5816:28;5773:34;5816:28;:::i;:::-;5863:5;5853:15;;;5124:750;;;;;:::o;5879:241::-;5935:6;5988:2;5976:9;5967:7;5963:23;5959:32;5956:52;;;6004:1;6001;5994:12;5956:52;6043:9;6030:23;6062:28;6084:5;6062:28;:::i;6125:388::-;6193:6;6201;6254:2;6242:9;6233:7;6229:23;6225:32;6222:52;;;6270:1;6267;6260:12;6222:52;6309:9;6296:23;6328:31;6353:5;6328:31;:::i;:::-;6378:5;-1:-1:-1;6435:2:1;6420:18;;6407:32;6448:33;6407:32;6448:33;:::i;6518:380::-;6597:1;6593:12;;;;6640;;;6661:61;;6715:4;6707:6;6703:17;6693:27;;6661:61;6768:2;6760:6;6757:14;6737:18;6734:38;6731:161;;6814:10;6809:3;6805:20;6802:1;6795:31;6849:4;6846:1;6839:15;6877:4;6874:1;6867:15;6731:161;;6518:380;;;:::o;7312:184::-;7382:6;7435:2;7423:9;7414:7;7410:23;7406:32;7403:52;;;7451:1;7448;7441:12;7403:52;-1:-1:-1;7474:16:1;;7312:184;-1:-1:-1;7312:184:1:o;7501:356::-;7703:2;7685:21;;;7722:18;;;7715:30;7781:34;7776:2;7761:18;;7754:62;7848:2;7833:18;;7501:356::o;7862:127::-;7923:10;7918:3;7914:20;7911:1;7904:31;7954:4;7951:1;7944:15;7978:4;7975:1;7968:15;7994:125;8059:9;;;8080:10;;;8077:36;;;8093:18;;:::i;8429:245::-;8496:6;8549:2;8537:9;8528:7;8524:23;8520:32;8517:52;;;8565:1;8562;8555:12;8517:52;8597:9;8591:16;8616:28;8638:5;8616:28;:::i;9035:217::-;9075:1;9101;9091:132;;9145:10;9140:3;9136:20;9133:1;9126:31;9180:4;9177:1;9170:15;9208:4;9205:1;9198:15;9091:132;-1:-1:-1;9237:9:1;;9035:217::o;9668:306::-;9756:6;9764;9772;9825:2;9813:9;9804:7;9800:23;9796:32;9793:52;;;9841:1;9838;9831:12;9793:52;9870:9;9864:16;9854:26;;9920:2;9909:9;9905:18;9899:25;9889:35;;9964:2;9953:9;9949:18;9943:25;9933:35;;9668:306;;;;;:::o;12834:681::-;12965:6;12973;12981;12989;12997;13005;13013;13021;13074:3;13062:9;13053:7;13049:23;13045:33;13042:53;;;13091:1;13088;13081:12;13042:53;13123:9;13117:16;13142:31;13167:5;13142:31;:::i;:::-;13192:5;13182:15;;;13237:2;13226:9;13222:18;13216:25;13206:35;;13281:2;13270:9;13266:18;13260:25;13250:35;;13325:2;13314:9;13310:18;13304:25;13294:35;;13369:3;13358:9;13354:19;13348:26;13338:36;;13414:3;13403:9;13399:19;13393:26;13383:36;;13459:3;13448:9;13444:19;13438:26;13428:36;;13504:3;13493:9;13489:19;13483:26;13473:36;;12834:681;;;;;;;;;;;:::o;13939:127::-;14000:10;13995:3;13991:20;13988:1;13981:31;14031:4;14028:1;14021:15;14055:4;14052:1;14045:15;14071:135;14110:3;14131:17;;;14128:43;;14151:18;;:::i;:::-;-1:-1:-1;14198:1:1;14187:13;;14071:135::o;14211:794::-;14433:2;14445:21;;;14418:18;;14501:22;;;14385:4;14580:6;14554:2;14539:18;;14385:4;14614:304;14628:6;14625:1;14622:13;14614:304;;;14703:6;14690:20;14723:31;14748:5;14723:31;:::i;:::-;-1:-1:-1;;;;;14779:31:1;14767:44;;14834:4;14893:15;;;;14858:12;;;;14807:1;14643:9;14614:304;;;14618:3;14935;14927:11;;;;14990:6;14983:14;14976:22;14969:4;14958:9;14954:20;14947:52;14211:794;;;;;;:::o;17262:401::-;17464:2;17446:21;;;17503:2;17483:18;;;17476:30;17542:34;17537:2;17522:18;;17515:62;-1:-1:-1;;;17608:2:1;17593:18;;17586:35;17653:3;17638:19;;17262:401::o;17668:399::-;17870:2;17852:21;;;17909:2;17889:18;;;17882:30;17948:34;17943:2;17928:18;;17921:62;-1:-1:-1;;;18014:2:1;17999:18;;17992:33;18057:3;18042:19;;17668:399::o;18498:168::-;18571:9;;;18602;;18619:15;;;18613:22;;18599:37;18589:71;;18640:18;;:::i;18671:128::-;18738:9;;;18759:11;;;18756:37;;;18773:18;;:::i;20533:251::-;20603:6;20656:2;20644:9;20635:7;20631:23;20627:32;20624:52;;;20672:1;20669;20662:12;20624:52;20704:9;20698:16;20723:31;20748:5;20723:31;:::i;20789:980::-;21051:4;21099:3;21088:9;21084:19;21130:6;21119:9;21112:25;21156:2;21194:6;21189:2;21178:9;21174:18;21167:34;21237:3;21232:2;21221:9;21217:18;21210:31;21261:6;21296;21290:13;21327:6;21319;21312:22;21365:3;21354:9;21350:19;21343:26;;21404:2;21396:6;21392:15;21378:29;;21425:1;21435:195;21449:6;21446:1;21443:13;21435:195;;;21514:13;;-1:-1:-1;;;;;21510:39:1;21498:52;;21605:15;;;;21570:12;;;;21546:1;21464:9;21435:195;;;-1:-1:-1;;;;;;;21686:32:1;;;;21681:2;21666:18;;21659:60;-1:-1:-1;;;21750:3:1;21735:19;21728:35;21647:3;20789:980;-1:-1:-1;;;20789:980:1:o

Swarm Source

ipfs://309b824c057f57f409eab9a399f885ed0c7c78b7847e6a2923185ae0494805df
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.