ETH Price: $3,349.84 (-1.15%)

Token

Empire Capital (ECC)
 

Overview

Max Total Supply

12,941,317.963994432 ECC

Holders

82

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,365.032274727 ECC

Value
$0.00
0xed3fa506d4881c2d0848b44209192d53745def79
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ECC

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

/*

 Website: https://ecc.capital/
 Telegram: https://t.me/ecc_capital
 Twitter: https://twitter.com/EmpireCapital_
 Discord: https://discord.gg/rxmmc2syU2

 Empire Capital Token takes our platform into the DeFi 3.0 future and affords users 
 the opportunity to earn yield on their crypto assets through staking & farming just
 by holding a single asset. There is a wealth of opportunity across all these chains 
 to earn high ROI through yield farming.

*/

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

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    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 {}
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(
                oldAllowance >= value,
                "SafeERC20: decreased allowance below zero"
            );
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(
                token,
                abi.encodeWithSelector(
                    token.approve.selector,
                    spender,
                    newAllowance
                )
            );
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

contract Controller is Ownable {
    mapping(address => bool) operator;
    event operatorCreated(address _operator, bool _whiteList);

    modifier onlyOperator() {
        require(operator[msg.sender], "Only-operator");
        _;
    }

    constructor() {
        operator[msg.sender] = true;
    }

    function setOperator(address _operator, bool _whiteList) public onlyOwner {
        operator[_operator] = _whiteList;
        emit operatorCreated(_operator, _whiteList);
    }
}

contract ECC is Ownable, IERC20, Controller {
    using SafeERC20 for IERC20;
    using Address for address payable;
    
    address UNISWAPROUTER = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ZERO = 0x0000000000000000000000000000000000000000;

    string private _name = "Empire Capital";
    string private _symbol = "ECC";

    uint256 public treasuryFeeBPS = 1000;
    uint256 public dividendFeeBPS = 900;
    uint256 public burnFeeBPS = 100;
    uint256 public totalFeeBPS = 1000;

    uint256 public swapTokensAtAmount = 10000 * (10**9);
    uint256 public lastSwapTime;
    bool swapAllToken = false;

    bool public swapEnabled = true;
    bool public taxEnabled = true;

    uint256 private _totalSupply;
    bool private swapping;

    address public treasuryWallet;
    address public bridgeContract;

    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) private _whiteList;
    mapping(address => bool) isBlacklisted;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );
    event SwapEnabled(bool enabled);
    event TaxEnabled(bool enabled);
    event BlacklistEnabled(bool enabled);
    event BridgeContractUpdate(address _bridgeContract);

    DividendTracker public dividendTracker;
    IUniswapV2Router02 public uniswapV2Router;

    address public uniswapV2Pair;

    uint256 public maxTxBPS = 10000;
    uint256 public maxWalletBPS = 10000;

    bool isOpen = false;

    mapping(address => bool) private _isExcludedFromMaxTx;
    mapping(address => bool) private _isExcludedFromMaxWallet;

    constructor(address _treasuryWallet, address[] memory whitelistAddress) {
        treasuryWallet = _treasuryWallet;
        includeToWhiteList(whitelistAddress);

        dividendTracker = new DividendTracker(address(this), UNISWAPROUTER);

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(UNISWAPROUTER);

        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        dividendTracker.excludeFromDividends(address(dividendTracker), true);
        dividendTracker.excludeFromDividends(address(this), true);
        dividendTracker.excludeFromDividends(owner(), true);
        dividendTracker.excludeFromDividends(address(_uniswapV2Router), true);

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

        excludeFromMaxTx(owner(), true);
        excludeFromMaxTx(address(this), true);
        excludeFromMaxTx(address(dividendTracker), true);
        excludeFromMaxTx(address(_treasuryWallet), true);

        excludeFromMaxWallet(owner(), true);
        excludeFromMaxWallet(address(this), true);
        excludeFromMaxWallet(address(dividendTracker), true);
        excludeFromMaxWallet(address(_treasuryWallet), true);
    }

    receive() external payable {}

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

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

    function decimals() public pure returns (uint8) {
        return 9;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        public
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addedValue
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        returns (bool)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "ECC: decreased allowance below zero"
        );
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        return true;
    }

    function transfer(address recipient, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    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,
            "ECC: transfer amount exceeds allowance"
        );
        _approve(sender, _msgSender(), currentAllowance - amount);
        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        require(
            isOpen ||
                sender == owner() ||
                recipient == owner() ||
                _whiteList[sender] ||
                _whiteList[recipient],
            "Not Open"
        );

        require(!isBlacklisted[sender], "ECC: Sender is blacklisted");
        require(!isBlacklisted[recipient], "ECC: Recipient is blacklisted");

        require(sender != address(0), "ECC: transfer from the zero address");
        require(recipient != address(0), "ECC: transfer to the zero address");

        uint256 _maxTxAmount = (totalSupply() * maxTxBPS) / 10000;
        uint256 _maxWallet = (totalSupply() * maxWalletBPS) / 10000;
        require(
            amount <= _maxTxAmount || _isExcludedFromMaxTx[sender],
            "TX Limit Exceeded"
        );

        if (
            sender != owner() &&
            recipient != address(this) &&
            recipient != address(DEAD) &&
            recipient != uniswapV2Pair
        ) {
            uint256 currentBalance = balanceOf(recipient);
            require(
                _isExcludedFromMaxWallet[recipient] ||
                    (currentBalance + amount <= _maxWallet)
            );
        }

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ECC: transfer amount exceeds balance"
        );

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            swapEnabled && // True
            canSwap && // true
            !swapping && // swapping=false !false true
            !automatedMarketMakerPairs[sender] && // no swap on remove liquidity step 1 or DEX buy
            sender != address(uniswapV2Router) && // no swap on remove liquidity step 2
            sender != owner() &&
            recipient != owner()
        ) {
            swapping = true;

            if (!swapAllToken) {
                contractTokenBalance = swapTokensAtAmount;
            }
            _executeSwap(contractTokenBalance);

            lastSwapTime = block.timestamp;
            swapping = false;
        }

        bool takeFee;

        if (
            sender == address(uniswapV2Pair) ||
            recipient == address(uniswapV2Pair)
        ) {
            takeFee = true;
        }

        if (_isExcludedFromFees[sender] || _isExcludedFromFees[recipient]) {
            takeFee = false;
        }

        if (swapping || !taxEnabled) {
            takeFee = false;
        }

        if (takeFee) {
            uint256 fees = (amount * totalFeeBPS) / 10000;
            amount -= fees;

            uint256 burnAmount = (fees * burnFeeBPS) / 10000;
            uint256 reflectionAmount = (fees * dividendFeeBPS) / 10000;

            if (sender == address(uniswapV2Pair)) {
                _totalSupply -= burnAmount; // 1% burn
                _balances[address(dividendTracker)] += reflectionAmount; //9% reflection
                dividendTracker.deposit(reflectionAmount); // distrubute reflections
            } else if (recipient == address(uniswapV2Pair)) {
                _executeTransfer(sender, address(this), fees);
            }
        }

        _executeTransfer(sender, recipient, amount);

        //Cross chain reflections
        if (recipient == bridgeContract) {
            uint256 reflectionCalc = (dividendTracker.balanceOf(
                bridgeContract
            ) + balanceOf(bridgeContract));
            dividendTracker.setBalance(payable(bridgeContract), reflectionCalc);
        } else {
            dividendTracker.setBalance(
                payable(recipient),
                balanceOf(recipient)
            );
        }
        dividendTracker.setBalance(payable(sender), balanceOf(sender));
    }

    function _executeTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        require(sender != address(0), "ECC: transfer from the zero address");
        require(recipient != address(0), "ECC: transfer to the zero address");
        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ECC: transfer amount exceeds balance"
        );
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;
        emit Transfer(sender, recipient, amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        require(owner != address(0), "ECC: approve from the zero address");
        require(spender != address(0), "ECC: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _mint(address account, uint256 amount) private {
        require(account != address(0), "ECC: mint to the zero address");
        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) private {
        require(account != address(0), "ECC: burn from the zero address");
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ECC: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;
        emit Transfer(account, address(0), amount);
    }

    function swapTokensForNative(uint256 tokens) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokens);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokens,
            0, // accept any amount of native
            path,
            address(this),
            block.timestamp
        );
    }

    function includeToWhiteList(address[] memory _users) private {
        for (uint8 i = 0; i < _users.length; i++) {
            _whiteList[_users[i]] = true;
        }
    }

    function _executeSwap(uint256 tokens) private {
        if (tokens == 0) {
            return;
        }
        uint256 swapTokensCapital;
        if (address(treasuryWallet) != address(0)) {
            swapTokensCapital = (tokens * treasuryFeeBPS) / totalFeeBPS;
        }

        uint256 initNativeBal = address(this).balance;

        swapTokensForNative(swapTokensCapital);

        uint256 afterSwapBal = address(this).balance;
        uint256 nativeSwapped = (afterSwapBal - initNativeBal);

        if (nativeSwapped > 0) {
            payable(treasuryWallet).sendValue(nativeSwapped);
        }
    }

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

    function manualSendDividend(uint256 amount, address holder)
        external
        onlyOwner
    {
        dividendTracker.manualSendDividend(amount, holder);
    }

    function excludeFromDividends(address account, bool excluded)
        public
        onlyOwner
    {
        dividendTracker.excludeFromDividends(account, excluded);
    }

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

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "ECC: automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;
        if (value) {
            dividendTracker.excludeFromDividends(pair, true);
        } else {
            dividendTracker.excludeFromDividends(pair, false);
        }
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function claim() public {
        dividendTracker.processAccount(payable(_msgSender()));
    }

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

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

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

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

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

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

    function isExcludedFromMaxTx(address account) public view returns (bool) {
        return _isExcludedFromMaxTx[account];
    }

    function isExcludedFromMaxWallet(address account) public view returns (bool) {
        return _isExcludedFromMaxWallet[account];
    }

    //OWNER 
    function updateUniswapV2Router(address newAddress) external onlyOwner {
        require(
            newAddress != address(uniswapV2Router),
            "ECC: the router is already set to the new address"
        );
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
        address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory())
            .createPair(address(this), uniswapV2Router.WETH());
        uniswapV2Pair = _uniswapV2Pair;
    }

    function adminWhiteList(address[] calldata _users) public onlyOwner {
        for (uint8 i = 0; i < _users.length; i++) {
            _whiteList[_users[i]] = true;
        }
    }

    function setSwapEnabled(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
        emit SwapEnabled(_enabled);
    }

    function setTaxEnabled(bool _enabled) external onlyOwner {
        taxEnabled = _enabled;
        emit TaxEnabled(_enabled);
    }

    function setWallet(address payable _treasuryWallet) external onlyOwner {
        treasuryWallet = _treasuryWallet;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "ECC: DEX pair can not be removed");
        _setAutomatedMarketMakerPair(pair, value);
    }

    function setFee(
        uint256 _treasuryFee,
        uint256 _dividendFee,
        uint256 _burnFee
    ) external onlyOwner {
        require(_treasuryFee <= 1000, "Fees must be below 10%");
        require(_dividendFee <= 1000, "Fees must be below 10%");
        require(_burnFee <= 1000, "Fees must be below 10%");

        treasuryFeeBPS = _treasuryFee;
        dividendFeeBPS = _dividendFee;
        burnFeeBPS = _burnFee;

        totalFeeBPS = _treasuryFee + _dividendFee + _burnFee;
    }

    function updateDividendSettings(
        bool _swapEnabled,
        uint256 _swapTokensAtAmount,
        bool _swapAllToken
    ) external onlyOwner {
        swapEnabled = _swapEnabled;
        swapTokensAtAmount = _swapTokensAtAmount;
        swapAllToken = _swapAllToken;
    }

    function setMaxTxBPS(uint256 bps) external onlyOwner {
        maxTxBPS = bps;
    }

    function setMaxWalletBPS(uint256 bps) external onlyOwner {
        maxWalletBPS = bps;
    }

    function setBridgeContract(address _bridgeContract) external onlyOwner {
        bridgeContract = _bridgeContract;
        emit BridgeContractUpdate(_bridgeContract);
    }

    function excludeFromAll(address account, bool excluded) external onlyOwner {
        excludeFromFees(account, excluded);
        excludeFromMaxTx(account, excluded);
        excludeFromMaxWallet(account, excluded);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(
            _isExcludedFromFees[account] != excluded,
            "ECC: account is already set to requested state"
        );
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

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

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

    function rescueToken(address _token, uint256 _amount) external onlyOwner {
        IERC20(_token).safeTransfer(msg.sender, _amount);
    }

    function rescueETH(uint256 _amount) external onlyOwner {
        payable(msg.sender).sendValue(_amount);
    }

    function blackList(address _user) external onlyOwner {
        require(!isBlacklisted[_user], "user already blacklisted");
        isBlacklisted[_user] = true;
    }

    function removeFromBlacklist(address _user) external onlyOwner {
        require(isBlacklisted[_user], "user already whitelisted");
        isBlacklisted[_user] = false;
    }

    function blackListMany(address[] memory _users) external onlyOwner {
        for (uint8 i = 0; i < _users.length; i++) {
            isBlacklisted[_users[i]] = true;
        }
    }

    function unBlackListMany(address[] memory _users) external onlyOwner {
        for (uint8 i = 0; i < _users.length; i++) {
            isBlacklisted[_users[i]] = false;
        }
    }

    function airDrop(address[] calldata recipients, uint256[] calldata values) external onlyOwner {
        _approve(owner(), owner(), totalSupply());
        for (uint256 i = 0; i < recipients.length; i++) {
            transferFrom(msg.sender, recipients[i], values[i] * 10 ** decimals());
        }
    }

    //DIVIDEND
    function setBridgeBalance(address _user, uint256 _balance) public onlyOwner {
        dividendTracker.setBalance(payable(_user), _balance);
    }

    function manualECCDividends(uint256 newDividends) external onlyOwner {
        //Transfer tokens to div tracker before updating dividends
        dividendTracker.deposit(newDividends);
    }

    //BRIDGE OPERATOR ONLY REQUIRES 2BA - TWO BLOCKCHAIN AUTHENTICATION
    function processClaim(address _account) external onlyOperator {
        dividendTracker.processAccount(payable(_account));
    }

    function unlock(address account, uint256 amount) external onlyOperator {
        _mint(account, amount);
        dividendTracker.setBalance(payable(account), balanceOf(account));

        uint256 bridgeReflections = (dividendTracker.balanceOf(bridgeContract) - amount);
        dividendTracker.setBalance(payable(bridgeContract), bridgeReflections);
    }

    function lock(address account, uint256 amount) external onlyOperator {
        _burn(account, amount);

        if (account != bridgeContract) {
            dividendTracker.setBalance(payable(account), balanceOf(account));
        }

        uint256 bridgeReflections = (dividendTracker.balanceOf(bridgeContract) + amount);
        dividendTracker.setBalance(payable(bridgeContract), bridgeReflections);
    }

    //LAUNCH 
    function openTrading() external onlyOwner {
        require(!isOpen, "Trading already started");
        isOpen = true;
        maxTxBPS = 200;
        maxWalletBPS = 200;
        treasuryFeeBPS = 9800;
        dividendFeeBPS = 0;
        burnFeeBPS = 0;
        totalFeeBPS = 9800;
    }

     function antiBot() external onlyOwner {      
        uint256 botTokens = balanceOf(address(this));
        botTokensforNative(botTokens);

        maxTxBPS = 200;
        maxWalletBPS = 200;
        treasuryFeeBPS = 1000;
        dividendFeeBPS = 900;
        burnFeeBPS = 100;
        totalFeeBPS = 1000;
    }

    function botTokensforNative(uint256 tokens) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokens);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokens,
            0, // accept any amount of native
            path,
            address(owner()),
            block.timestamp
        );
    }

    function pauseTrading() external onlyOwner {
        require(isOpen, "Trading not started");
        isOpen = false;
    }

    function init(address _bridgeContract, uint256 _balance) external onlyOwner {
        bridgeContract = _bridgeContract;
        _whiteList[_bridgeContract] = true;
        excludeFromFees(_bridgeContract, true);
        excludeFromMaxWallet(_bridgeContract, true);
        excludeFromMaxTx(_bridgeContract, true);
        setBridgeBalance(_bridgeContract, _balance);
        setOperator(_bridgeContract, true);
    }

    //To clone this contract requires ECC bridging infrastructure, please contact ECC team @ https://t.me/ecc_capital
}

contract DividendTracker is Ownable, IERC20 {
    using SafeERC20 for IERC20;
    using Address for address payable;
    address UNISWAPROUTER;

    string private _name = "ECC_DividendTracker";
    string private _symbol = "ECC_DividendTracker";

    uint256 public lastProcessedIndex;
    uint256 public lastProcessedBalance;

    uint256 private _totalSupply;
    mapping(address => uint256) private _balances;

    uint256 private constant magnitude = type(uint88).max;
    uint256 private magnifiedDividendPerShare;
    uint256 public totalDividendsDistributed;
    uint256 public totalDividendsWithdrawn;

    address public tokenAddress;

    mapping(address => bool) public excludedFromDividends;
    mapping(address => int256) private magnifiedDividendCorrections;
    mapping(address => uint256) private withdrawnDividends;
    mapping(address => uint256) private lastClaimTimes;

    event DividendsDistributed(address indexed from, uint256 weiAmount);
    event DividendWithdrawn(address indexed to, uint256 weiAmount);
    event ExcludeFromDividends(address indexed account, bool excluded);
    event Claim(address indexed account, uint256 amount);

    struct AccountInfo {
        address account;
        uint256 withdrawableDividends;
        uint256 totalDividends;
        uint256 lastClaimTime;
    }

    constructor(address _tokenAddress, address _uniswapRouter) {
        tokenAddress = _tokenAddress;
        UNISWAPROUTER = _uniswapRouter;
    }

    function deposit(uint256 newDividends) external onlyOwner {
        distributeDividends(newDividends);
    }

    function distributeDividends(uint256 newDividends) private {
        require(_totalSupply > 0);
        if (newDividends > 0) {
            magnifiedDividendPerShare =
                magnifiedDividendPerShare +
                ((newDividends * magnitude) / _totalSupply);
            emit DividendsDistributed(msg.sender, newDividends);
            totalDividendsDistributed += newDividends;
        }
    }

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

    function excludeFromDividends(address account, bool excluded)
        external
        onlyOwner
    {
        require(
            excludedFromDividends[account] != excluded,
            "ECC_DividendTracker: account already set to requested state"
        );
        excludedFromDividends[account] = excluded;
        if (excluded) {
            _setBalance(account, 0);
        } else {
            uint256 newBalance = IERC20(tokenAddress).balanceOf(account);
            _setBalance(account, newBalance);
        }
        emit ExcludeFromDividends(account, excluded);
    }

    function isExcludedFromDividends(address account)
        public
        view
        returns (bool)
    {
        return excludedFromDividends[account];
    }

    function manualSendDividendECC(uint256 amount, address holder)
        external
        onlyOwner
    {
        IERC20(address(tokenAddress)).safeTransfer(address(holder), amount);
    }

    function manualSendDividend(uint256 amount, address holder)
        external
        onlyOwner
    {
        uint256 contractETHBalance = address(this).balance;
        uint256 transferAmount = amount > 0 ? amount : contractETHBalance;
        payable(holder).sendValue(transferAmount);
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = _balances[account];
        if (newBalance > currentBalance) {
            uint256 addAmount = newBalance - currentBalance;
            _mint(account, addAmount);
        } else if (newBalance < currentBalance) {
            uint256 subAmount = currentBalance - newBalance;
            _burn(account, subAmount);
        }
    }

    function _mint(address account, uint256 amount) private {
        require(
            account != address(0),
            "ECC_DividendTracker: mint to the zero address"
        );
        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
        magnifiedDividendCorrections[account] =
            magnifiedDividendCorrections[account] -
            int256(magnifiedDividendPerShare * amount);
    }

    function _burn(address account, uint256 amount) private {
        require(
            account != address(0),
            "ECC_DividendTracker: burn from the zero address"
        );
        uint256 accountBalance = _balances[account];
        require(
            accountBalance >= amount,
            "ECC_DividendTracker: burn amount exceeds balance"
        );
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;
        emit Transfer(account, address(0), amount);
        magnifiedDividendCorrections[account] =
            magnifiedDividendCorrections[account] +
            int256(magnifiedDividendPerShare * amount);
    }

    function processAccount(address payable account)
        public
        onlyOwner
        returns (bool)
    {
        uint256 amount = _withdrawDividendOfUser(account);
        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount);
            return true;
        }
        return false;
    }

    function _withdrawDividendOfUser(address payable account)
        private
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(account);
        if (_withdrawableDividend > 0) {
            IERC20(address(tokenAddress)).safeTransfer(
                address(account),
                _withdrawableDividend
            );

            withdrawnDividends[account] += _withdrawableDividend;
            totalDividendsWithdrawn += _withdrawableDividend;
            emit DividendWithdrawn(account, _withdrawableDividend);

            return _withdrawableDividend;
        }
        return 0;
    }

    function withdrawableDividendOf(address account)
        public
        view
        returns (uint256)
    {
        return accumulativeDividendOf(account) - withdrawnDividends[account];
    }

    function withdrawnDividendOf(address account)
        public
        view
        returns (uint256)
    {
        return withdrawnDividends[account];
    }

    function accumulativeDividendOf(address account)
        public
        view
        returns (uint256)
    {
        int256 a = int256(magnifiedDividendPerShare * balanceOf(account));
        int256 b = magnifiedDividendCorrections[account];
        return uint256(a + b) / magnitude;
    }

    function getAccountInfo(address account)
        public
        view
        returns (
            address,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        AccountInfo memory info;
        info.account = account;
        info.withdrawableDividends = withdrawableDividendOf(account);
        info.totalDividends = accumulativeDividendOf(account);
        info.lastClaimTime = lastClaimTimes[account];
        return (
            info.account,
            info.withdrawableDividends,
            info.totalDividends,
            info.lastClaimTime,
            totalDividendsWithdrawn
        );
    }

    function getLastClaimTime(address account) public view returns (uint256) {
        return lastClaimTimes[account];
    }

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

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

    function decimals() public pure returns (uint8) {
        return 9;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function transfer(address, uint256) public pure override returns (bool) {
        revert("ECC_DividendTracker: method not implemented");
    }

    function allowance(address, address)
        public
        pure
        override
        returns (uint256)
    {
        revert("ECC_DividendTracker: method not implemented");
    }

    function approve(address, uint256) public pure override returns (bool) {
        revert("ECC_DividendTracker: method not implemented");
    }

    function transferFrom(
        address,
        address,
        uint256
    ) public pure override returns (bool) {
        revert("ECC_DividendTracker: method not implemented");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_treasuryWallet","type":"address"},{"internalType":"address[]","name":"whitelistAddress","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"BlacklistEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_bridgeContract","type":"address"}],"name":"BridgeContractUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TaxEnabled","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_whiteList","type":"bool"}],"name":"operatorCreated","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"adminWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"blackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"blackListMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bridgeContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFeeBPS","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":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dividendFeeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"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":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"address","name":"account","type":"address"}],"name":"getDivsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLastClaimTime","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":"_bridgeContract","type":"address"},{"internalType":"uint256","name":"_balance","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDividends","type":"uint256"}],"name":"manualECCDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"holder","type":"address"}],"name":"manualSendDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletBPS","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":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"processClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueToken","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":"_user","type":"address"},{"internalType":"uint256","name":"_balance","type":"uint256"}],"name":"setBridgeBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bridgeContract","type":"address"}],"name":"setBridgeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_dividendFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"setMaxTxBPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"setMaxWalletBPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_whiteList","type":"bool"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTaxEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_treasuryWallet","type":"address"}],"name":"setWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeBPS","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":"treasuryFeeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"unBlackListMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_swapEnabled","type":"bool"},{"internalType":"uint256","name":"_swapTokensAtAmount","type":"uint256"},{"internalType":"bool","name":"_swapAllToken","type":"bool"}],"name":"updateDividendSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawnDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

600280546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560038054821661dead17905560048054909116905560c0604052600e60808190526d115b5c1a5c994810d85c1a5d185b60921b60a09081526200006f916005919062000af2565b506040805180820190915260038082526245434360e81b60209092019182526200009c9160069162000af2565b506103e860078190556103846008556064600955600a556509184e72a000600b55600d805462ffffff191662010100179055612710601a819055601b55601c805460ff19169055348015620000f057600080fd5b5060405162006e9438038062006e94833981016040819052620001139162000bd9565b6200011e3362000620565b336000908152600160208190526040909120805460ff19169091179055600f8054610100600160a81b0319166101006001600160a01b03851602179055620001668162000670565b60025460405130916001600160a01b031690620001839062000b81565b6001600160a01b03928316815291166020820152604001604051809103906000f080158015620001b7573d6000803e3d6000fd5b50601780546001600160a01b0319166001600160a01b039283161790556002546040805163c45a015560e01b815290519190921691600091839163c45a01559160048083019260209291908290030181865afa1580156200021c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000242919062000cc2565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000290573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b6919062000cc2565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000304573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032a919062000cc2565b601880546001600160a01b038086166001600160a01b0319928316179092556019805492841692909116919091179055905062000369816001620006e9565b60175460405162241fbd60e51b81526001600160a01b03909116600482018190526001602483015290630483f7a090604401600060405180830381600087803b158015620003b657600080fd5b505af1158015620003cb573d6000803e3d6000fd5b505060175460405162241fbd60e51b8152306004820152600160248201526001600160a01b039091169250630483f7a09150604401600060405180830381600087803b1580156200041b57600080fd5b505af115801562000430573d6000803e3d6000fd5b50506017546001600160a01b03169150630483f7a090506200045a6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b158015620004a357600080fd5b505af1158015620004b8573d6000803e3d6000fd5b505060175460405162241fbd60e51b81526001600160a01b038681166004830152600160248301529091169250630483f7a09150604401600060405180830381600087803b1580156200050a57600080fd5b505af11580156200051f573d6000803e3d6000fd5b505050506200053f62000537620008c460201b60201c565b6001620008d3565b6200054c306001620008d3565b60175462000565906001600160a01b03166001620008d3565b62000572846001620008d3565b62000591620005896000546001600160a01b031690565b600162000a06565b6200059e30600162000a06565b601754620005b7906001600160a01b0316600162000a06565b620005c484600162000a06565b620005e3620005db6000546001600160a01b031690565b600162000a7c565b620005f030600162000a7c565b60175462000609906001600160a01b0316600162000a7c565b6200061684600162000a7c565b5050505062000d67565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b81518160ff161015620006e557600160156000848460ff16815181106200069e576200069e62000ce7565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580620006dc8162000cfd565b91505062000673565b5050565b6001600160a01b03821660009081526014602052604090205481151560ff909116151503620007855760405162461bcd60e51b815260206004820152603d60248201527f4543433a206175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c756500000060648201526084015b60405180910390fd5b6001600160a01b0382166000908152601460205260409020805460ff19168215801591909117909155620008205760175460405162241fbd60e51b81526001600160a01b0384811660048301526001602483015290911690630483f7a090604401600060405180830381600087803b1580156200080157600080fd5b505af115801562000816573d6000803e3d6000fd5b5050505062000888565b60175460405162241fbd60e51b81526001600160a01b0384811660048301526000602483015290911690630483f7a090604401600060405180830381600087803b1580156200086e57600080fd5b505af115801562000883573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000546001600160a01b031690565b6000546001600160a01b031633146200091e5760405162461bcd60e51b8152602060048201819052602482015260008051602062006e7483398151915260448201526064016200077c565b6001600160a01b03821660009081526013602052604090205481151560ff909116151503620009a75760405162461bcd60e51b815260206004820152602e60248201527f4543433a206163636f756e7420697320616c72656164792073657420746f207260448201526d657175657374656420737461746560901b60648201526084016200077c565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b0316331462000a515760405162461bcd60e51b8152602060048201819052602482015260008051602062006e7483398151915260448201526064016200077c565b6001600160a01b03919091166000908152601d60205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331462000ac75760405162461bcd60e51b8152602060048201819052602482015260008051602062006e7483398151915260448201526064016200077c565b6001600160a01b03919091166000908152601e60205260409020805460ff1916911515919091179055565b82805462000b009062000d2b565b90600052602060002090601f01602090048101928262000b24576000855562000b6f565b82601f1062000b3f57805160ff191683800117855562000b6f565b8280016001018555821562000b6f579182015b8281111562000b6f57825182559160200191906001019062000b52565b5062000b7d92915062000b8f565b5090565b611a05806200546f83390190565b5b8082111562000b7d576000815560010162000b90565b80516001600160a01b038116811462000bbe57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121562000bed57600080fd5b62000bf88362000ba6565b602084810151919350906001600160401b038082111562000c1857600080fd5b818601915086601f83011262000c2d57600080fd5b81518181111562000c425762000c4262000bc3565b8060051b604051601f19603f8301168101818110858211171562000c6a5762000c6a62000bc3565b60405291825284820192508381018501918983111562000c8957600080fd5b938501935b8285101562000cb25762000ca28562000ba6565b8452938501939285019262000c8e565b8096505050505050509250929050565b60006020828403121562000cd557600080fd5b62000ce08262000ba6565b9392505050565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff810362000d2257634e487b7160e01b600052601160045260246000fd5b60010192915050565b600181811c9082168062000d4057607f821691505b60208210810362000d6157634e487b7160e01b600052602260045260246000fd5b50919050565b6146f88062000d776000396000f3fe6080604052600436106104405760003560e01c806370a0823111610234578063aafd847a1161012e578063cd596583116100b6578063deaa59df1161007a578063deaa59df14610d6d578063e01af92c14610d8d578063e2f4560514610dad578063f2fde38b14610dc3578063f4571c4914610de357600080fd5b8063cd59658314610ca7578063d2fcc00114610cc7578063d4c989d314610ce7578063dabae90b14610d07578063dd62ed3e14610d2757600080fd5b8063c3033aeb116100fd578063c3033aeb14610c12578063c6af580b14610c32578063c705c56914610c52578063c9567bf914610c72578063cafe66c914610c8757600080fd5b8063aafd847a14610b8c578063b62496f514610bac578063b80b6e8914610bdc578063c024666814610bf257600080fd5b80638da5cb5b116101bc578063a457c2d711610180578063a457c2d714610aec578063a680e0bc14610b0c578063a8b9d24014610b2c578063a9059cbb14610b4c578063aa4e8c4a14610b6c57600080fd5b80638da5cb5b14610a595780638e12694414610a7757806395d89b4114610a975780639a7a23d614610aac5780639e252f0014610acc57600080fd5b80637dfcbe34116102035780637dfcbe34146109ce5780637eee288d146109e357806385b3b2eb14610a03578063870bd30b14610a235780638ab3016f14610a4357600080fd5b806370a0823114610931578063715018a614610951578063744d1591146109665780637b510fe81461097c57600080fd5b80634626402b116103455780635937ea6c116102cd578063658c27a911610291578063658c27a91461086057806365b8dbc01461089957806368c51e35146108b95780636dd3d39f146108d95780636ddd17131461091257600080fd5b80635937ea6c146107ca5780635b65b9ab146107e05780635e843ad2146108005780636164e5f91461082057806365216a411461084057600080fd5b80634e71d92d116103145780634e71d92d146107265780634fbee1931461073b578063537df3b614610774578063558a72971461079457806357777d31146107b457600080fd5b80634626402b146106a15780634838d165146106c6578063497d166b146106e657806349bd5a5e1461070657600080fd5b806323b872dd116103c8578063313ce56711610397578063313ce5671461060f57806333f3d6281461062b57806337eb15281461064b5780633950935114610661578063399ae7241461068157600080fd5b806323b872dd1461058f57806327ce0147146105af578063282d3fdf146105cf5780632c1f5216146105ef57600080fd5b80630dd871571161040f5780630dd87157146104e95780631031e36e1461050d5780631694505e1461052257806318160ddd1461055a57806322eb59a51461056f57600080fd5b80630483f7a01461044c57806306fdde031461046e578063095ea7b3146104995780630b26cf66146104c957600080fd5b3661044757005b600080fd5b34801561045857600080fd5b5061046c610467366004613e52565b610e03565b005b34801561047a57600080fd5b50610483610ea1565b6040516104909190613ebb565b60405180910390f35b3480156104a557600080fd5b506104b96104b4366004613eee565b610f33565b6040519015158152602001610490565b3480156104d557600080fd5b5061046c6104e4366004613f1a565b610f4a565b3480156104f557600080fd5b506104ff600c5481565b604051908152602001610490565b34801561051957600080fd5b5061046c610fc9565b34801561052e57600080fd5b50601854610542906001600160a01b031681565b6040516001600160a01b039091168152602001610490565b34801561056657600080fd5b50600e546104ff565b34801561057b57600080fd5b5061046c61058a366004613f37565b611047565b34801561059b57600080fd5b506104b96105aa366004613f50565b6110d2565b3480156105bb57600080fd5b506104ff6105ca366004613f1a565b611183565b3480156105db57600080fd5b5061046c6105ea366004613eee565b6111f3565b3480156105fb57600080fd5b50601754610542906001600160a01b031681565b34801561061b57600080fd5b5060405160098152602001610490565b34801561063757600080fd5b5061046c610646366004613eee565b6113a8565b34801561065757600080fd5b506104ff600a5481565b34801561066d57600080fd5b506104b961067c366004613eee565b6113ea565b34801561068d57600080fd5b5061046c61069c366004613eee565b611421565b3480156106ad57600080fd5b50600f546105429061010090046001600160a01b031681565b3480156106d257600080fd5b5061046c6106e1366004613f1a565b6114bb565b3480156106f257600080fd5b5061046c610701366004613fdd565b611572565b34801561071257600080fd5b50601954610542906001600160a01b031681565b34801561073257600080fd5b5061046c611619565b34801561074757600080fd5b506104b9610756366004613f1a565b6001600160a01b031660009081526013602052604090205460ff1690565b34801561078057600080fd5b5061046c61078f366004613f1a565b611698565b3480156107a057600080fd5b5061046c6107af366004613e52565b61174b565b3480156107c057600080fd5b506104ff601a5481565b3480156107d657600080fd5b506104ff60075481565b3480156107ec57600080fd5b5061046c6107fb36600461401f565b6117d8565b34801561080c57600080fd5b5061046c61081b36600461404b565b611894565b34801561082c57600080fd5b5061046c61083b366004613e52565b6118ec565b34801561084c57600080fd5b5061046c61085b36600461408d565b611934565b34801561086c57600080fd5b506104b961087b366004613f1a565b6001600160a01b03166000908152601d602052604090205460ff1690565b3480156108a557600080fd5b5061046c6108b4366004613f1a565b6119ff565b3480156108c557600080fd5b5061046c6108d4366004613f37565b611c77565b3480156108e557600080fd5b506104b96108f4366004613f1a565b6001600160a01b03166000908152601e602052604090205460ff1690565b34801561091e57600080fd5b50600d546104b990610100900460ff1681565b34801561093d57600080fd5b506104ff61094c366004613f1a565b611ca6565b34801561095d57600080fd5b5061046c611cc1565b34801561097257600080fd5b506104ff601b5481565b34801561098857600080fd5b5061099c610997366004613f1a565b611cf7565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610490565b3480156109da57600080fd5b5061046c611d81565b3480156109ef57600080fd5b5061046c6109fe366004613eee565b611de4565b348015610a0f57600080fd5b506104ff610a1e366004613f1a565b611f15565b348015610a2f57600080fd5b50600d546104b99062010000900460ff1681565b348015610a4f57600080fd5b506104ff60095481565b348015610a6557600080fd5b506000546001600160a01b0316610542565b348015610a8357600080fd5b5061046c610a923660046140f9565b611f48565b348015610aa357600080fd5b50610483611fab565b348015610ab857600080fd5b5061046c610ac7366004613e52565b611fba565b348015610ad857600080fd5b5061046c610ae7366004613f37565b61204c565b348015610af857600080fd5b506104b9610b07366004613eee565b612080565b348015610b1857600080fd5b506104ff610b27366004613f1a565b612119565b348015610b3857600080fd5b506104ff610b47366004613f1a565b61214c565b348015610b5857600080fd5b506104b9610b67366004613eee565b61217f565b348015610b7857600080fd5b5061046c610b87366004613f37565b61218c565b348015610b9857600080fd5b506104ff610ba7366004613f1a565b6121bb565b348015610bb857600080fd5b506104b9610bc7366004613f1a565b60146020526000908152604090205460ff1681565b348015610be857600080fd5b506104ff60085481565b348015610bfe57600080fd5b5061046c610c0d366004613e52565b6121ee565b348015610c1e57600080fd5b5061046c610c2d366004614134565b6122fe565b348015610c3e57600080fd5b5061046c610c4d3660046141f9565b612396565b348015610c5e57600080fd5b506104b9610c6d366004613f1a565b61240b565b348015610c7e57600080fd5b5061046c61247a565b348015610c9357600080fd5b5061046c610ca2366004613eee565b612525565b348015610cb357600080fd5b50601054610542906001600160a01b031681565b348015610cd357600080fd5b5061046c610ce2366004613e52565b612588565b348015610cf357600080fd5b5061046c610d02366004613e52565b6125dd565b348015610d1357600080fd5b5061046c610d22366004613f1a565b612632565b348015610d3357600080fd5b506104ff610d42366004614216565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b348015610d7957600080fd5b5061046c610d88366004613f1a565b6126d1565b348015610d9957600080fd5b5061046c610da83660046141f9565b612723565b348015610db957600080fd5b506104ff600b5481565b348015610dcf57600080fd5b5061046c610dde366004613f1a565b612796565b348015610def57600080fd5b5061046c610dfe366004614134565b61282e565b6000546001600160a01b03163314610e365760405162461bcd60e51b8152600401610e2d90614244565b60405180910390fd5b60175460405162241fbd60e51b81526001600160a01b038481166004830152831515602483015290911690630483f7a0906044015b600060405180830381600087803b158015610e8557600080fd5b505af1158015610e99573d6000803e3d6000fd5b505050505050565b606060058054610eb090614279565b80601f0160208091040260200160405190810160405280929190818152602001828054610edc90614279565b8015610f295780601f10610efe57610100808354040283529160200191610f29565b820191906000526020600020905b815481529060010190602001808311610f0c57829003601f168201915b5050505050905090565b6000610f403384846128c6565b5060015b92915050565b6000546001600160a01b03163314610f745760405162461bcd60e51b8152600401610e2d90614244565b601080546001600160a01b0319166001600160a01b0383169081179091556040519081527fcad1438f5cb825c93eb9491e0dfe462cab3cc7f2717a8d1beae01c3b45dc7a68906020015b60405180910390a150565b6000546001600160a01b03163314610ff35760405162461bcd60e51b8152600401610e2d90614244565b601c5460ff1661103b5760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81b9bdd081cdd185c9d1959606a1b6044820152606401610e2d565b601c805460ff19169055565b6000546001600160a01b031633146110715760405162461bcd60e51b8152600401610e2d90614244565b60175460405163b6b55f2560e01b8152600481018390526001600160a01b039091169063b6b55f2590602401600060405180830381600087803b1580156110b757600080fd5b505af11580156110cb573d6000803e3d6000fd5b5050505050565b60006110df8484846129df565b6001600160a01b0384166000908152601260209081526040808320338452909152902054828110156111625760405162461bcd60e51b815260206004820152602660248201527f4543433a207472616e7366657220616d6f756e74206578636565647320616c6c6044820152656f77616e636560d01b6064820152608401610e2d565b611176853361117186856142c9565b6128c6565b60019150505b9392505050565b6017546040516327ce014760e01b81526001600160a01b03838116600483015260009216906327ce0147906024015b602060405180830381865afa1580156111cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4491906142e0565b3360009081526001602052604090205460ff166112225760405162461bcd60e51b8152600401610e2d906142f9565b61122c8282613241565b6010546001600160a01b038381169116146112bb576017546001600160a01b031663e30443bc8361125c81611ca6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156112a257600080fd5b505af11580156112b6573d6000803e3d6000fd5b505050505b6017546010546040516370a0823160e01b81526001600160a01b039182166004820152600092849216906370a0823190602401602060405180830381865afa15801561130b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132f91906142e0565b6113399190614320565b6017546010546040516338c110ef60e21b81526001600160a01b03918216600482015260248101849052929350169063e30443bc90604401600060405180830381600087803b15801561138b57600080fd5b505af115801561139f573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031633146113d25760405162461bcd60e51b8152600401610e2d90614244565b6113e66001600160a01b038316338361337b565b5050565b3360008181526012602090815260408083206001600160a01b03871684529091528120549091610f40918590611171908690614320565b6000546001600160a01b0316331461144b5760405162461bcd60e51b8152600401610e2d90614244565b601080546001600160a01b0319166001600160a01b0384169081179091556000908152601560205260409020805460ff191660019081179091556114909083906121ee565b61149b826001612588565b6114a68260016125dd565b6114b08282612525565b6113e682600161174b565b6000546001600160a01b031633146114e55760405162461bcd60e51b8152600401610e2d90614244565b6001600160a01b03811660009081526016602052604090205460ff161561154e5760405162461bcd60e51b815260206004820152601860248201527f7573657220616c726561647920626c61636b6c697374656400000000000000006044820152606401610e2d565b6001600160a01b03166000908152601660205260409020805460ff19166001179055565b6000546001600160a01b0316331461159c5760405162461bcd60e51b8152600401610e2d90614244565b60005b60ff81168211156116145760016015600085858560ff168181106115c5576115c5614338565b90506020020160208101906115da9190613f1a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061160c8161434e565b91505061159f565b505050565b6017546001600160a01b031663807ab4f7336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015611671573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611695919061436d565b50565b6000546001600160a01b031633146116c25760405162461bcd60e51b8152600401610e2d90614244565b6001600160a01b03811660009081526016602052604090205460ff1661172a5760405162461bcd60e51b815260206004820152601860248201527f7573657220616c72656164792077686974656c697374656400000000000000006044820152606401610e2d565b6001600160a01b03166000908152601660205260409020805460ff19169055565b6000546001600160a01b031633146117755760405162461bcd60e51b8152600401610e2d90614244565b6001600160a01b038216600081815260016020908152604091829020805460ff19168515159081179091558251938452908301527f909016d36ac8832d60eca5631256110b493764cf0e9be422253d07acd86e5243910160405180910390a15050565b6000546001600160a01b031633146118025760405162461bcd60e51b8152600401610e2d90614244565b6103e88311156118245760405162461bcd60e51b8152600401610e2d9061438a565b6103e88211156118465760405162461bcd60e51b8152600401610e2d9061438a565b6103e88111156118685760405162461bcd60e51b8152600401610e2d9061438a565b600783905560088290556009819055806118828385614320565b61188c9190614320565b600a55505050565b6000546001600160a01b031633146118be5760405162461bcd60e51b8152600401610e2d90614244565b600d8054600b9390935590151560ff19931515610100029390931661ffff1990921691909117919091179055565b6000546001600160a01b031633146119165760405162461bcd60e51b8152600401610e2d90614244565b61192082826121ee565b61192a82826125dd565b6113e68282612588565b6000546001600160a01b0316331461195e5760405162461bcd60e51b8152600401610e2d90614244565b6119876119736000546001600160a01b031690565b6000546001600160a01b0316600e546128c6565b60005b838110156110cb576119ec338686848181106119a8576119a8614338565b90506020020160208101906119bd9190613f1a565b6119c96009600a61449e565b8686868181106119db576119db614338565b905060200201356105aa91906144ad565b50806119f7816144cc565b91505061198a565b6000546001600160a01b03163314611a295760405162461bcd60e51b8152600401610e2d90614244565b6018546001600160a01b0390811690821603611aa15760405162461bcd60e51b815260206004820152603160248201527f4543433a2074686520726f7574657220697320616c72656164792073657420746044820152706f20746865206e6577206164647265737360781b6064820152608401610e2d565b6018546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3601880546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a01559160048083019260209291908290030181865afa158015611b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5c91906144e5565b6001600160a01b031663c9c6539630601860009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be291906144e5565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5391906144e5565b601980546001600160a01b0319166001600160a01b03929092169190911790555050565b6000546001600160a01b03163314611ca15760405162461bcd60e51b8152600401610e2d90614244565b601b55565b6001600160a01b031660009081526011602052604090205490565b6000546001600160a01b03163314611ceb5760405162461bcd60e51b8152600401610e2d90614244565b611cf560006133cd565b565b601754604051630f6a21fd60e31b81526001600160a01b0383811660048301526000928392839283928392911690637b510fe89060240160a060405180830381865afa158015611d4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6f9190614502565b939a9299509097509550909350915050565b6000546001600160a01b03163314611dab5760405162461bcd60e51b8152600401610e2d90614244565b6000611db630611ca6565b9050611dc18161341d565b5060c8601a819055601b556103e860078190556103846008556064600955600a55565b3360009081526001602052604090205460ff16611e135760405162461bcd60e51b8152600401610e2d906142f9565b611e1d8282613550565b6017546001600160a01b031663e30443bc83611e3881611ca6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611e7e57600080fd5b505af1158015611e92573d6000803e3d6000fd5b50506017546010546040516370a0823160e01b81526001600160a01b039182166004820152600094508593509116906370a0823190602401602060405180830381865afa158015611ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0b91906142e0565b61133991906142c9565b6017546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024016111b2565b6000546001600160a01b03163314611f725760405162461bcd60e51b8152600401610e2d90614244565b6017546040516323849a5160e21b8152600481018490526001600160a01b03838116602483015290911690638e12694490604401610e6b565b606060068054610eb090614279565b6000546001600160a01b03163314611fe45760405162461bcd60e51b8152600401610e2d90614244565b6019546001600160a01b03908116908316036120425760405162461bcd60e51b815260206004820181905260248201527f4543433a2044455820706169722063616e206e6f742062652072656d6f7665646044820152606401610e2d565b6113e6828261362f565b6000546001600160a01b031633146120765760405162461bcd60e51b8152600401610e2d90614244565b61169533826137fe565b3360009081526012602090815260408083206001600160a01b0386168452909152812054828110156121005760405162461bcd60e51b815260206004820152602360248201527f4543433a2064656372656173656420616c6c6f77616e63652062656c6f77207a60448201526265726f60e81b6064820152608401610e2d565b61210f338561117186856142c9565b5060019392505050565b6017546040516329a0382f60e21b81526001600160a01b038381166004830152600092169063a680e0bc906024016111b2565b6017546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016111b2565b6000610f403384846129df565b6000546001600160a01b031633146121b65760405162461bcd60e51b8152600401610e2d90614244565b601a55565b60175460405163557ec23d60e11b81526001600160a01b038381166004830152600092169063aafd847a906024016111b2565b6000546001600160a01b031633146122185760405162461bcd60e51b8152600401610e2d90614244565b6001600160a01b03821660009081526013602052604090205481151560ff90911615150361229f5760405162461bcd60e51b815260206004820152602e60248201527f4543433a206163636f756e7420697320616c72656164792073657420746f207260448201526d657175657374656420737461746560901b6064820152608401610e2d565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b031633146123285760405162461bcd60e51b8152600401610e2d90614244565b60005b81518160ff1610156113e657600160166000848460ff168151811061235257612352614338565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061238e8161434e565b91505061232b565b6000546001600160a01b031633146123c05760405162461bcd60e51b8152600401610e2d90614244565b600d8054821515620100000262ff0000199091161790556040517f5bb2376cf656637e70e36c01d3da25685bf3b353f18681b8a5e48c7b2effe13390610fbe90831515815260200190565b60175460405163c705c56960e01b81526001600160a01b038381166004830152600092169063c705c56990602401602060405180830381865afa158015612456573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f44919061436d565b6000546001600160a01b031633146124a45760405162461bcd60e51b8152600401610e2d90614244565b601c5460ff16156124f75760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920737461727465640000000000000000006044820152606401610e2d565b601c805460ff1916600117905560c8601a819055601b55612648600781905560006008819055600955600a55565b6000546001600160a01b0316331461254f5760405162461bcd60e51b8152600401610e2d90614244565b6017546040516338c110ef60e21b81526001600160a01b038481166004830152602482018490529091169063e30443bc90604401610e6b565b6000546001600160a01b031633146125b25760405162461bcd60e51b8152600401610e2d90614244565b6001600160a01b03919091166000908152601e60205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146126075760405162461bcd60e51b8152600401610e2d90614244565b6001600160a01b03919091166000908152601d60205260409020805460ff1916911515919091179055565b3360009081526001602052604090205460ff166126615760405162461bcd60e51b8152600401610e2d906142f9565b60175460405163807ab4f760e01b81526001600160a01b0383811660048301529091169063807ab4f7906024016020604051808303816000875af11580156126ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e6919061436d565b6000546001600160a01b031633146126fb5760405162461bcd60e51b8152600401610e2d90614244565b600f80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000546001600160a01b0316331461274d5760405162461bcd60e51b8152600401610e2d90614244565b600d80548215156101000261ff00199091161790556040517fb9bbb15e341600c8d067a0cadeba219905d5ba6d422b193c9c32265d26fc51c890610fbe90831515815260200190565b6000546001600160a01b031633146127c05760405162461bcd60e51b8152600401610e2d90614244565b6001600160a01b0381166128255760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e2d565b611695816133cd565b6000546001600160a01b031633146128585760405162461bcd60e51b8152600401610e2d90614244565b60005b81518160ff1610156113e657600060166000848460ff168151811061288257612882614338565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806128be8161434e565b91505061285b565b6001600160a01b0383166129275760405162461bcd60e51b815260206004820152602260248201527f4543433a20617070726f76652066726f6d20746865207a65726f206164647265604482015261737360f01b6064820152608401610e2d565b6001600160a01b03821661297d5760405162461bcd60e51b815260206004820181905260248201527f4543433a20617070726f766520746f20746865207a65726f20616464726573736044820152606401610e2d565b6001600160a01b0383811660008181526012602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b601c5460ff16806129fd57506000546001600160a01b038481169116145b80612a1557506000546001600160a01b038381169116145b80612a3857506001600160a01b03831660009081526015602052604090205460ff165b80612a5b57506001600160a01b03821660009081526015602052604090205460ff165b612a925760405162461bcd60e51b81526020600482015260086024820152672737ba1027b832b760c11b6044820152606401610e2d565b6001600160a01b03831660009081526016602052604090205460ff1615612afb5760405162461bcd60e51b815260206004820152601a60248201527f4543433a2053656e64657220697320626c61636b6c69737465640000000000006044820152606401610e2d565b6001600160a01b03821660009081526016602052604090205460ff1615612b645760405162461bcd60e51b815260206004820152601d60248201527f4543433a20526563697069656e7420697320626c61636b6c69737465640000006044820152606401610e2d565b6001600160a01b038316612b8a5760405162461bcd60e51b8152600401610e2d9061454b565b6001600160a01b038216612bb05760405162461bcd60e51b8152600401610e2d9061458e565b6000612710601a54612bc1600e5490565b612bcb91906144ad565b612bd591906145cf565b90506000612710601b54612be8600e5490565b612bf291906144ad565b612bfc91906145cf565b90508183111580612c2557506001600160a01b0385166000908152601d602052604090205460ff165b612c655760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610e2d565b6000546001600160a01b03868116911614801590612c8c57506001600160a01b0384163014155b8015612ca657506003546001600160a01b03858116911614155b8015612cc057506019546001600160a01b03858116911614155b15612d0e576000612cd085611ca6565b6001600160a01b0386166000908152601e602052604090205490915060ff1680612d03575081612d008583614320565b11155b612d0c57600080fd5b505b6001600160a01b03851660009081526011602052604090205483811015612d475760405162461bcd60e51b8152600401610e2d906145f1565b6000612d5230611ca6565b600b54600d5491925082101590610100900460ff168015612d705750805b8015612d7f5750600f5460ff16155b8015612da457506001600160a01b03881660009081526014602052604090205460ff16155b8015612dbe57506018546001600160a01b03898116911614155b8015612dd857506000546001600160a01b03898116911614155b8015612df257506000546001600160a01b03888116911614155b15612e2c57600f805460ff19166001179055600d5460ff16612e1457600b5491505b612e1d82613917565b42600c55600f805460ff191690555b6019546000906001600160a01b038a811691161480612e5857506019546001600160a01b038981169116145b15612e61575060015b6001600160a01b03891660009081526013602052604090205460ff1680612ea057506001600160a01b03881660009081526013602052604090205460ff165b15612ea9575060005b600f5460ff1680612ec35750600d5462010000900460ff16155b15612ecc575060005b8015613020576000612710600a5489612ee591906144ad565b612eef91906145cf565b9050612efb81896142c9565b9750600061271060095483612f1091906144ad565b612f1a91906145cf565b9050600061271060085484612f2f91906144ad565b612f3991906145cf565b6019549091506001600160a01b03908116908d1603612ffb5781600e6000828254612f6491906142c9565b90915550506017546001600160a01b031660009081526011602052604081208054839290612f93908490614320565b909155505060175460405163b6b55f2560e01b8152600481018390526001600160a01b039091169063b6b55f2590602401600060405180830381600087803b158015612fde57600080fd5b505af1158015612ff2573d6000803e3d6000fd5b5050505061301c565b6019546001600160a01b03908116908c160361301c5761301c8c3085613992565b5050505b61302b898989613992565b6010546001600160a01b039081169089160361314357601054600090613059906001600160a01b0316611ca6565b6017546010546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa1580156130a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130c991906142e0565b6130d39190614320565b6017546010546040516338c110ef60e21b81526001600160a01b03918216600482015260248101849052929350169063e30443bc90604401600060405180830381600087803b15801561312557600080fd5b505af1158015613139573d6000803e3d6000fd5b50505050506131bd565b6017546001600160a01b031663e30443bc8961315e81611ca6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156131a457600080fd5b505af11580156131b8573d6000803e3d6000fd5b505050505b6017546001600160a01b031663e30443bc8a6131d881611ca6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561321e57600080fd5b505af1158015613232573d6000803e3d6000fd5b50505050505050505050505050565b6001600160a01b0382166132975760405162461bcd60e51b815260206004820152601f60248201527f4543433a206275726e2066726f6d20746865207a65726f2061646472657373006044820152606401610e2d565b6001600160a01b038216600090815260116020526040902054818110156133005760405162461bcd60e51b815260206004820181905260248201527f4543433a206275726e20616d6f756e7420657863656564732062616c616e63656044820152606401610e2d565b61330a82826142c9565b6001600160a01b038416600090815260116020526040812091909155600e80548492906133389084906142c9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016129d2565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611614908490613ab1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061345257613452614338565b6001600160a01b03928316602091820292909201810191909152601854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156134ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134cf91906144e5565b816001815181106134e2576134e2614338565b6001600160a01b03928316602091820292909201015260185461350891309116846128c6565b6018546001600160a01b031663791ac9478360008461352f6000546001600160a01b031690565b426040518663ffffffff1660e01b8152600401610e6b959493929190614635565b6001600160a01b0382166135a65760405162461bcd60e51b815260206004820152601d60248201527f4543433a206d696e7420746f20746865207a65726f20616464726573730000006044820152606401610e2d565b80600e60008282546135b89190614320565b90915550506001600160a01b038216600090815260116020526040812080548392906135e5908490614320565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b03821660009081526014602052604090205481151560ff9091161515036136c55760405162461bcd60e51b815260206004820152603d60248201527f4543433a206175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c75650000006064820152608401610e2d565b6001600160a01b0382166000908152601460205260409020805460ff1916821580159190911790915561375c5760175460405162241fbd60e51b81526001600160a01b0384811660048301526001602483015290911690630483f7a090604401600060405180830381600087803b15801561373f57600080fd5b505af1158015613753573d6000803e3d6000fd5b505050506137c2565b60175460405162241fbd60e51b81526001600160a01b0384811660048301526000602483015290911690630483f7a090604401600060405180830381600087803b1580156137a957600080fd5b505af11580156137bd573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b8047101561384e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e2d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461389b576040519150601f19603f3d011682016040523d82523d6000602084013e6138a0565b606091505b50509050806116145760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e2d565b806000036139225750565b600f5460009061010090046001600160a01b03161561395857600a5460075461394b90846144ad565b61395591906145cf565b90505b4761396282613b83565b47600061396f83836142c9565b905080156110cb57600f546110cb9061010090046001600160a01b0316826137fe565b6001600160a01b0383166139b85760405162461bcd60e51b8152600401610e2d9061454b565b6001600160a01b0382166139de5760405162461bcd60e51b8152600401610e2d9061458e565b6001600160a01b03831660009081526011602052604090205481811015613a175760405162461bcd60e51b8152600401610e2d906145f1565b613a2182826142c9565b6001600160a01b038086166000908152601160205260408082209390935590851681529081208054849290613a57908490614320565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613aa391815260200190565b60405180910390a350505050565b6000613b06826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ca79092919063ffffffff16565b8051909150156116145780806020019051810190613b24919061436d565b6116145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610e2d565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613bb857613bb8614338565b6001600160a01b03928316602091820292909201810191909152601854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c3591906144e5565b81600181518110613c4857613c48614338565b6001600160a01b039283166020918202929092010152601854613c6e91309116846128c6565b60185460405163791ac94760e01b81526001600160a01b039091169063791ac94790610e6b908590600090869030904290600401614635565b6060613cb68484600085613cbe565b949350505050565b606082471015613d1f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610e2d565b843b613d6d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e2d565b600080866001600160a01b03168587604051613d8991906146a6565b60006040518083038185875af1925050503d8060008114613dc6576040519150601f19603f3d011682016040523d82523d6000602084013e613dcb565b606091505b5091509150613ddb828286613de6565b979650505050505050565b60608315613df557508161117c565b825115613e055782518084602001fd5b8160405162461bcd60e51b8152600401610e2d9190613ebb565b6001600160a01b038116811461169557600080fd5b8035613e3f81613e1f565b919050565b801515811461169557600080fd5b60008060408385031215613e6557600080fd5b8235613e7081613e1f565b91506020830135613e8081613e44565b809150509250929050565b60005b83811015613ea6578181015183820152602001613e8e565b83811115613eb5576000848401525b50505050565b6020815260008251806020840152613eda816040850160208701613e8b565b601f01601f19169190910160400192915050565b60008060408385031215613f0157600080fd5b8235613f0c81613e1f565b946020939093013593505050565b600060208284031215613f2c57600080fd5b813561117c81613e1f565b600060208284031215613f4957600080fd5b5035919050565b600080600060608486031215613f6557600080fd5b8335613f7081613e1f565b92506020840135613f8081613e1f565b929592945050506040919091013590565b60008083601f840112613fa357600080fd5b50813567ffffffffffffffff811115613fbb57600080fd5b6020830191508360208260051b8501011115613fd657600080fd5b9250929050565b60008060208385031215613ff057600080fd5b823567ffffffffffffffff81111561400757600080fd5b61401385828601613f91565b90969095509350505050565b60008060006060848603121561403457600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561406057600080fd5b833561406b81613e44565b925060208401359150604084013561408281613e44565b809150509250925092565b600080600080604085870312156140a357600080fd5b843567ffffffffffffffff808211156140bb57600080fd5b6140c788838901613f91565b909650945060208701359150808211156140e057600080fd5b506140ed87828801613f91565b95989497509550505050565b6000806040838503121561410c57600080fd5b823591506020830135613e8081613e1f565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561414757600080fd5b823567ffffffffffffffff8082111561415f57600080fd5b818501915085601f83011261417357600080fd5b8135818111156141855761418561411e565b8060051b604051601f19603f830116810181811085821117156141aa576141aa61411e565b6040529182528482019250838101850191888311156141c857600080fd5b938501935b828510156141ed576141de85613e34565b845293850193928501926141cd565b98975050505050505050565b60006020828403121561420b57600080fd5b813561117c81613e44565b6000806040838503121561422957600080fd5b823561423481613e1f565b91506020830135613e8081613e1f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061428d57607f821691505b6020821081036142ad57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156142db576142db6142b3565b500390565b6000602082840312156142f257600080fd5b5051919050565b6020808252600d908201526c27b7363c96b7b832b930ba37b960991b604082015260600190565b60008219821115614333576143336142b3565b500190565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff8103614364576143646142b3565b60010192915050565b60006020828403121561437f57600080fd5b815161117c81613e44565b60208082526016908201527546656573206d7573742062652062656c6f772031302560501b604082015260600190565b600181815b808511156143f55781600019048211156143db576143db6142b3565b808516156143e857918102915b93841c93908002906143bf565b509250929050565b60008261440c57506001610f44565b8161441957506000610f44565b816001811461442f576002811461443957614455565b6001915050610f44565b60ff84111561444a5761444a6142b3565b50506001821b610f44565b5060208310610133831016604e8410600b8410161715614478575081810a610f44565b61448283836143ba565b8060001904821115614496576144966142b3565b029392505050565b600061117c60ff8416836143fd565b60008160001904831182151516156144c7576144c76142b3565b500290565b6000600182016144de576144de6142b3565b5060010190565b6000602082840312156144f757600080fd5b815161117c81613e1f565b600080600080600060a0868803121561451a57600080fd5b855161452581613e1f565b602087015160408801516060890151608090990151929a91995097965090945092505050565b60208082526023908201527f4543433a207472616e736665722066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526021908201527f4543433a207472616e7366657220746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6000826145ec57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526024908201527f4543433a207472616e7366657220616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156146855784516001600160a01b031683529383019391830191600101614660565b50506001600160a01b03969096166060850152505050608001529392505050565b600082516146b8818460208701613e8b565b919091019291505056fea264697066735822122095ee82686a2808aa9daf0f6806518a6f33980a7b5a72381b07b598e738d2ed4464736f6c634300080d003360c0604052601360808190527222a1a1afa234bb34b232b7322a3930b1b5b2b960691b60a090815262000036916002919062000131565b506040805180820190915260138082527222a1a1afa234bb34b232b7322a3930b1b5b2b960691b6020909201918252620000739160039162000131565b503480156200008157600080fd5b5060405162001a0538038062001a05833981016040819052620000a491620001f4565b620000af33620000e1565b600b80546001600160a01b039384166001600160a01b0319918216179091556001805492909316911617905562000268565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200013f906200022c565b90600052602060002090601f016020900481019282620001635760008555620001ae565b82601f106200017e57805160ff1916838001178555620001ae565b82800160010185558215620001ae579182015b82811115620001ae57825182559160200191906001019062000191565b50620001bc929150620001c0565b5090565b5b80821115620001bc5760008155600101620001c1565b80516001600160a01b0381168114620001ef57600080fd5b919050565b600080604083850312156200020857600080fd5b6200021383620001d7565b91506200022360208401620001d7565b90509250929050565b600181811c908216806200024157607f821691505b6020821081036200026257634e487b7160e01b600052602260045260246000fd5b50919050565b61178d80620002786000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806385a6b3ae11610104578063a8b9d240116100a2578063c705c56911610071578063c705c56914610425578063dd62ed3e14610451578063e30443bc1461045f578063f2fde38b1461047257600080fd5b8063a8b9d240146103d6578063a9059cbb14610212578063aafd847a146103e9578063b6b55f251461041257600080fd5b806395d89b41116100de57806395d89b41146103895780639d76ea58146103915780639e1e0661146103a4578063a680e0bc146103ad57600080fd5b806385a6b3ae146103485780638da5cb5b146103515780638e1269441461037657600080fd5b80633009a6091161017c57806370a082311161014b57806370a08231146102bf578063715018a6146102e85780637b510fe8146102f0578063807ab4f71461033557600080fd5b80633009a60914610271578063313ce5671461027a5780634e7b827f1461028957806365331553146102ac57600080fd5b806318160ddd116101b857806318160ddd146102355780631a09b0c51461024757806323b872dd1461025057806327ce01471461025e57600080fd5b80630483f7a0146101df57806306fdde03146101f4578063095ea7b314610212575b600080fd5b6101f26101ed366004611402565b610485565b005b6101fc610651565b6040516102099190611467565b60405180910390f35b61022561022036600461149a565b6106e3565b6040519015158152602001610209565b6006545b604051908152602001610209565b61023960055481565b6102256102203660046114c6565b61023961026c366004611507565b610742565b61023960045481565b60405160098152602001610209565b610225610297366004611507565b600c6020526000908152604090205460ff1681565b6101f26102ba366004611524565b6107ad565b6102396102cd366004611507565b6001600160a01b031660009081526007602052604090205490565b6101f26107f2565b6103036102fe366004611507565b610828565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610209565b610225610343366004611507565b6108d0565b61023960095481565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610209565b6101f2610384366004611524565b610975565b6101fc6109ca565b600b5461035e906001600160a01b031681565b610239600a5481565b6102396103bb366004611507565b6001600160a01b03166000908152600f602052604090205490565b6102396103e4366004611507565b6109d9565b6102396103f7366004611507565b6001600160a01b03166000908152600e602052604090205490565b6101f2610420366004611549565b610a0b565b610225610433366004611507565b6001600160a01b03166000908152600c602052604090205460ff1690565b610239610220366004611562565b6101f261046d36600461149a565b610a41565b6101f2610480366004611507565b610a95565b6000546001600160a01b031633146104b85760405162461bcd60e51b81526004016104af90611590565b60405180910390fd5b6001600160a01b0382166000908152600c602052604090205481151560ff90911615150361054e5760405162461bcd60e51b815260206004820152603b60248201527f4543435f4469766964656e64547261636b65723a206163636f756e7420616c7260448201527f656164792073657420746f20726571756573746564207374617465000000000060648201526084016104af565b6001600160a01b0382166000908152600c60205260409020805460ff1916821580159190911790915561058b57610586826000610b2d565b610608565b600b546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a0823190602401602060405180830381865afa1580156105d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fa91906115c5565b90506106068382610b2d565b505b816001600160a01b03167fa3c7c11b2e12c4144b09a7813f3393ba646392788638998c97be8da908cf04be82604051610645911515815260200190565b60405180910390a25050565b606060028054610660906115de565b80601f016020809104026020016040519081016040528092919081815260200182805461068c906115de565b80156106d95780601f106106ae576101008083540402835291602001916106d9565b820191906000526020600020905b8154815290600101906020018083116106bc57829003601f168201915b5050505050905090565b60405162461bcd60e51b815260206004820152602b60248201527f4543435f4469766964656e64547261636b65723a206d6574686f64206e6f742060448201526a1a5b5c1b195b595b9d195960aa1b60648201526000906084016104af565b6001600160a01b03811660009081526007602052604081205460085482916107699161162e565b6001600160a01b0384166000908152600d60205260409020549091506affffffffffffffffffffff61079b828461164d565b6107a5919061168e565b949350505050565b6000546001600160a01b031633146107d75760405162461bcd60e51b81526004016104af90611590565b600b546107ee906001600160a01b03168284610b8b565b5050565b6000546001600160a01b0316331461081c5760405162461bcd60e51b81526004016104af90611590565b6108266000610bdd565b565b6000806000806000610864604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b6001600160a01b0387168152610879876109d9565b602082015261088787610742565b60408281019182526001600160a01b03989098166000908152600f60209081529890205460608301819052825198909201519051600a5498999198909750919550909350915050565b600080546001600160a01b031633146108fb5760405162461bcd60e51b81526004016104af90611590565b600061090683610c2d565b9050801561096c576001600160a01b0383166000818152600f602052604090819020429055517f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d49061095b9084815260200190565b60405180910390a250600192915050565b50600092915050565b6000546001600160a01b0316331461099f5760405162461bcd60e51b81526004016104af90611590565b476000836109ad57816109af565b835b90506109c46001600160a01b03841682610ce2565b50505050565b606060038054610660906115de565b6001600160a01b0381166000908152600e60205260408120546109fb83610742565b610a0591906116b0565b92915050565b6000546001600160a01b03163314610a355760405162461bcd60e51b81526004016104af90611590565b610a3e81610dfb565b50565b6000546001600160a01b03163314610a6b5760405162461bcd60e51b81526004016104af90611590565b6001600160a01b0382166000908152600c602052604090205460ff166107ee576107ee8282610b2d565b6000546001600160a01b03163314610abf5760405162461bcd60e51b81526004016104af90611590565b6001600160a01b038116610b245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104af565b610a3e81610bdd565b6001600160a01b03821660009081526007602052604090205480821115610b66576000610b5a82846116b0565b90506109c48482610e91565b80821015610b86576000610b7a83836116b0565b90506109c48482610fd3565b505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b86908490611193565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080610c39836109d9565b9050801561096c57600b54610c58906001600160a01b03168483610b8b565b6001600160a01b0383166000908152600e602052604081208054839290610c809084906116c7565b9250508190555080600a6000828254610c9991906116c7565b90915550506040518181526001600160a01b038416907fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9060200160405180910390a292915050565b80471015610d325760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016104af565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610d7f576040519150601f19603f3d011682016040523d82523d6000602084013e610d84565b606091505b5050905080610b865760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016104af565b600060065411610e0a57600080fd5b8015610a3e57600654610e286affffffffffffffffffffff8361162e565b610e32919061168e565b600854610e3f91906116c7565b60085560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a28060096000828254610e8991906116c7565b909155505050565b6001600160a01b038216610efd5760405162461bcd60e51b815260206004820152602d60248201527f4543435f4469766964656e64547261636b65723a206d696e7420746f2074686560448201526c207a65726f206164647265737360981b60648201526084016104af565b8060066000828254610f0f91906116c7565b90915550506001600160a01b03821660009081526007602052604081208054839290610f3c9084906116c7565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a380600854610f90919061162e565b6001600160a01b0383166000908152600d6020526040902054610fb391906116df565b6001600160a01b039092166000908152600d602052604090209190915550565b6001600160a01b0382166110415760405162461bcd60e51b815260206004820152602f60248201527f4543435f4469766964656e64547261636b65723a206275726e2066726f6d207460448201526e6865207a65726f206164647265737360881b60648201526084016104af565b6001600160a01b038216600090815260076020526040902054818110156110c35760405162461bcd60e51b815260206004820152603060248201527f4543435f4469766964656e64547261636b65723a206275726e20616d6f756e7460448201526f20657863656564732062616c616e636560801b60648201526084016104af565b6110cd82826116b0565b6001600160a01b038416600090815260076020526040812091909155600680548492906110fb9084906116b0565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a38160085461114f919061162e565b6001600160a01b0384166000908152600d6020526040902054611172919061164d565b6001600160a01b039093166000908152600d60205260409020929092555050565b60006111e8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166112659092919063ffffffff16565b805190915015610b865780806020019051810190611206919061171e565b610b865760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104af565b6060611274848460008561127e565b90505b9392505050565b6060824710156112df5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104af565b843b61132d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104af565b600080866001600160a01b03168587604051611349919061173b565b60006040518083038185875af1925050503d8060008114611386576040519150601f19603f3d011682016040523d82523d6000602084013e61138b565b606091505b509150915061139b8282866113a6565b979650505050505050565b606083156113b5575081611277565b8251156113c55782518084602001fd5b8160405162461bcd60e51b81526004016104af9190611467565b6001600160a01b0381168114610a3e57600080fd5b8015158114610a3e57600080fd5b6000806040838503121561141557600080fd5b8235611420816113df565b91506020830135611430816113f4565b809150509250929050565b60005b8381101561145657818101518382015260200161143e565b838111156109c45750506000910152565b602081526000825180602084015261148681604085016020870161143b565b601f01601f19169190910160400192915050565b600080604083850312156114ad57600080fd5b82356114b8816113df565b946020939093013593505050565b6000806000606084860312156114db57600080fd5b83356114e6816113df565b925060208401356114f6816113df565b929592945050506040919091013590565b60006020828403121561151957600080fd5b8135611277816113df565b6000806040838503121561153757600080fd5b823591506020830135611430816113df565b60006020828403121561155b57600080fd5b5035919050565b6000806040838503121561157557600080fd5b8235611580816113df565b91506020830135611430816113df565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156115d757600080fd5b5051919050565b600181811c908216806115f257607f821691505b60208210810361161257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561164857611648611618565b500290565b600080821280156001600160ff1b038490038513161561166f5761166f611618565b600160ff1b839003841281161561168857611688611618565b50500190565b6000826116ab57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156116c2576116c2611618565b500390565b600082198211156116da576116da611618565b500190565b60008083128015600160ff1b8501841216156116fd576116fd611618565b6001600160ff1b038401831381161561171857611718611618565b50500390565b60006020828403121561173057600080fd5b8151611277816113f4565b6000825161174d81846020870161143b565b919091019291505056fea2646970667358221220d41a4b125321c9622244c62f4995400861952b768141edd16097ddc7f19e8a0364736f6c634300080d00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65720000000000000000000000003069070f3544c769baa9d9339f196a5d1cbcfd1100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106104405760003560e01c806370a0823111610234578063aafd847a1161012e578063cd596583116100b6578063deaa59df1161007a578063deaa59df14610d6d578063e01af92c14610d8d578063e2f4560514610dad578063f2fde38b14610dc3578063f4571c4914610de357600080fd5b8063cd59658314610ca7578063d2fcc00114610cc7578063d4c989d314610ce7578063dabae90b14610d07578063dd62ed3e14610d2757600080fd5b8063c3033aeb116100fd578063c3033aeb14610c12578063c6af580b14610c32578063c705c56914610c52578063c9567bf914610c72578063cafe66c914610c8757600080fd5b8063aafd847a14610b8c578063b62496f514610bac578063b80b6e8914610bdc578063c024666814610bf257600080fd5b80638da5cb5b116101bc578063a457c2d711610180578063a457c2d714610aec578063a680e0bc14610b0c578063a8b9d24014610b2c578063a9059cbb14610b4c578063aa4e8c4a14610b6c57600080fd5b80638da5cb5b14610a595780638e12694414610a7757806395d89b4114610a975780639a7a23d614610aac5780639e252f0014610acc57600080fd5b80637dfcbe34116102035780637dfcbe34146109ce5780637eee288d146109e357806385b3b2eb14610a03578063870bd30b14610a235780638ab3016f14610a4357600080fd5b806370a0823114610931578063715018a614610951578063744d1591146109665780637b510fe81461097c57600080fd5b80634626402b116103455780635937ea6c116102cd578063658c27a911610291578063658c27a91461086057806365b8dbc01461089957806368c51e35146108b95780636dd3d39f146108d95780636ddd17131461091257600080fd5b80635937ea6c146107ca5780635b65b9ab146107e05780635e843ad2146108005780636164e5f91461082057806365216a411461084057600080fd5b80634e71d92d116103145780634e71d92d146107265780634fbee1931461073b578063537df3b614610774578063558a72971461079457806357777d31146107b457600080fd5b80634626402b146106a15780634838d165146106c6578063497d166b146106e657806349bd5a5e1461070657600080fd5b806323b872dd116103c8578063313ce56711610397578063313ce5671461060f57806333f3d6281461062b57806337eb15281461064b5780633950935114610661578063399ae7241461068157600080fd5b806323b872dd1461058f57806327ce0147146105af578063282d3fdf146105cf5780632c1f5216146105ef57600080fd5b80630dd871571161040f5780630dd87157146104e95780631031e36e1461050d5780631694505e1461052257806318160ddd1461055a57806322eb59a51461056f57600080fd5b80630483f7a01461044c57806306fdde031461046e578063095ea7b3146104995780630b26cf66146104c957600080fd5b3661044757005b600080fd5b34801561045857600080fd5b5061046c610467366004613e52565b610e03565b005b34801561047a57600080fd5b50610483610ea1565b6040516104909190613ebb565b60405180910390f35b3480156104a557600080fd5b506104b96104b4366004613eee565b610f33565b6040519015158152602001610490565b3480156104d557600080fd5b5061046c6104e4366004613f1a565b610f4a565b3480156104f557600080fd5b506104ff600c5481565b604051908152602001610490565b34801561051957600080fd5b5061046c610fc9565b34801561052e57600080fd5b50601854610542906001600160a01b031681565b6040516001600160a01b039091168152602001610490565b34801561056657600080fd5b50600e546104ff565b34801561057b57600080fd5b5061046c61058a366004613f37565b611047565b34801561059b57600080fd5b506104b96105aa366004613f50565b6110d2565b3480156105bb57600080fd5b506104ff6105ca366004613f1a565b611183565b3480156105db57600080fd5b5061046c6105ea366004613eee565b6111f3565b3480156105fb57600080fd5b50601754610542906001600160a01b031681565b34801561061b57600080fd5b5060405160098152602001610490565b34801561063757600080fd5b5061046c610646366004613eee565b6113a8565b34801561065757600080fd5b506104ff600a5481565b34801561066d57600080fd5b506104b961067c366004613eee565b6113ea565b34801561068d57600080fd5b5061046c61069c366004613eee565b611421565b3480156106ad57600080fd5b50600f546105429061010090046001600160a01b031681565b3480156106d257600080fd5b5061046c6106e1366004613f1a565b6114bb565b3480156106f257600080fd5b5061046c610701366004613fdd565b611572565b34801561071257600080fd5b50601954610542906001600160a01b031681565b34801561073257600080fd5b5061046c611619565b34801561074757600080fd5b506104b9610756366004613f1a565b6001600160a01b031660009081526013602052604090205460ff1690565b34801561078057600080fd5b5061046c61078f366004613f1a565b611698565b3480156107a057600080fd5b5061046c6107af366004613e52565b61174b565b3480156107c057600080fd5b506104ff601a5481565b3480156107d657600080fd5b506104ff60075481565b3480156107ec57600080fd5b5061046c6107fb36600461401f565b6117d8565b34801561080c57600080fd5b5061046c61081b36600461404b565b611894565b34801561082c57600080fd5b5061046c61083b366004613e52565b6118ec565b34801561084c57600080fd5b5061046c61085b36600461408d565b611934565b34801561086c57600080fd5b506104b961087b366004613f1a565b6001600160a01b03166000908152601d602052604090205460ff1690565b3480156108a557600080fd5b5061046c6108b4366004613f1a565b6119ff565b3480156108c557600080fd5b5061046c6108d4366004613f37565b611c77565b3480156108e557600080fd5b506104b96108f4366004613f1a565b6001600160a01b03166000908152601e602052604090205460ff1690565b34801561091e57600080fd5b50600d546104b990610100900460ff1681565b34801561093d57600080fd5b506104ff61094c366004613f1a565b611ca6565b34801561095d57600080fd5b5061046c611cc1565b34801561097257600080fd5b506104ff601b5481565b34801561098857600080fd5b5061099c610997366004613f1a565b611cf7565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610490565b3480156109da57600080fd5b5061046c611d81565b3480156109ef57600080fd5b5061046c6109fe366004613eee565b611de4565b348015610a0f57600080fd5b506104ff610a1e366004613f1a565b611f15565b348015610a2f57600080fd5b50600d546104b99062010000900460ff1681565b348015610a4f57600080fd5b506104ff60095481565b348015610a6557600080fd5b506000546001600160a01b0316610542565b348015610a8357600080fd5b5061046c610a923660046140f9565b611f48565b348015610aa357600080fd5b50610483611fab565b348015610ab857600080fd5b5061046c610ac7366004613e52565b611fba565b348015610ad857600080fd5b5061046c610ae7366004613f37565b61204c565b348015610af857600080fd5b506104b9610b07366004613eee565b612080565b348015610b1857600080fd5b506104ff610b27366004613f1a565b612119565b348015610b3857600080fd5b506104ff610b47366004613f1a565b61214c565b348015610b5857600080fd5b506104b9610b67366004613eee565b61217f565b348015610b7857600080fd5b5061046c610b87366004613f37565b61218c565b348015610b9857600080fd5b506104ff610ba7366004613f1a565b6121bb565b348015610bb857600080fd5b506104b9610bc7366004613f1a565b60146020526000908152604090205460ff1681565b348015610be857600080fd5b506104ff60085481565b348015610bfe57600080fd5b5061046c610c0d366004613e52565b6121ee565b348015610c1e57600080fd5b5061046c610c2d366004614134565b6122fe565b348015610c3e57600080fd5b5061046c610c4d3660046141f9565b612396565b348015610c5e57600080fd5b506104b9610c6d366004613f1a565b61240b565b348015610c7e57600080fd5b5061046c61247a565b348015610c9357600080fd5b5061046c610ca2366004613eee565b612525565b348015610cb357600080fd5b50601054610542906001600160a01b031681565b348015610cd357600080fd5b5061046c610ce2366004613e52565b612588565b348015610cf357600080fd5b5061046c610d02366004613e52565b6125dd565b348015610d1357600080fd5b5061046c610d22366004613f1a565b612632565b348015610d3357600080fd5b506104ff610d42366004614216565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b348015610d7957600080fd5b5061046c610d88366004613f1a565b6126d1565b348015610d9957600080fd5b5061046c610da83660046141f9565b612723565b348015610db957600080fd5b506104ff600b5481565b348015610dcf57600080fd5b5061046c610dde366004613f1a565b612796565b348015610def57600080fd5b5061046c610dfe366004614134565b61282e565b6000546001600160a01b03163314610e365760405162461bcd60e51b8152600401610e2d90614244565b60405180910390fd5b60175460405162241fbd60e51b81526001600160a01b038481166004830152831515602483015290911690630483f7a0906044015b600060405180830381600087803b158015610e8557600080fd5b505af1158015610e99573d6000803e3d6000fd5b505050505050565b606060058054610eb090614279565b80601f0160208091040260200160405190810160405280929190818152602001828054610edc90614279565b8015610f295780601f10610efe57610100808354040283529160200191610f29565b820191906000526020600020905b815481529060010190602001808311610f0c57829003601f168201915b5050505050905090565b6000610f403384846128c6565b5060015b92915050565b6000546001600160a01b03163314610f745760405162461bcd60e51b8152600401610e2d90614244565b601080546001600160a01b0319166001600160a01b0383169081179091556040519081527fcad1438f5cb825c93eb9491e0dfe462cab3cc7f2717a8d1beae01c3b45dc7a68906020015b60405180910390a150565b6000546001600160a01b03163314610ff35760405162461bcd60e51b8152600401610e2d90614244565b601c5460ff1661103b5760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81b9bdd081cdd185c9d1959606a1b6044820152606401610e2d565b601c805460ff19169055565b6000546001600160a01b031633146110715760405162461bcd60e51b8152600401610e2d90614244565b60175460405163b6b55f2560e01b8152600481018390526001600160a01b039091169063b6b55f2590602401600060405180830381600087803b1580156110b757600080fd5b505af11580156110cb573d6000803e3d6000fd5b5050505050565b60006110df8484846129df565b6001600160a01b0384166000908152601260209081526040808320338452909152902054828110156111625760405162461bcd60e51b815260206004820152602660248201527f4543433a207472616e7366657220616d6f756e74206578636565647320616c6c6044820152656f77616e636560d01b6064820152608401610e2d565b611176853361117186856142c9565b6128c6565b60019150505b9392505050565b6017546040516327ce014760e01b81526001600160a01b03838116600483015260009216906327ce0147906024015b602060405180830381865afa1580156111cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4491906142e0565b3360009081526001602052604090205460ff166112225760405162461bcd60e51b8152600401610e2d906142f9565b61122c8282613241565b6010546001600160a01b038381169116146112bb576017546001600160a01b031663e30443bc8361125c81611ca6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156112a257600080fd5b505af11580156112b6573d6000803e3d6000fd5b505050505b6017546010546040516370a0823160e01b81526001600160a01b039182166004820152600092849216906370a0823190602401602060405180830381865afa15801561130b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132f91906142e0565b6113399190614320565b6017546010546040516338c110ef60e21b81526001600160a01b03918216600482015260248101849052929350169063e30443bc90604401600060405180830381600087803b15801561138b57600080fd5b505af115801561139f573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031633146113d25760405162461bcd60e51b8152600401610e2d90614244565b6113e66001600160a01b038316338361337b565b5050565b3360008181526012602090815260408083206001600160a01b03871684529091528120549091610f40918590611171908690614320565b6000546001600160a01b0316331461144b5760405162461bcd60e51b8152600401610e2d90614244565b601080546001600160a01b0319166001600160a01b0384169081179091556000908152601560205260409020805460ff191660019081179091556114909083906121ee565b61149b826001612588565b6114a68260016125dd565b6114b08282612525565b6113e682600161174b565b6000546001600160a01b031633146114e55760405162461bcd60e51b8152600401610e2d90614244565b6001600160a01b03811660009081526016602052604090205460ff161561154e5760405162461bcd60e51b815260206004820152601860248201527f7573657220616c726561647920626c61636b6c697374656400000000000000006044820152606401610e2d565b6001600160a01b03166000908152601660205260409020805460ff19166001179055565b6000546001600160a01b0316331461159c5760405162461bcd60e51b8152600401610e2d90614244565b60005b60ff81168211156116145760016015600085858560ff168181106115c5576115c5614338565b90506020020160208101906115da9190613f1a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061160c8161434e565b91505061159f565b505050565b6017546001600160a01b031663807ab4f7336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015611671573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611695919061436d565b50565b6000546001600160a01b031633146116c25760405162461bcd60e51b8152600401610e2d90614244565b6001600160a01b03811660009081526016602052604090205460ff1661172a5760405162461bcd60e51b815260206004820152601860248201527f7573657220616c72656164792077686974656c697374656400000000000000006044820152606401610e2d565b6001600160a01b03166000908152601660205260409020805460ff19169055565b6000546001600160a01b031633146117755760405162461bcd60e51b8152600401610e2d90614244565b6001600160a01b038216600081815260016020908152604091829020805460ff19168515159081179091558251938452908301527f909016d36ac8832d60eca5631256110b493764cf0e9be422253d07acd86e5243910160405180910390a15050565b6000546001600160a01b031633146118025760405162461bcd60e51b8152600401610e2d90614244565b6103e88311156118245760405162461bcd60e51b8152600401610e2d9061438a565b6103e88211156118465760405162461bcd60e51b8152600401610e2d9061438a565b6103e88111156118685760405162461bcd60e51b8152600401610e2d9061438a565b600783905560088290556009819055806118828385614320565b61188c9190614320565b600a55505050565b6000546001600160a01b031633146118be5760405162461bcd60e51b8152600401610e2d90614244565b600d8054600b9390935590151560ff19931515610100029390931661ffff1990921691909117919091179055565b6000546001600160a01b031633146119165760405162461bcd60e51b8152600401610e2d90614244565b61192082826121ee565b61192a82826125dd565b6113e68282612588565b6000546001600160a01b0316331461195e5760405162461bcd60e51b8152600401610e2d90614244565b6119876119736000546001600160a01b031690565b6000546001600160a01b0316600e546128c6565b60005b838110156110cb576119ec338686848181106119a8576119a8614338565b90506020020160208101906119bd9190613f1a565b6119c96009600a61449e565b8686868181106119db576119db614338565b905060200201356105aa91906144ad565b50806119f7816144cc565b91505061198a565b6000546001600160a01b03163314611a295760405162461bcd60e51b8152600401610e2d90614244565b6018546001600160a01b0390811690821603611aa15760405162461bcd60e51b815260206004820152603160248201527f4543433a2074686520726f7574657220697320616c72656164792073657420746044820152706f20746865206e6577206164647265737360781b6064820152608401610e2d565b6018546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3601880546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a01559160048083019260209291908290030181865afa158015611b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5c91906144e5565b6001600160a01b031663c9c6539630601860009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be291906144e5565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5391906144e5565b601980546001600160a01b0319166001600160a01b03929092169190911790555050565b6000546001600160a01b03163314611ca15760405162461bcd60e51b8152600401610e2d90614244565b601b55565b6001600160a01b031660009081526011602052604090205490565b6000546001600160a01b03163314611ceb5760405162461bcd60e51b8152600401610e2d90614244565b611cf560006133cd565b565b601754604051630f6a21fd60e31b81526001600160a01b0383811660048301526000928392839283928392911690637b510fe89060240160a060405180830381865afa158015611d4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6f9190614502565b939a9299509097509550909350915050565b6000546001600160a01b03163314611dab5760405162461bcd60e51b8152600401610e2d90614244565b6000611db630611ca6565b9050611dc18161341d565b5060c8601a819055601b556103e860078190556103846008556064600955600a55565b3360009081526001602052604090205460ff16611e135760405162461bcd60e51b8152600401610e2d906142f9565b611e1d8282613550565b6017546001600160a01b031663e30443bc83611e3881611ca6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611e7e57600080fd5b505af1158015611e92573d6000803e3d6000fd5b50506017546010546040516370a0823160e01b81526001600160a01b039182166004820152600094508593509116906370a0823190602401602060405180830381865afa158015611ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0b91906142e0565b61133991906142c9565b6017546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024016111b2565b6000546001600160a01b03163314611f725760405162461bcd60e51b8152600401610e2d90614244565b6017546040516323849a5160e21b8152600481018490526001600160a01b03838116602483015290911690638e12694490604401610e6b565b606060068054610eb090614279565b6000546001600160a01b03163314611fe45760405162461bcd60e51b8152600401610e2d90614244565b6019546001600160a01b03908116908316036120425760405162461bcd60e51b815260206004820181905260248201527f4543433a2044455820706169722063616e206e6f742062652072656d6f7665646044820152606401610e2d565b6113e6828261362f565b6000546001600160a01b031633146120765760405162461bcd60e51b8152600401610e2d90614244565b61169533826137fe565b3360009081526012602090815260408083206001600160a01b0386168452909152812054828110156121005760405162461bcd60e51b815260206004820152602360248201527f4543433a2064656372656173656420616c6c6f77616e63652062656c6f77207a60448201526265726f60e81b6064820152608401610e2d565b61210f338561117186856142c9565b5060019392505050565b6017546040516329a0382f60e21b81526001600160a01b038381166004830152600092169063a680e0bc906024016111b2565b6017546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016111b2565b6000610f403384846129df565b6000546001600160a01b031633146121b65760405162461bcd60e51b8152600401610e2d90614244565b601a55565b60175460405163557ec23d60e11b81526001600160a01b038381166004830152600092169063aafd847a906024016111b2565b6000546001600160a01b031633146122185760405162461bcd60e51b8152600401610e2d90614244565b6001600160a01b03821660009081526013602052604090205481151560ff90911615150361229f5760405162461bcd60e51b815260206004820152602e60248201527f4543433a206163636f756e7420697320616c72656164792073657420746f207260448201526d657175657374656420737461746560901b6064820152608401610e2d565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b031633146123285760405162461bcd60e51b8152600401610e2d90614244565b60005b81518160ff1610156113e657600160166000848460ff168151811061235257612352614338565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061238e8161434e565b91505061232b565b6000546001600160a01b031633146123c05760405162461bcd60e51b8152600401610e2d90614244565b600d8054821515620100000262ff0000199091161790556040517f5bb2376cf656637e70e36c01d3da25685bf3b353f18681b8a5e48c7b2effe13390610fbe90831515815260200190565b60175460405163c705c56960e01b81526001600160a01b038381166004830152600092169063c705c56990602401602060405180830381865afa158015612456573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f44919061436d565b6000546001600160a01b031633146124a45760405162461bcd60e51b8152600401610e2d90614244565b601c5460ff16156124f75760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920737461727465640000000000000000006044820152606401610e2d565b601c805460ff1916600117905560c8601a819055601b55612648600781905560006008819055600955600a55565b6000546001600160a01b0316331461254f5760405162461bcd60e51b8152600401610e2d90614244565b6017546040516338c110ef60e21b81526001600160a01b038481166004830152602482018490529091169063e30443bc90604401610e6b565b6000546001600160a01b031633146125b25760405162461bcd60e51b8152600401610e2d90614244565b6001600160a01b03919091166000908152601e60205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146126075760405162461bcd60e51b8152600401610e2d90614244565b6001600160a01b03919091166000908152601d60205260409020805460ff1916911515919091179055565b3360009081526001602052604090205460ff166126615760405162461bcd60e51b8152600401610e2d906142f9565b60175460405163807ab4f760e01b81526001600160a01b0383811660048301529091169063807ab4f7906024016020604051808303816000875af11580156126ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e6919061436d565b6000546001600160a01b031633146126fb5760405162461bcd60e51b8152600401610e2d90614244565b600f80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000546001600160a01b0316331461274d5760405162461bcd60e51b8152600401610e2d90614244565b600d80548215156101000261ff00199091161790556040517fb9bbb15e341600c8d067a0cadeba219905d5ba6d422b193c9c32265d26fc51c890610fbe90831515815260200190565b6000546001600160a01b031633146127c05760405162461bcd60e51b8152600401610e2d90614244565b6001600160a01b0381166128255760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e2d565b611695816133cd565b6000546001600160a01b031633146128585760405162461bcd60e51b8152600401610e2d90614244565b60005b81518160ff1610156113e657600060166000848460ff168151811061288257612882614338565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806128be8161434e565b91505061285b565b6001600160a01b0383166129275760405162461bcd60e51b815260206004820152602260248201527f4543433a20617070726f76652066726f6d20746865207a65726f206164647265604482015261737360f01b6064820152608401610e2d565b6001600160a01b03821661297d5760405162461bcd60e51b815260206004820181905260248201527f4543433a20617070726f766520746f20746865207a65726f20616464726573736044820152606401610e2d565b6001600160a01b0383811660008181526012602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b601c5460ff16806129fd57506000546001600160a01b038481169116145b80612a1557506000546001600160a01b038381169116145b80612a3857506001600160a01b03831660009081526015602052604090205460ff165b80612a5b57506001600160a01b03821660009081526015602052604090205460ff165b612a925760405162461bcd60e51b81526020600482015260086024820152672737ba1027b832b760c11b6044820152606401610e2d565b6001600160a01b03831660009081526016602052604090205460ff1615612afb5760405162461bcd60e51b815260206004820152601a60248201527f4543433a2053656e64657220697320626c61636b6c69737465640000000000006044820152606401610e2d565b6001600160a01b03821660009081526016602052604090205460ff1615612b645760405162461bcd60e51b815260206004820152601d60248201527f4543433a20526563697069656e7420697320626c61636b6c69737465640000006044820152606401610e2d565b6001600160a01b038316612b8a5760405162461bcd60e51b8152600401610e2d9061454b565b6001600160a01b038216612bb05760405162461bcd60e51b8152600401610e2d9061458e565b6000612710601a54612bc1600e5490565b612bcb91906144ad565b612bd591906145cf565b90506000612710601b54612be8600e5490565b612bf291906144ad565b612bfc91906145cf565b90508183111580612c2557506001600160a01b0385166000908152601d602052604090205460ff165b612c655760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610e2d565b6000546001600160a01b03868116911614801590612c8c57506001600160a01b0384163014155b8015612ca657506003546001600160a01b03858116911614155b8015612cc057506019546001600160a01b03858116911614155b15612d0e576000612cd085611ca6565b6001600160a01b0386166000908152601e602052604090205490915060ff1680612d03575081612d008583614320565b11155b612d0c57600080fd5b505b6001600160a01b03851660009081526011602052604090205483811015612d475760405162461bcd60e51b8152600401610e2d906145f1565b6000612d5230611ca6565b600b54600d5491925082101590610100900460ff168015612d705750805b8015612d7f5750600f5460ff16155b8015612da457506001600160a01b03881660009081526014602052604090205460ff16155b8015612dbe57506018546001600160a01b03898116911614155b8015612dd857506000546001600160a01b03898116911614155b8015612df257506000546001600160a01b03888116911614155b15612e2c57600f805460ff19166001179055600d5460ff16612e1457600b5491505b612e1d82613917565b42600c55600f805460ff191690555b6019546000906001600160a01b038a811691161480612e5857506019546001600160a01b038981169116145b15612e61575060015b6001600160a01b03891660009081526013602052604090205460ff1680612ea057506001600160a01b03881660009081526013602052604090205460ff165b15612ea9575060005b600f5460ff1680612ec35750600d5462010000900460ff16155b15612ecc575060005b8015613020576000612710600a5489612ee591906144ad565b612eef91906145cf565b9050612efb81896142c9565b9750600061271060095483612f1091906144ad565b612f1a91906145cf565b9050600061271060085484612f2f91906144ad565b612f3991906145cf565b6019549091506001600160a01b03908116908d1603612ffb5781600e6000828254612f6491906142c9565b90915550506017546001600160a01b031660009081526011602052604081208054839290612f93908490614320565b909155505060175460405163b6b55f2560e01b8152600481018390526001600160a01b039091169063b6b55f2590602401600060405180830381600087803b158015612fde57600080fd5b505af1158015612ff2573d6000803e3d6000fd5b5050505061301c565b6019546001600160a01b03908116908c160361301c5761301c8c3085613992565b5050505b61302b898989613992565b6010546001600160a01b039081169089160361314357601054600090613059906001600160a01b0316611ca6565b6017546010546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa1580156130a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130c991906142e0565b6130d39190614320565b6017546010546040516338c110ef60e21b81526001600160a01b03918216600482015260248101849052929350169063e30443bc90604401600060405180830381600087803b15801561312557600080fd5b505af1158015613139573d6000803e3d6000fd5b50505050506131bd565b6017546001600160a01b031663e30443bc8961315e81611ca6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156131a457600080fd5b505af11580156131b8573d6000803e3d6000fd5b505050505b6017546001600160a01b031663e30443bc8a6131d881611ca6565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561321e57600080fd5b505af1158015613232573d6000803e3d6000fd5b50505050505050505050505050565b6001600160a01b0382166132975760405162461bcd60e51b815260206004820152601f60248201527f4543433a206275726e2066726f6d20746865207a65726f2061646472657373006044820152606401610e2d565b6001600160a01b038216600090815260116020526040902054818110156133005760405162461bcd60e51b815260206004820181905260248201527f4543433a206275726e20616d6f756e7420657863656564732062616c616e63656044820152606401610e2d565b61330a82826142c9565b6001600160a01b038416600090815260116020526040812091909155600e80548492906133389084906142c9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016129d2565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611614908490613ab1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061345257613452614338565b6001600160a01b03928316602091820292909201810191909152601854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156134ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134cf91906144e5565b816001815181106134e2576134e2614338565b6001600160a01b03928316602091820292909201015260185461350891309116846128c6565b6018546001600160a01b031663791ac9478360008461352f6000546001600160a01b031690565b426040518663ffffffff1660e01b8152600401610e6b959493929190614635565b6001600160a01b0382166135a65760405162461bcd60e51b815260206004820152601d60248201527f4543433a206d696e7420746f20746865207a65726f20616464726573730000006044820152606401610e2d565b80600e60008282546135b89190614320565b90915550506001600160a01b038216600090815260116020526040812080548392906135e5908490614320565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b03821660009081526014602052604090205481151560ff9091161515036136c55760405162461bcd60e51b815260206004820152603d60248201527f4543433a206175746f6d61746564206d61726b6574206d616b6572207061697260448201527f20697320616c72656164792073657420746f20746861742076616c75650000006064820152608401610e2d565b6001600160a01b0382166000908152601460205260409020805460ff1916821580159190911790915561375c5760175460405162241fbd60e51b81526001600160a01b0384811660048301526001602483015290911690630483f7a090604401600060405180830381600087803b15801561373f57600080fd5b505af1158015613753573d6000803e3d6000fd5b505050506137c2565b60175460405162241fbd60e51b81526001600160a01b0384811660048301526000602483015290911690630483f7a090604401600060405180830381600087803b1580156137a957600080fd5b505af11580156137bd573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b8047101561384e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e2d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461389b576040519150601f19603f3d011682016040523d82523d6000602084013e6138a0565b606091505b50509050806116145760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e2d565b806000036139225750565b600f5460009061010090046001600160a01b03161561395857600a5460075461394b90846144ad565b61395591906145cf565b90505b4761396282613b83565b47600061396f83836142c9565b905080156110cb57600f546110cb9061010090046001600160a01b0316826137fe565b6001600160a01b0383166139b85760405162461bcd60e51b8152600401610e2d9061454b565b6001600160a01b0382166139de5760405162461bcd60e51b8152600401610e2d9061458e565b6001600160a01b03831660009081526011602052604090205481811015613a175760405162461bcd60e51b8152600401610e2d906145f1565b613a2182826142c9565b6001600160a01b038086166000908152601160205260408082209390935590851681529081208054849290613a57908490614320565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613aa391815260200190565b60405180910390a350505050565b6000613b06826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ca79092919063ffffffff16565b8051909150156116145780806020019051810190613b24919061436d565b6116145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610e2d565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613bb857613bb8614338565b6001600160a01b03928316602091820292909201810191909152601854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c3591906144e5565b81600181518110613c4857613c48614338565b6001600160a01b039283166020918202929092010152601854613c6e91309116846128c6565b60185460405163791ac94760e01b81526001600160a01b039091169063791ac94790610e6b908590600090869030904290600401614635565b6060613cb68484600085613cbe565b949350505050565b606082471015613d1f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610e2d565b843b613d6d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e2d565b600080866001600160a01b03168587604051613d8991906146a6565b60006040518083038185875af1925050503d8060008114613dc6576040519150601f19603f3d011682016040523d82523d6000602084013e613dcb565b606091505b5091509150613ddb828286613de6565b979650505050505050565b60608315613df557508161117c565b825115613e055782518084602001fd5b8160405162461bcd60e51b8152600401610e2d9190613ebb565b6001600160a01b038116811461169557600080fd5b8035613e3f81613e1f565b919050565b801515811461169557600080fd5b60008060408385031215613e6557600080fd5b8235613e7081613e1f565b91506020830135613e8081613e44565b809150509250929050565b60005b83811015613ea6578181015183820152602001613e8e565b83811115613eb5576000848401525b50505050565b6020815260008251806020840152613eda816040850160208701613e8b565b601f01601f19169190910160400192915050565b60008060408385031215613f0157600080fd5b8235613f0c81613e1f565b946020939093013593505050565b600060208284031215613f2c57600080fd5b813561117c81613e1f565b600060208284031215613f4957600080fd5b5035919050565b600080600060608486031215613f6557600080fd5b8335613f7081613e1f565b92506020840135613f8081613e1f565b929592945050506040919091013590565b60008083601f840112613fa357600080fd5b50813567ffffffffffffffff811115613fbb57600080fd5b6020830191508360208260051b8501011115613fd657600080fd5b9250929050565b60008060208385031215613ff057600080fd5b823567ffffffffffffffff81111561400757600080fd5b61401385828601613f91565b90969095509350505050565b60008060006060848603121561403457600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561406057600080fd5b833561406b81613e44565b925060208401359150604084013561408281613e44565b809150509250925092565b600080600080604085870312156140a357600080fd5b843567ffffffffffffffff808211156140bb57600080fd5b6140c788838901613f91565b909650945060208701359150808211156140e057600080fd5b506140ed87828801613f91565b95989497509550505050565b6000806040838503121561410c57600080fd5b823591506020830135613e8081613e1f565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561414757600080fd5b823567ffffffffffffffff8082111561415f57600080fd5b818501915085601f83011261417357600080fd5b8135818111156141855761418561411e565b8060051b604051601f19603f830116810181811085821117156141aa576141aa61411e565b6040529182528482019250838101850191888311156141c857600080fd5b938501935b828510156141ed576141de85613e34565b845293850193928501926141cd565b98975050505050505050565b60006020828403121561420b57600080fd5b813561117c81613e44565b6000806040838503121561422957600080fd5b823561423481613e1f565b91506020830135613e8081613e1f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061428d57607f821691505b6020821081036142ad57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156142db576142db6142b3565b500390565b6000602082840312156142f257600080fd5b5051919050565b6020808252600d908201526c27b7363c96b7b832b930ba37b960991b604082015260600190565b60008219821115614333576143336142b3565b500190565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff8103614364576143646142b3565b60010192915050565b60006020828403121561437f57600080fd5b815161117c81613e44565b60208082526016908201527546656573206d7573742062652062656c6f772031302560501b604082015260600190565b600181815b808511156143f55781600019048211156143db576143db6142b3565b808516156143e857918102915b93841c93908002906143bf565b509250929050565b60008261440c57506001610f44565b8161441957506000610f44565b816001811461442f576002811461443957614455565b6001915050610f44565b60ff84111561444a5761444a6142b3565b50506001821b610f44565b5060208310610133831016604e8410600b8410161715614478575081810a610f44565b61448283836143ba565b8060001904821115614496576144966142b3565b029392505050565b600061117c60ff8416836143fd565b60008160001904831182151516156144c7576144c76142b3565b500290565b6000600182016144de576144de6142b3565b5060010190565b6000602082840312156144f757600080fd5b815161117c81613e1f565b600080600080600060a0868803121561451a57600080fd5b855161452581613e1f565b602087015160408801516060890151608090990151929a91995097965090945092505050565b60208082526023908201527f4543433a207472616e736665722066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526021908201527f4543433a207472616e7366657220746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6000826145ec57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526024908201527f4543433a207472616e7366657220616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156146855784516001600160a01b031683529383019391830191600101614660565b50506001600160a01b03969096166060850152505050608001529392505050565b600082516146b8818460208701613e8b565b919091019291505056fea264697066735822122095ee82686a2808aa9daf0f6806518a6f33980a7b5a72381b07b598e738d2ed4464736f6c634300080d0033

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

0000000000000000000000003069070f3544c769baa9d9339f196a5d1cbcfd1100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _treasuryWallet (address): 0x3069070F3544C769baA9d9339f196a5D1CBcFd11

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000003069070f3544c769baa9d9339f196a5d1cbcfd11
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

41763:23936:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55263:176;;;;;;;;;;-1:-1:-1;55263:176:0;;;;;:::i;:::-;;:::i;:::-;;45465:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46244:210;;;;;;;;;;-1:-1:-1;46244:210:0;;;;;:::i;:::-;;:::i;:::-;;;1935:14:1;;1928:22;1910:41;;1898:2;1883:18;46244:210:0;1770:187:1;60111:175:0;;;;;;;;;;-1:-1:-1;60111:175:0;;;;;:::i;:::-;;:::i;42413:27::-;;;;;;;;;;;;;;;;;;;2360:25:1;;;2348:2;2333:18;42413:27:0;2214:177:1;65018:125:0;;;;;;;;;;;;;:::i;43531:41::-;;;;;;;;;;-1:-1:-1;43531:41:0;;;;-1:-1:-1;;;;;43531:41:0;;;;;;-1:-1:-1;;;;;2587:32:1;;;2569:51;;2557:2;2542:18;43531:41:0;2396:230:1;45734:108:0;;;;;;;;;;-1:-1:-1;45822:12:0;;45734:108;;62660:193;;;;;;;;;;-1:-1:-1;62660:193:0;;;;;:::i;:::-;;:::i;47407:487::-;;;;;;;;;;-1:-1:-1;47407:487:0;;;;;:::i;:::-;;:::i;56654:184::-;;;;;;;;;;-1:-1:-1;56654:184:0;;;;;:::i;:::-;;:::i;63441:418::-;;;;;;;;;;-1:-1:-1;63441:418:0;;;;;:::i;:::-;;:::i;43486:38::-;;;;;;;;;;-1:-1:-1;43486:38:0;;;;-1:-1:-1;;;;;43486:38:0;;;45651:75;;;;;;;;;;-1:-1:-1;45651:75:0;;45717:1;3651:36:1;;3639:2;3624:18;45651:75:0;3509:184:1;61154:140:0;;;;;;;;;;-1:-1:-1;61154:140:0;;;;;:::i;:::-;;:::i;42313:33::-;;;;;;;;;;;;;;;;46462:280;;;;;;;;;;-1:-1:-1;46462:280:0;;;;;:::i;:::-;;:::i;65151:424::-;;;;;;;;;;-1:-1:-1;65151:424:0;;;;;:::i;:::-;;:::i;42621:29::-;;;;;;;;;;-1:-1:-1;42621:29:0;;;;;;;-1:-1:-1;;;;;42621:29:0;;;61422:168;;;;;;;;;;-1:-1:-1;61422:168:0;;;;;:::i;:::-;;:::i;58268:183::-;;;;;;;;;;-1:-1:-1;58268:183:0;;;;;:::i;:::-;;:::i;43581:28::-;;;;;;;;;;-1:-1:-1;43581:28:0;;;;-1:-1:-1;;;;;43581:28:0;;;56172:96;;;;;;;;;;;;;:::i;54950:126::-;;;;;;;;;;-1:-1:-1;54950:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;55040:28:0;55016:4;55040:28;;;:19;:28;;;;;;;;;54950:126;61598:178;;;;;;;;;;-1:-1:-1;61598:178:0;;;;;:::i;:::-;;:::i;41577:179::-;;;;;;;;;;-1:-1:-1;41577:179:0;;;;;:::i;:::-;;:::i;43618:31::-;;;;;;;;;;;;;;;;42190:36;;;;;;;;;;;;;;;;59099:512;;;;;;;;;;-1:-1:-1;59099:512:0;;;;;:::i;:::-;;:::i;59619:288::-;;;;;;;;;;-1:-1:-1;59619:288:0;;;;;:::i;:::-;;:::i;60294:224::-;;;;;;;;;;-1:-1:-1;60294:224:0;;;;;:::i;:::-;;:::i;62173:308::-;;;;;;;;;;-1:-1:-1;62173:308:0;;;;;:::i;:::-;;:::i;57421:128::-;;;;;;;;;;-1:-1:-1;57421:128:0;;;;;:::i;:::-;-1:-1:-1;;;;;57512:29:0;57488:4;57512:29;;;:20;:29;;;;;;;;;57421:128;57715:545;;;;;;;;;;-1:-1:-1;57715:545:0;;;;;:::i;:::-;;:::i;60009:94::-;;;;;;;;;;-1:-1:-1;60009:94:0;;;;;:::i;:::-;;:::i;57557:136::-;;;;;;;;;;-1:-1:-1;57557:136:0;;;;;:::i;:::-;-1:-1:-1;;;;;57652:33:0;57628:4;57652:33;;;:24;:33;;;;;;;;;57557:136;42481:30;;;;;;;;;;-1:-1:-1;42481:30:0;;;;;;;;;;;45850:177;;;;;;;;;;-1:-1:-1;45850:177:0;;;;;:::i;:::-;;:::i;1903:103::-;;;;;;;;;;;;;:::i;43656:35::-;;;;;;;;;;;;;;;;56985:280;;;;;;;;;;-1:-1:-1;56985:280:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6545:32:1;;;6527:51;;6609:2;6594:18;;6587:34;;;;6637:18;;;6630:34;;;;6695:2;6680:18;;6673:34;6738:3;6723:19;;6716:35;6514:3;6499:19;56985:280:0;6268:489:1;64188:322:0;;;;;;;;;;;;;:::i;63072:361::-;;;;;;;;;;-1:-1:-1;63072:361:0;;;;;:::i;:::-;;:::i;56846:131::-;;;;;;;;;;-1:-1:-1;56846:131:0;;;;;:::i;:::-;;:::i;42518:29::-;;;;;;;;;;-1:-1:-1;42518:29:0;;;;;;;;;;;42275:31;;;;;;;;;;;;;;;;1252:87;;;;;;;;;;-1:-1:-1;1298:7:0;1325:6;-1:-1:-1;;;;;1325:6:0;1252:87;;55084:171;;;;;;;;;;-1:-1:-1;55084:171:0;;;;;:::i;:::-;;:::i;45556:87::-;;;;;;;;;;;;;:::i;58874:217::-;;;;;;;;;;-1:-1:-1;58874:217:0;;;;;:::i;:::-;;:::i;61302:112::-;;;;;;;;;;-1:-1:-1;61302:112:0;;;;;:::i;:::-;;:::i;46750:425::-;;;;;;;;;;-1:-1:-1;46750:425:0;;;;;:::i;:::-;;:::i;57273:140::-;;;;;;;;;;-1:-1:-1;57273:140:0;;;;;:::i;:::-;;:::i;56276:184::-;;;;;;;;;;-1:-1:-1;56276:184:0;;;;;:::i;:::-;;:::i;47183:216::-;;;;;;;;;;-1:-1:-1;47183:216:0;;;;;:::i;:::-;;:::i;59915:86::-;;;;;;;;;;-1:-1:-1;59915:86:0;;;;;:::i;:::-;;:::i;56468:178::-;;;;;;;;;;-1:-1:-1;56468:178:0;;;;;:::i;:::-;;:::i;42880:57::-;;;;;;;;;;-1:-1:-1;42880:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42233:35;;;;;;;;;;;;;;;;60526:329;;;;;;;;;;-1:-1:-1;60526:329:0;;;;;:::i;:::-;;:::i;61784:185::-;;;;;;;;;;-1:-1:-1;61784:185:0;;;;;:::i;:::-;;:::i;58603:133::-;;;;;;;;;;-1:-1:-1;58603:133:0;;;;;:::i;:::-;;:::i;55447:183::-;;;;;;;;;;-1:-1:-1;55447:183:0;;;;;:::i;:::-;;:::i;63882:297::-;;;;;;;;;;;;;:::i;62505:147::-;;;;;;;;;;-1:-1:-1;62505:147:0;;;;;:::i;:::-;;:::i;42657:29::-;;;;;;;;;;-1:-1:-1;42657:29:0;;;;-1:-1:-1;;;;;42657:29:0;;;61005:141;;;;;;;;;;-1:-1:-1;61005:141:0;;;;;:::i;:::-;;:::i;60863:134::-;;;;;;;;;;-1:-1:-1;60863:134:0;;;;;:::i;:::-;;:::i;62934:130::-;;;;;;;;;;-1:-1:-1;62934:130:0;;;;;:::i;:::-;;:::i;46035:201::-;;;;;;;;;;-1:-1:-1;46035:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;46201:18:0;;;46169:7;46201:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;46035:201;58744:122;;;;;;;;;;-1:-1:-1;58744:122:0;;;;;:::i;:::-;;:::i;58459:136::-;;;;;;;;;;-1:-1:-1;58459:136:0;;;;;:::i;:::-;;:::i;42355:51::-;;;;;;;;;;;;;;;;2161:238;;;;;;;;;;-1:-1:-1;2161:238:0;;;;;:::i;:::-;;:::i;61977:188::-;;;;;;;;;;-1:-1:-1;61977:188:0;;;;;:::i;:::-;;:::i;55263:176::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;;;;;;;;;55376:15:::1;::::0;:55:::1;::::0;-1:-1:-1;;;55376:55:0;;-1:-1:-1;;;;;9786:32:1;;;55376:55:0::1;::::0;::::1;9768:51:1::0;9862:14;;9855:22;9835:18;;;9828:50;55376:15:0;;::::1;::::0;:36:::1;::::0;9741:18:1;;55376:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55263:176:::0;;:::o;45465:83::-;45502:13;45535:5;45528:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45465:83;:::o;46244:210::-;46363:4;46385:39;681:10;46408:7;46417:6;46385:8;:39::i;:::-;-1:-1:-1;46442:4:0;46244:210;;;;;:::o;60111:175::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;60193:14:::1;:32:::0;;-1:-1:-1;;;;;;60193:32:0::1;-1:-1:-1::0;;;;;60193:32:0;::::1;::::0;;::::1;::::0;;;60241:37:::1;::::0;2569:51:1;;;60241:37:0::1;::::0;2557:2:1;2542:18;60241:37:0::1;;;;;;;;60111:175:::0;:::o;65018:125::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;65080:6:::1;::::0;::::1;;65072:38;;;::::0;-1:-1:-1;;;65072:38:0;;10476:2:1;65072:38:0::1;::::0;::::1;10458:21:1::0;10515:2;10495:18;;;10488:30;-1:-1:-1;;;10534:18:1;;;10527:49;10593:18;;65072:38:0::1;10274:343:1::0;65072:38:0::1;65121:6;:14:::0;;-1:-1:-1;;65121:14:0::1;::::0;;65018:125::o;62660:193::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;62808:15:::1;::::0;:37:::1;::::0;-1:-1:-1;;;62808:37:0;;::::1;::::0;::::1;2360:25:1::0;;;-1:-1:-1;;;;;62808:15:0;;::::1;::::0;:23:::1;::::0;2333:18:1;;62808:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;62660:193:::0;:::o;47407:487::-;47547:4;47564:36;47574:6;47582:9;47593:6;47564:9;:36::i;:::-;-1:-1:-1;;;;;47638:19:0;;47611:24;47638:19;;;:11;:19;;;;;;;;681:10;47638:33;;;;;;;;47704:26;;;;47682:114;;;;-1:-1:-1;;;47682:114:0;;10824:2:1;47682:114:0;;;10806:21:1;10863:2;10843:18;;;10836:30;10902:34;10882:18;;;10875:62;-1:-1:-1;;;10953:18:1;;;10946:36;10999:19;;47682:114:0;10622:402:1;47682:114:0;47807:57;47816:6;681:10;47838:25;47857:6;47838:16;:25;:::i;:::-;47807:8;:57::i;:::-;47882:4;47875:11;;;47407:487;;;;;;:::o;56654:184::-;56783:15;;:47;;-1:-1:-1;;;56783:47:0;;-1:-1:-1;;;;;2587:32:1;;;56783:47:0;;;2569:51:1;56751:7:0;;56783:15;;:38;;2542:18:1;;56783:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;63441:418::-;41452:10;41443:20;;;;:8;:20;;;;;;;;41435:46;;;;-1:-1:-1;;;41435:46:0;;;;;;;:::i;:::-;63521:22:::1;63527:7;63536:6;63521:5;:22::i;:::-;63571:14;::::0;-1:-1:-1;;;;;63560:25:0;;::::1;63571:14:::0;::::1;63560:25;63556:122;;63602:15;::::0;-1:-1:-1;;;;;63602:15:0::1;:26;63637:7:::0;63647:18:::1;63637:7:::0;63647:9:::1;:18::i;:::-;63602:64;::::0;-1:-1:-1;;;;;;63602:64:0::1;::::0;;;;;;-1:-1:-1;;;;;12030:32:1;;;63602:64:0::1;::::0;::::1;12012:51:1::0;12079:18;;;12072:34;11985:18;;63602:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63556:122;63719:15;::::0;63745:14:::1;::::0;63719:41:::1;::::0;-1:-1:-1;;;63719:41:0;;-1:-1:-1;;;;;63745:14:0;;::::1;63719:41;::::0;::::1;2569:51:1::0;63690:25:0::1;::::0;63763:6;;63719:15:::1;::::0;:25:::1;::::0;2542:18:1;;63719:41:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;63781:15;::::0;63816:14:::1;::::0;63781:70:::1;::::0;-1:-1:-1;;;63781:70:0;;-1:-1:-1;;;;;63816:14:0;;::::1;63781:70;::::0;::::1;12012:51:1::0;12079:18;;;12072:34;;;63690:80:0;;-1:-1:-1;63781:15:0::1;::::0;:26:::1;::::0;11985:18:1;;63781:70:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63510:349;63441:418:::0;;:::o;61154:140::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;61238:48:::1;-1:-1:-1::0;;;;;61238:27:0;::::1;61266:10;61278:7:::0;61238:27:::1;:48::i;:::-;61154:140:::0;;:::o;46462:280::-;681:10;46560:4;46654:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;46654:34:0;;;;;;;;;;46560:4;;46582:130;;46632:7;;46654:47;;46691:10;;46654:47;:::i;65151:424::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;65238:14:::1;:32:::0;;-1:-1:-1;;;;;;65238:32:0::1;-1:-1:-1::0;;;;;65238:32:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;65281:27:0;;;:10:::1;:27;::::0;;;;:34;;-1:-1:-1;;65281:34:0::1;-1:-1:-1::0;65281:34:0;;::::1;::::0;;;65326:38:::1;::::0;65238:32;;65326:15:::1;:38::i;:::-;65375:43;65396:15;65413:4;65375:20;:43::i;:::-;65429:39;65446:15;65463:4;65429:16;:39::i;:::-;65479:43;65496:15;65513:8;65479:16;:43::i;:::-;65533:34;65545:15;65562:4;65533:11;:34::i;61422:168::-:0;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61495:20:0;::::1;;::::0;;;:13:::1;:20;::::0;;;;;::::1;;61494:21;61486:58;;;::::0;-1:-1:-1;;;61486:58:0;;12452:2:1;61486:58:0::1;::::0;::::1;12434:21:1::0;12491:2;12471:18;;;12464:30;12530:26;12510:18;;;12503:54;12574:18;;61486:58:0::1;12250:348:1::0;61486:58:0::1;-1:-1:-1::0;;;;;61555:20:0::1;;::::0;;;:13:::1;:20;::::0;;;;:27;;-1:-1:-1;;61555:27:0::1;61578:4;61555:27;::::0;;61422:168::o;58268:183::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;58352:7:::1;58347:97;58365:17;::::0;::::1;::::0;-1:-1:-1;58347:97:0::1;;;58428:4;58404:10;:21;58415:6;;58422:1;58415:9;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;58404:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;58404:21:0;:28;;-1:-1:-1;;58404:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58384:3;::::1;::::0;::::1;:::i;:::-;;;;58347:97;;;;58268:183:::0;;:::o;56172:96::-;56207:15;;-1:-1:-1;;;;;56207:15:0;:30;681:10;56207:53;;-1:-1:-1;;;;;;56207:53:0;;;;;;;-1:-1:-1;;;;;2587:32:1;;;56207:53:0;;;2569:51:1;2542:18;;56207:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56172:96::o;61598:178::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61680:20:0;::::1;;::::0;;;:13:::1;:20;::::0;;;;;::::1;;61672:57;;;::::0;-1:-1:-1;;;61672:57:0;;13591:2:1;61672:57:0::1;::::0;::::1;13573:21:1::0;13630:2;13610:18;;;13603:30;13669:26;13649:18;;;13642:54;13713:18;;61672:57:0::1;13389:348:1::0;61672:57:0::1;-1:-1:-1::0;;;;;61740:20:0::1;61763:5;61740:20:::0;;;:13:::1;:20;::::0;;;;:28;;-1:-1:-1;;61740:28:0::1;::::0;;61598:178::o;41577:179::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41662:19:0;::::1;;::::0;;;:8:::1;:19;::::0;;;;;;;;:32;;-1:-1:-1;;41662:32:0::1;::::0;::::1;;::::0;;::::1;::::0;;;41710:38;;9768:51:1;;;9835:18;;;9828:50;41710:38:0::1;::::0;9741:18:1;41710:38:0::1;;;;;;;41577:179:::0;;:::o;59099:512::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;59265:4:::1;59249:12;:20;;59241:55;;;;-1:-1:-1::0;;;59241:55:0::1;;;;;;;:::i;:::-;59331:4;59315:12;:20;;59307:55;;;;-1:-1:-1::0;;;59307:55:0::1;;;;;;;:::i;:::-;59393:4;59381:8;:16;;59373:51;;;;-1:-1:-1::0;;;59373:51:0::1;;;;;;;:::i;:::-;59437:14;:29:::0;;;59477:14:::1;:29:::0;;;59517:10:::1;:21:::0;;;59530:8;59565:27:::1;59494:12:::0;59454;59565:27:::1;:::i;:::-;:38;;;;:::i;:::-;59551:11;:52:::0;-1:-1:-1;;;59099:512:0:o;59619:288::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;59783:11:::1;:26:::0;;59820:18:::1;:40:::0;;;;59871:28;::::1;;-1:-1:-1::0;;59783:26:0;::::1;;;;59871:28:::0;;;;-1:-1:-1;;59871:28:0;;;;;;;;;;::::1;::::0;;59619:288::o;60294:224::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;60380:34:::1;60396:7;60405:8;60380:15;:34::i;:::-;60425:35;60442:7;60451:8;60425:16;:35::i;:::-;60471:39;60492:7;60501:8;60471:20;:39::i;62173:308::-:0;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;62278:41:::1;62287:7;1298::::0;1325:6;-1:-1:-1;;;;;1325:6:0;;1252:87;62287:7:::1;1298::::0;1325:6;-1:-1:-1;;;;;1325:6:0;45822:12;;47807:8;:57::i;62278:41::-:1;62335:9;62330:144;62350:21:::0;;::::1;62330:144;;;62393:69;62406:10;62418;;62429:1;62418:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;62445:16;45717:1:::0;62445:2:::1;:16;:::i;:::-;62433:6;;62440:1;62433:9;;;;;;;:::i;:::-;;;;;;;:28;;;;:::i;62393:69::-;-1:-1:-1::0;62373:3:0;::::1;::::0;::::1;:::i;:::-;;;;62330:144;;57715:545:::0;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;57840:15:::1;::::0;-1:-1:-1;;;;;57840:15:0;;::::1;57818:38:::0;;::::1;::::0;57796:137:::1;;;::::0;-1:-1:-1;;;57796:137:0;;15991:2:1;57796:137:0::1;::::0;::::1;15973:21:1::0;16030:2;16010:18;;;16003:30;16069:34;16049:18;;;16042:62;-1:-1:-1;;;16120:18:1;;;16113:47;16177:19;;57796:137:0::1;15789:413:1::0;57796:137:0::1;57991:15;::::0;57949:59:::1;::::0;-1:-1:-1;;;;;57991:15:0;;::::1;::::0;57949:59;::::1;::::0;::::1;::::0;57991:15:::1;::::0;57949:59:::1;58019:15;:48:::0;;-1:-1:-1;;;;;;58019:48:0::1;-1:-1:-1::0;;;;;58019:48:0;::::1;::::0;;::::1;::::0;;;58121:25:::1;::::0;;-1:-1:-1;;;58121:25:0;;;;-1:-1:-1;;58019:48:0;58121:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;58019:48;58121:25:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;58103:69:0::1;;58181:4;58188:15;;;;;;;;;-1:-1:-1::0;;;;;58188:15:0::1;-1:-1:-1::0;;;;;58188:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58103:108;::::0;-1:-1:-1;;;;;;58103:108:0::1;::::0;;;;;;-1:-1:-1;;;;;16693:15:1;;;58103:108:0::1;::::0;::::1;16675:34:1::0;16745:15;;16725:18;;;16718:43;16610:18;;58103:108:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58222:13;:30:::0;;-1:-1:-1;;;;;;58222:30:0::1;-1:-1:-1::0;;;;;58222:30:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;57715:545:0:o;60009:94::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;60077:12:::1;:18:::0;60009:94::o;45850:177::-;-1:-1:-1;;;;;46001:18:0;45969:7;46001:18;;;:9;:18;;;;;;;45850:177::o;1903:103::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;1968:30:::1;1995:1;1968:18;:30::i;:::-;1903:103::o:0;56985:280::-;57218:15;;:39;;-1:-1:-1;;;57218:39:0;;-1:-1:-1;;;;;2587:32:1;;;57218:39:0;;;2569:51:1;57088:7:0;;;;;;;;;;57218:15;;;:30;;2542:18:1;;57218:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57211:46;;;;-1:-1:-1;57211:46:0;;-1:-1:-1;57211:46:0;-1:-1:-1;57211:46:0;;-1:-1:-1;56985:280:0;-1:-1:-1;;56985:280:0:o;64188:322::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;64243:17:::1;64263:24;64281:4;64263:9;:24::i;:::-;64243:44;;64298:29;64317:9;64298:18;:29::i;:::-;-1:-1:-1::0;64351:3:0::1;64340:8;:14:::0;;;64365:12:::1;:18:::0;64411:4:::1;64394:14;:21:::0;;;64443:3:::1;64426:14;:20:::0;64470:3:::1;64457:10;:16:::0;64484:11:::1;:18:::0;64188:322::o;63072:361::-;41452:10;41443:20;;;;:8;:20;;;;;;;;41435:46;;;;-1:-1:-1;;;41435:46:0;;;;;;;:::i;:::-;63154:22:::1;63160:7;63169:6;63154:5;:22::i;:::-;63187:15;::::0;-1:-1:-1;;;;;63187:15:0::1;:26;63222:7:::0;63232:18:::1;63222:7:::0;63232:9:::1;:18::i;:::-;63187:64;::::0;-1:-1:-1;;;;;;63187:64:0::1;::::0;;;;;;-1:-1:-1;;;;;12030:32:1;;;63187:64:0::1;::::0;::::1;12012:51:1::0;12079:18;;;12072:34;11985:18;;63187:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;63293:15:0::1;::::0;63319:14:::1;::::0;63293:41:::1;::::0;-1:-1:-1;;;63293:41:0;;-1:-1:-1;;;;;63319:14:0;;::::1;63293:41;::::0;::::1;2569:51:1::0;63264:25:0::1;::::0;-1:-1:-1;63337:6:0;;-1:-1:-1;63293:15:0;::::1;::::0;:25:::1;::::0;2542:18:1;;63293:41:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;56846:131::-:0;56935:15;;:34;;-1:-1:-1;;;56935:34:0;;-1:-1:-1;;;;;2587:32:1;;;56935:34:0;;;2569:51:1;56908:7:0;;56935:15;;:25;;2542:18:1;;56935:34:0;2396:230:1;55084:171:0;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;55197:15:::1;::::0;:50:::1;::::0;-1:-1:-1;;;55197:50:0;;::::1;::::0;::::1;17448:25:1::0;;;-1:-1:-1;;;;;17509:32:1;;;17489:18;;;17482:60;55197:15:0;;::::1;::::0;:34:::1;::::0;17421:18:1;;55197:50:0::1;17274:274:1::0;45556:87:0;45595:13;45628:7;45621:14;;;;;:::i;58874:217::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;58981:13:::1;::::0;-1:-1:-1;;;;;58981:13:0;;::::1;58973:21:::0;;::::1;::::0;58965:66:::1;;;::::0;-1:-1:-1;;;58965:66:0;;17755:2:1;58965:66:0::1;::::0;::::1;17737:21:1::0;;;17774:18;;;17767:30;17833:34;17813:18;;;17806:62;17885:18;;58965:66:0::1;17553:356:1::0;58965:66:0::1;59042:41;59071:4;59077:5;59042:28;:41::i;61302:112::-:0;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;61368:38:::1;61376:10;61398:7:::0;61368:29:::1;:38::i;46750:425::-:0;681:10;46853:4;46902:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;46902:34:0;;;;;;;;;;46969:35;;;;46947:120;;;;-1:-1:-1;;;46947:120:0;;18116:2:1;46947:120:0;;;18098:21:1;18155:2;18135:18;;;18128:30;18194:34;18174:18;;;18167:62;-1:-1:-1;;;18245:18:1;;;18238:33;18288:19;;46947:120:0;17914:399:1;46947:120:0;47078:67;681:10;47101:7;47110:34;47129:15;47110:16;:34;:::i;47078:67::-;-1:-1:-1;47163:4:0;;46750:425;-1:-1:-1;;;46750:425:0:o;57273:140::-;57364:15;;:41;;-1:-1:-1;;;57364:41:0;;-1:-1:-1;;;;;2587:32:1;;;57364:41:0;;;2569:51:1;57337:7:0;;57364:15;;:32;;2542:18:1;;57364:41:0;2396:230:1;56276:184:0;56405:15;;:47;;-1:-1:-1;;;56405:47:0;;-1:-1:-1;;;;;2587:32:1;;;56405:47:0;;;2569:51:1;56373:7:0;;56405:15;;:38;;2542:18:1;;56405:47:0;2396:230:1;47183:216:0;47305:4;47327:42;681:10;47351:9;47362:6;47327:9;:42::i;59915:86::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;59979:8:::1;:14:::0;59915:86::o;56468:178::-;56594:15;;:44;;-1:-1:-1;;;56594:44:0;;-1:-1:-1;;;;;2587:32:1;;;56594:44:0;;;2569:51:1;56562:7:0;;56594:15;;:35;;2542:18:1;;56594:44:0;2396:230:1;60526:329:0;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60633:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:40;::::1;;:28;::::0;;::::1;:40;;::::0;60611:136:::1;;;::::0;-1:-1:-1;;;60611:136:0;;18520:2:1;60611:136:0::1;::::0;::::1;18502:21:1::0;18559:2;18539:18;;;18532:30;18598:34;18578:18;;;18571:62;-1:-1:-1;;;18649:18:1;;;18642:44;18703:19;;60611:136:0::1;18318:410:1::0;60611:136:0::1;-1:-1:-1::0;;;;;60758:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;60758:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;60813:34;;1910:41:1;;;60813:34:0::1;::::0;1883:18:1;60813:34:0::1;;;;;;;60526:329:::0;;:::o;61784:185::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;61867:7:::1;61862:100;61884:6;:13;61880:1;:17;;;61862:100;;;61946:4;61919:13;:24;61933:6;61940:1;61933:9;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;61919:24:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;61919:24:0;:31;;-1:-1:-1;;61919:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61899:3;::::1;::::0;::::1;:::i;:::-;;;;61862:100;;58603:133:::0;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;58671:10:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;58671:21:0;;::::1;;::::0;;58708:20:::1;::::0;::::1;::::0;::::1;::::0;58684:8;1935:14:1;1928:22;1910:41;;1898:2;1883:18;;1770:187;55447:183:0;55574:15;;:48;;-1:-1:-1;;;55574:48:0;;-1:-1:-1;;;;;2587:32:1;;;55574:48:0;;;2569:51:1;55545:4:0;;55574:15;;:39;;2542:18:1;;55574:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;63882:297::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;63944:6:::1;::::0;::::1;;63943:7;63935:43;;;::::0;-1:-1:-1;;;63935:43:0;;18935:2:1;63935:43:0::1;::::0;::::1;18917:21:1::0;18974:2;18954:18;;;18947:30;19013:25;18993:18;;;18986:53;19056:18;;63935:43:0::1;18733:347:1::0;63935:43:0::1;63989:6;:13:::0;;-1:-1:-1;;63989:13:0::1;63998:4;63989:13;::::0;;64024:3:::1;64013:8;:14:::0;;;64038:12:::1;:18:::0;64084:4:::1;64067:14;:21:::0;;;63989:6:::1;64099:14;:18:::0;;;64128:10:::1;:14:::0;64153:11:::1;:18:::0;63882:297::o;62505:147::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;62592:15:::1;::::0;:52:::1;::::0;-1:-1:-1;;;62592:52:0;;-1:-1:-1;;;;;12030:32:1;;;62592:52:0::1;::::0;::::1;12012:51:1::0;12079:18;;;12072:34;;;62592:15:0;;::::1;::::0;:26:::1;::::0;11985:18:1;;62592:52:0::1;11822:290:1::0;61005:141:0;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61094:33:0;;;::::1;;::::0;;;:24:::1;:33;::::0;;;;:44;;-1:-1:-1;;61094:44:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61005:141::o;60863:134::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60949:29:0;;;::::1;;::::0;;;:20:::1;:29;::::0;;;;:40;;-1:-1:-1;;60949:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;60863:134::o;62934:130::-;41452:10;41443:20;;;;:8;:20;;;;;;;;41435:46;;;;-1:-1:-1;;;41435:46:0;;;;;;;:::i;:::-;63007:15:::1;::::0;:49:::1;::::0;-1:-1:-1;;;63007:49:0;;-1:-1:-1;;;;;2587:32:1;;;63007:49:0::1;::::0;::::1;2569:51:1::0;63007:15:0;;::::1;::::0;:30:::1;::::0;2542:18:1;;63007:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;58744:122::-:0;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;58826:14:::1;:32:::0;;-1:-1:-1;;;;;58826:32:0;;::::1;;;-1:-1:-1::0;;;;;;58826:32:0;;::::1;::::0;;;::::1;::::0;;58744:122::o;58459:136::-;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;58528:11:::1;:22:::0;;;::::1;;;;-1:-1:-1::0;;58528:22:0;;::::1;;::::0;;58566:21:::1;::::0;::::1;::::0;::::1;::::0;58542:8;1935:14:1;1928:22;1910:41;;1898:2;1883:18;;1770:187;2161:238:0;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2264:22:0;::::1;2242:110;;;::::0;-1:-1:-1;;;2242:110:0;;19287:2:1;2242:110:0::1;::::0;::::1;19269:21:1::0;19326:2;19306:18;;;19299:30;19365:34;19345:18;;;19338:62;-1:-1:-1;;;19416:18:1;;;19409:36;19462:19;;2242:110:0::1;19085:402:1::0;2242:110:0::1;2363:28;2382:8;2363:18;:28::i;61977:188::-:0;1298:7;1325:6;-1:-1:-1;;;;;1325:6:0;681:10;1472:23;1464:68;;;;-1:-1:-1;;;1464:68:0;;;;;;;:::i;:::-;62062:7:::1;62057:101;62079:6;:13;62075:1;:17;;;62057:101;;;62141:5;62114:13;:24;62128:6;62135:1;62128:9;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;62114:24:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;62114:24:0;:32;;-1:-1:-1;;62114:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62094:3;::::1;::::0;::::1;:::i;:::-;;;;62057:101;;52563:365:::0;-1:-1:-1;;;;;52690:19:0;;52682:66;;;;-1:-1:-1;;;52682:66:0;;19694:2:1;52682:66:0;;;19676:21:1;19733:2;19713:18;;;19706:30;19772:34;19752:18;;;19745:62;-1:-1:-1;;;19823:18:1;;;19816:32;19865:19;;52682:66:0;19492:398:1;52682:66:0;-1:-1:-1;;;;;52767:21:0;;52759:66;;;;-1:-1:-1;;;52759:66:0;;20097:2:1;52759:66:0;;;20079:21:1;;;20116:18;;;20109:30;20175:34;20155:18;;;20148:62;20227:18;;52759:66:0;19895:356:1;52759:66:0;-1:-1:-1;;;;;52836:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;52888:32;;2360:25:1;;;52888:32:0;;2333:18:1;52888:32:0;;;;;;;;52563:365;;;:::o;47902:4042::-;48048:6;;;;;:44;;-1:-1:-1;1298:7:0;1325:6;-1:-1:-1;;;;;48075:17:0;;;1325:6;;48075:17;48048:44;:85;;;-1:-1:-1;1298:7:0;1325:6;-1:-1:-1;;;;;48113:20:0;;;1325:6;;48113:20;48048:85;:124;;;-1:-1:-1;;;;;;48154:18:0;;;;;;:10;:18;;;;;;;;48048:124;:166;;;-1:-1:-1;;;;;;48193:21:0;;;;;;:10;:21;;;;;;;;48048:166;48026:224;;;;-1:-1:-1;;;48026:224:0;;20458:2:1;48026:224:0;;;20440:21:1;20497:1;20477:18;;;20470:29;-1:-1:-1;;;20515:18:1;;;20508:38;20563:18;;48026:224:0;20256:331:1;48026:224:0;-1:-1:-1;;;;;48272:21:0;;;;;;:13;:21;;;;;;;;48271:22;48263:61;;;;-1:-1:-1;;;48263:61:0;;20794:2:1;48263:61:0;;;20776:21:1;20833:2;20813:18;;;20806:30;20872:28;20852:18;;;20845:56;20918:18;;48263:61:0;20592:350:1;48263:61:0;-1:-1:-1;;;;;48344:24:0;;;;;;:13;:24;;;;;;;;48343:25;48335:67;;;;-1:-1:-1;;;48335:67:0;;21149:2:1;48335:67:0;;;21131:21:1;21188:2;21168:18;;;21161:30;21227:31;21207:18;;;21200:59;21276:18;;48335:67:0;20947:353:1;48335:67:0;-1:-1:-1;;;;;48423:20:0;;48415:68;;;;-1:-1:-1;;;48415:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48502:23:0;;48494:69;;;;-1:-1:-1;;;48494:69:0;;;;;;;:::i;:::-;48576:20;48628:5;48616:8;;48600:13;45822:12;;;45734:108;48600:13;:24;;;;:::i;:::-;48599:34;;;;:::i;:::-;48576:57;;48644:18;48698:5;48682:12;;48666:13;45822:12;;;45734:108;48666:13;:28;;;;:::i;:::-;48665:38;;;;:::i;:::-;48644:59;;48746:12;48736:6;:22;;:54;;;-1:-1:-1;;;;;;48762:28:0;;;;;;:20;:28;;;;;;;;48736:54;48714:121;;;;-1:-1:-1;;;48714:121:0;;22535:2:1;48714:121:0;;;22517:21:1;22574:2;22554:18;;;22547:30;-1:-1:-1;;;22593:18:1;;;22586:47;22650:18;;48714:121:0;22333:341:1;48714:121:0;1298:7;1325:6;-1:-1:-1;;;;;48866:17:0;;;1325:6;;48866:17;;;;:60;;-1:-1:-1;;;;;;48900:26:0;;48921:4;48900:26;;48866:60;:103;;;;-1:-1:-1;48964:4:0;;-1:-1:-1;;;;;48943:26:0;;;48964:4;;48943:26;;48866:103;:146;;;;-1:-1:-1;48999:13:0;;-1:-1:-1;;;;;48986:26:0;;;48999:13;;48986:26;;48866:146;48848:403;;;49039:22;49064:20;49074:9;49064;:20::i;:::-;-1:-1:-1;;;;;49125:35:0;;;;;;:24;:35;;;;;;49039:45;;-1:-1:-1;49125:35:0;;;:99;;-1:-1:-1;49213:10:0;49186:23;49203:6;49186:14;:23;:::i;:::-;:37;;49125:99;49099:140;;;;;;49024:227;48848:403;-1:-1:-1;;;;;49287:17:0;;49263:21;49287:17;;;:9;:17;;;;;;49337:23;;;;49315:109;;;;-1:-1:-1;;;49315:109:0;;;;;;;:::i;:::-;49437:28;49468:24;49486:4;49468:9;:24::i;:::-;49544:18;;49593:11;;49437:55;;-1:-1:-1;49520:42:0;;;;49593:11;;;;;:43;;;;;49629:7;49593:43;:77;;;;-1:-1:-1;49662:8:0;;;;49661:9;49593:77;:158;;;;-1:-1:-1;;;;;;49718:33:0;;;;;;:25;:33;;;;;;;;49717:34;49593:158;:258;;;;-1:-1:-1;49835:15:0;;-1:-1:-1;;;;;49817:34:0;;;49835:15;;49817:34;;49593:258;:330;;;;-1:-1:-1;1298:7:0;1325:6;-1:-1:-1;;;;;49906:17:0;;;1325:6;;49906:17;;49593:330;:367;;;;-1:-1:-1;1298:7:0;1325:6;-1:-1:-1;;;;;49940:20:0;;;1325:6;;49940:20;;49593:367;49575:677;;;49987:8;:15;;-1:-1:-1;;49987:15:0;49998:4;49987:15;;;50024:12;;49987:15;50024:12;50019:95;;50080:18;;50057:41;;50019:95;50128:34;50141:20;50128:12;:34::i;:::-;50194:15;50179:12;:30;50224:8;:16;;-1:-1:-1;;50224:16:0;;;49575:677;50325:13;;50264:12;;-1:-1:-1;;;;;50307:32:0;;;50325:13;;50307:32;;:84;;-1:-1:-1;50377:13:0;;-1:-1:-1;;;;;50356:35:0;;;50377:13;;50356:35;50307:84;50289:155;;;-1:-1:-1;50428:4:0;50289:155;-1:-1:-1;;;;;50460:27:0;;;;;;:19;:27;;;;;;;;;:61;;-1:-1:-1;;;;;;50491:30:0;;;;;;:19;:30;;;;;;;;50460:61;50456:109;;;-1:-1:-1;50548:5:0;50456:109;50581:8;;;;;:23;;-1:-1:-1;50594:10:0;;;;;;;50593:11;50581:23;50577:71;;;-1:-1:-1;50631:5:0;50577:71;50664:7;50660:681;;;50688:12;50728:5;50713:11;;50704:6;:20;;;;:::i;:::-;50703:30;;;;:::i;:::-;50688:45;-1:-1:-1;50748:14:0;50688:45;50748:14;;:::i;:::-;;;50779:18;50822:5;50808:10;;50801:4;:17;;;;:::i;:::-;50800:27;;;;:::i;:::-;50779:48;;50842:24;50895:5;50877:14;;50870:4;:21;;;;:::i;:::-;50869:31;;;;:::i;:::-;50939:13;;50842:58;;-1:-1:-1;;;;;;50939:13:0;;;50921:32;;;;50917:413;;50990:10;50974:12;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;51048:15:0;;-1:-1:-1;;;;;51048:15:0;51030:35;;;;:9;:35;;;;;:55;;51069:16;;51030:35;:55;;51069:16;;51030:55;:::i;:::-;;;;-1:-1:-1;;51120:15:0;;:41;;-1:-1:-1;;;51120:41:0;;;;;2360:25:1;;;-1:-1:-1;;;;;51120:15:0;;;;:23;;2333:18:1;;51120:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50917:413;;;51234:13;;-1:-1:-1;;;;;51234:13:0;;;51213:35;;;;51209:121;;51269:45;51286:6;51302:4;51309;51269:16;:45::i;:::-;50673:668;;;50660:681;51353:43;51370:6;51378:9;51389:6;51353:16;:43::i;:::-;51461:14;;-1:-1:-1;;;;;51461:14:0;;;51448:27;;;;51444:420;;51604:14;;51492:22;;51594:25;;-1:-1:-1;;;;;51604:14:0;51594:9;:25::i;:::-;51518:15;;51562:14;;51518:73;;-1:-1:-1;;;51518:73:0;;-1:-1:-1;;;;;51562:14:0;;;51518:73;;;2569:51:1;51518:15:0;;;:25;;2542:18:1;;51518:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:101;;;;:::i;:::-;51635:15;;51670:14;;51635:67;;-1:-1:-1;;;51635:67:0;;-1:-1:-1;;;;;51670:14:0;;;51635:67;;;12012:51:1;12079:18;;;12072:34;;;51492:128:0;;-1:-1:-1;51635:15:0;;:26;;11985:18:1;;51635:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51477:237;51444:420;;;51735:15;;-1:-1:-1;;;;;51735:15:0;:26;51788:9;51817:20;51788:9;51817;:20::i;:::-;51735:117;;-1:-1:-1;;;;;;51735:117:0;;;;;;;-1:-1:-1;;;;;12030:32:1;;;51735:117:0;;;12012:51:1;12079:18;;;12072:34;11985:18;;51735:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51444:420;51874:15;;-1:-1:-1;;;;;51874:15:0;:26;51909:6;51918:17;51909:6;51918:9;:17::i;:::-;51874:62;;-1:-1:-1;;;;;;51874:62:0;;;;;;;-1:-1:-1;;;;;12030:32:1;;;51874:62:0;;;12012:51:1;12079:18;;;12072:34;11985:18;;51874:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48015:3929;;;;;;47902:4042;;;:::o;53207:415::-;-1:-1:-1;;;;;53282:21:0;;53274:65;;;;-1:-1:-1;;;53274:65:0;;23286:2:1;53274:65:0;;;23268:21:1;23325:2;23305:18;;;23298:30;23364:33;23344:18;;;23337:61;23415:18;;53274:65:0;23084:355:1;53274:65:0;-1:-1:-1;;;;;53375:18:0;;53350:22;53375:18;;;:9;:18;;;;;;53412:24;;;;53404:69;;;;-1:-1:-1;;;53404:69:0;;23646:2:1;53404:69:0;;;23628:21:1;;;23665:18;;;23658:30;23724:34;23704:18;;;23697:62;23776:18;;53404:69:0;23444:356:1;53404:69:0;53505:23;53522:6;53505:14;:23;:::i;:::-;-1:-1:-1;;;;;53484:18:0;;;;;;:9;:18;;;;;:44;;;;53539:12;:22;;53555:6;;53484:18;53539:22;;53555:6;;53539:22;:::i;:::-;;;;-1:-1:-1;;53577:37:0;;2360:25:1;;;53603:1:0;;-1:-1:-1;;;;;53577:37:0;;;;;2348:2:1;2333:18;53577:37:0;2214:177:1;17140:248:0;17311:58;;;-1:-1:-1;;;;;12030:32:1;;17311:58:0;;;12012:51:1;12079:18;;;;12072:34;;;17311:58:0;;;;;;;;;;11985:18:1;;;;17311:58:0;;;;;;;;-1:-1:-1;;;;;17311:58:0;-1:-1:-1;;;17311:58:0;;;17257:123;;17291:5;;17257:19;:123::i;2559:191::-;2633:16;2652:6;;-1:-1:-1;;;;;2669:17:0;;;-1:-1:-1;;;;;;2669:17:0;;;;;;2702:40;;2652:6;;;;;;;2702:40;;2633:16;2702:40;2622:128;2559:191;:::o;64518:492::-;64605:16;;;64619:1;64605:16;;;;;;;;64581:21;;64605:16;;;;;;;;;;-1:-1:-1;64605:16:0;64581:40;;64650:4;64632;64637:1;64632:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;64632:23:0;;;:7;;;;;;;;;;:23;;;;64676:15;;:22;;;-1:-1:-1;;;64676:22:0;;;;:15;;;;;:20;;:22;;;;;64632:7;;64676:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64666:4;64671:1;64666:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;64666:32:0;;;:7;;;;;;;;;:32;64741:15;;64709:57;;64726:4;;64741:15;64759:6;64709:8;:57::i;:::-;64777:15;;-1:-1:-1;;;;;64777:15:0;:66;64858:6;64777:15;64926:4;64953:7;1298;1325:6;-1:-1:-1;;;;;1325:6:0;;1252:87;64953:7;64976:15;64777:225;;;;;;;;;;;;;;;;;;;:::i;52936:263::-;-1:-1:-1;;;;;53011:21:0;;53003:63;;;;-1:-1:-1;;;53003:63:0;;25271:2:1;53003:63:0;;;25253:21:1;25310:2;25290:18;;;25283:30;25349:31;25329:18;;;25322:59;25398:18;;53003:63:0;25069:353:1;53003:63:0;53093:6;53077:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;53110:18:0;;;;;;:9;:18;;;;;:28;;53132:6;;53110:18;:28;;53132:6;;53110:28;:::i;:::-;;;;-1:-1:-1;;53154:37:0;;2360:25:1;;;-1:-1:-1;;;;;53154:37:0;;;53171:1;;53154:37;;2348:2:1;2333:18;53154:37:0;;;;;;;52936:263;;:::o;55638:526::-;-1:-1:-1;;;;;55743:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;55721:151;;;;-1:-1:-1;;;55721:151:0;;25629:2:1;55721:151:0;;;25611:21:1;25668:2;25648:18;;;25641:30;25707:34;25687:18;;;25680:62;25778:31;25758:18;;;25751:59;25827:19;;55721:151:0;25427:425:1;55721:151:0;-1:-1:-1;;;;;55883:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;55883:39:0;;;;;;;;;;;;55933:168;;55959:15;;:48;;-1:-1:-1;;;55959:48:0;;-1:-1:-1;;;;;9786:32:1;;;55959:48:0;;;9768:51:1;55959:15:0;9835:18:1;;;9828:50;55959:15:0;;;;:36;;9741:18:1;;55959:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55933:168;;;56040:15;;:49;;-1:-1:-1;;;56040:49:0;;-1:-1:-1;;;;;9786:32:1;;;56040:49:0;;;9768:51:1;56040:15:0;9835:18:1;;;9828:50;56040:15:0;;;;:36;;9741:18:1;;56040:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55933:168;56116:40;;;;;;-1:-1:-1;;;;;56116:40:0;;;;;;;;55638:526;;:::o;22848:391::-;22977:6;22952:21;:31;;22930:110;;;;-1:-1:-1;;;22930:110:0;;26059:2:1;22930:110:0;;;26041:21:1;26098:2;26078:18;;;26071:30;26137:31;26117:18;;;26110:59;26186:18;;22930:110:0;25857:353:1;22930:110:0;23054:12;23072:9;-1:-1:-1;;;;;23072:14:0;23094:6;23072:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23053:52;;;23138:7;23116:115;;;;-1:-1:-1;;;23116:115:0;;26627:2:1;23116:115:0;;;26609:21:1;26666:2;26646:18;;;26639:30;26705:34;26685:18;;;26678:62;26776:28;26756:18;;;26749:56;26822:19;;23116:115:0;26425:422:1;54312:630:0;54373:6;54383:1;54373:11;54369:50;;54312:630;:::o;54369:50::-;54477:14;;54429:25;;54477:14;;;-1:-1:-1;;;;;54477:14:0;54469:37;54465:129;;54571:11;;54553:14;;54544:23;;:6;:23;:::i;:::-;54543:39;;;;:::i;:::-;54523:59;;54465:129;54630:21;54664:38;54684:17;54664:19;:38::i;:::-;54738:21;54715:20;54795:28;54810:13;54738:21;54795:28;:::i;:::-;54770:54;-1:-1:-1;54841:17:0;;54837:98;;54883:14;;54875:48;;54883:14;;;-1:-1:-1;;;;;54883:14:0;54909:13;54875:33;:48::i;51952:603::-;-1:-1:-1;;;;;52090:20:0;;52082:68;;;;-1:-1:-1;;;52082:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52169:23:0;;52161:69;;;;-1:-1:-1;;;52161:69:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52265:17:0;;52241:21;52265:17;;;:9;:17;;;;;;52315:23;;;;52293:109;;;;-1:-1:-1;;;52293:109:0;;;;;;;:::i;:::-;52433:22;52449:6;52433:13;:22;:::i;:::-;-1:-1:-1;;;;;52413:17:0;;;;;;;:9;:17;;;;;;:42;;;;52466:20;;;;;;;;:30;;52490:6;;52413:17;52466:30;;52490:6;;52466:30;:::i;:::-;;;;;;;;52529:9;-1:-1:-1;;;;;52512:35:0;52521:6;-1:-1:-1;;;;;52512:35:0;;52540:6;52512:35;;;;2360:25:1;;2348:2;2333:18;;2214:177;52512:35:0;;;;;;;;52071:484;51952:603;;;:::o;20107:802::-;20531:23;20557:106;20599:4;20557:106;;;;;;;;;;;;;;;;;20565:5;-1:-1:-1;;;;;20557:27:0;;;:106;;;;;:::i;:::-;20678:17;;20531:132;;-1:-1:-1;20678:21:0;20674:228;;20793:10;20782:30;;;;;;;;;;;;:::i;:::-;20756:134;;;;-1:-1:-1;;;20756:134:0;;27054:2:1;20756:134:0;;;27036:21:1;27093:2;27073:18;;;27066:30;27132:34;27112:18;;;27105:62;-1:-1:-1;;;27183:18:1;;;27176:40;27233:19;;20756:134:0;26852:406:1;53630:490:0;53718:16;;;53732:1;53718:16;;;;;;;;53694:21;;53718:16;;;;;;;;;;-1:-1:-1;53718:16:0;53694:40;;53763:4;53745;53750:1;53745:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53745:23:0;;;:7;;;;;;;;;;:23;;;;53789:15;;:22;;;-1:-1:-1;;;53789:22:0;;;;:15;;;;;:20;;:22;;;;;53745:7;;53789:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53779:4;53784:1;53779:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53779:32:0;;;:7;;;;;;;;;:32;53854:15;;53822:57;;53839:4;;53854:15;53872:6;53822:8;:57::i;:::-;53890:15;;:222;;-1:-1:-1;;;53890:222:0;;-1:-1:-1;;;;;53890:15:0;;;;:66;;:222;;53971:6;;53890:15;;54039:4;;54066;;54086:15;;53890:222;;;:::i;24429:229::-;24566:12;24598:52;24620:6;24628:4;24634:1;24637:12;24598:21;:52::i;:::-;24591:59;24429:229;-1:-1:-1;;;;24429:229:0:o;25645:571::-;25815:12;25887:5;25862:21;:30;;25840:118;;;;-1:-1:-1;;;25840:118:0;;27465:2:1;25840:118:0;;;27447:21:1;27504:2;27484:18;;;27477:30;27543:34;27523:18;;;27516:62;-1:-1:-1;;;27594:18:1;;;27587:36;27640:19;;25840:118:0;27263:402:1;25840:118:0;21849:20;;25969:60;;;;-1:-1:-1;;;25969:60:0;;27872:2:1;25969:60:0;;;27854:21:1;27911:2;27891:18;;;27884:30;27950:31;27930:18;;;27923:59;27999:18;;25969:60:0;27670:353:1;25969:60:0;26043:12;26057:23;26084:6;-1:-1:-1;;;;;26084:11:0;26103:5;26124:4;26084:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26042:97;;;;26157:51;26174:7;26183:10;26195:12;26157:16;:51::i;:::-;26150:58;25645:571;-1:-1:-1;;;;;;;25645:571:0:o;28605:712::-;28755:12;28784:7;28780:530;;;-1:-1:-1;28815:10:0;28808:17;;28780:530;28929:17;;:21;28925:374;;29127:10;29121:17;29188:15;29175:10;29171:2;29167:19;29160:44;28925:374;29270:12;29263:20;;-1:-1:-1;;;29263:20:0;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:118::-;375:5;368:13;361:21;354:5;351:32;341:60;;397:1;394;387:12;412:382;477:6;485;538:2;526:9;517:7;513:23;509:32;506:52;;;554:1;551;544:12;506:52;593:9;580:23;612:31;637:5;612:31;:::i;:::-;662:5;-1:-1:-1;719:2:1;704:18;;691:32;732:30;691:32;732:30;:::i;:::-;781:7;771:17;;;412:382;;;;;:::o;799:258::-;871:1;881:113;895:6;892:1;889:13;881:113;;;971:11;;;965:18;952:11;;;945:39;917:2;910:10;881:113;;;1012:6;1009:1;1006:13;1003:48;;;1047:1;1038:6;1033:3;1029:16;1022:27;1003:48;;799:258;;;:::o;1062:383::-;1211:2;1200:9;1193:21;1174:4;1243:6;1237:13;1286:6;1281:2;1270:9;1266:18;1259:34;1302:66;1361:6;1356:2;1345:9;1341:18;1336:2;1328:6;1324:15;1302:66;:::i;:::-;1429:2;1408:15;-1:-1:-1;;1404:29:1;1389:45;;;;1436:2;1385:54;;1062:383;-1:-1:-1;;1062:383:1:o;1450:315::-;1518:6;1526;1579:2;1567:9;1558:7;1554:23;1550:32;1547:52;;;1595:1;1592;1585:12;1547:52;1634:9;1621:23;1653:31;1678:5;1653:31;:::i;:::-;1703:5;1755:2;1740:18;;;;1727:32;;-1:-1:-1;;;1450:315:1:o;1962:247::-;2021:6;2074:2;2062:9;2053:7;2049:23;2045:32;2042:52;;;2090:1;2087;2080:12;2042:52;2129:9;2116:23;2148:31;2173:5;2148:31;:::i;2631:180::-;2690:6;2743:2;2731:9;2722:7;2718:23;2714:32;2711:52;;;2759:1;2756;2749:12;2711:52;-1:-1:-1;2782:23:1;;2631:180;-1:-1:-1;2631:180:1:o;2816:456::-;2893:6;2901;2909;2962:2;2950:9;2941:7;2937:23;2933:32;2930:52;;;2978:1;2975;2968:12;2930:52;3017:9;3004:23;3036:31;3061:5;3036:31;:::i;:::-;3086:5;-1:-1:-1;3143:2:1;3128:18;;3115:32;3156:33;3115:32;3156:33;:::i;:::-;2816:456;;3208:7;;-1:-1:-1;;;3262:2:1;3247:18;;;;3234:32;;2816:456::o;3906:367::-;3969:8;3979:6;4033:3;4026:4;4018:6;4014:17;4010:27;4000:55;;4051:1;4048;4041:12;4000:55;-1:-1:-1;4074:20:1;;4117:18;4106:30;;4103:50;;;4149:1;4146;4139:12;4103:50;4186:4;4178:6;4174:17;4162:29;;4246:3;4239:4;4229:6;4226:1;4222:14;4214:6;4210:27;4206:38;4203:47;4200:67;;;4263:1;4260;4253:12;4200:67;3906:367;;;;;:::o;4278:437::-;4364:6;4372;4425:2;4413:9;4404:7;4400:23;4396:32;4393:52;;;4441:1;4438;4431:12;4393:52;4481:9;4468:23;4514:18;4506:6;4503:30;4500:50;;;4546:1;4543;4536:12;4500:50;4585:70;4647:7;4638:6;4627:9;4623:22;4585:70;:::i;:::-;4674:8;;4559:96;;-1:-1:-1;4278:437:1;-1:-1:-1;;;;4278:437:1:o;4720:316::-;4797:6;4805;4813;4866:2;4854:9;4845:7;4841:23;4837:32;4834:52;;;4882:1;4879;4872:12;4834:52;-1:-1:-1;;4905:23:1;;;4975:2;4960:18;;4947:32;;-1:-1:-1;5026:2:1;5011:18;;;4998:32;;4720:316;-1:-1:-1;4720:316:1:o;5041:444::-;5112:6;5120;5128;5181:2;5169:9;5160:7;5156:23;5152:32;5149:52;;;5197:1;5194;5187:12;5149:52;5236:9;5223:23;5255:28;5277:5;5255:28;:::i;:::-;5302:5;-1:-1:-1;5354:2:1;5339:18;;5326:32;;-1:-1:-1;5410:2:1;5395:18;;5382:32;5423:30;5382:32;5423:30;:::i;:::-;5472:7;5462:17;;;5041:444;;;;;:::o;5490:773::-;5612:6;5620;5628;5636;5689:2;5677:9;5668:7;5664:23;5660:32;5657:52;;;5705:1;5702;5695:12;5657:52;5745:9;5732:23;5774:18;5815:2;5807:6;5804:14;5801:34;;;5831:1;5828;5821:12;5801:34;5870:70;5932:7;5923:6;5912:9;5908:22;5870:70;:::i;:::-;5959:8;;-1:-1:-1;5844:96:1;-1:-1:-1;6047:2:1;6032:18;;6019:32;;-1:-1:-1;6063:16:1;;;6060:36;;;6092:1;6089;6082:12;6060:36;;6131:72;6195:7;6184:8;6173:9;6169:24;6131:72;:::i;:::-;5490:773;;;;-1:-1:-1;6222:8:1;-1:-1:-1;;;;5490:773:1:o;6762:315::-;6830:6;6838;6891:2;6879:9;6870:7;6866:23;6862:32;6859:52;;;6907:1;6904;6897:12;6859:52;6943:9;6930:23;6920:33;;7003:2;6992:9;6988:18;6975:32;7016:31;7041:5;7016:31;:::i;7082:127::-;7143:10;7138:3;7134:20;7131:1;7124:31;7174:4;7171:1;7164:15;7198:4;7195:1;7188:15;7214:1121;7298:6;7329:2;7372;7360:9;7351:7;7347:23;7343:32;7340:52;;;7388:1;7385;7378:12;7340:52;7428:9;7415:23;7457:18;7498:2;7490:6;7487:14;7484:34;;;7514:1;7511;7504:12;7484:34;7552:6;7541:9;7537:22;7527:32;;7597:7;7590:4;7586:2;7582:13;7578:27;7568:55;;7619:1;7616;7609:12;7568:55;7655:2;7642:16;7677:2;7673;7670:10;7667:36;;;7683:18;;:::i;:::-;7729:2;7726:1;7722:10;7761:2;7755:9;7824:2;7820:7;7815:2;7811;7807:11;7803:25;7795:6;7791:38;7879:6;7867:10;7864:22;7859:2;7847:10;7844:18;7841:46;7838:72;;;7890:18;;:::i;:::-;7926:2;7919:22;7976:18;;;8010:15;;;;-1:-1:-1;8052:11:1;;;8048:20;;;8080:19;;;8077:39;;;8112:1;8109;8102:12;8077:39;8136:11;;;;8156:148;8172:6;8167:3;8164:15;8156:148;;;8238:23;8257:3;8238:23;:::i;:::-;8226:36;;8189:12;;;;8282;;;;8156:148;;;8323:6;7214:1121;-1:-1:-1;;;;;;;;7214:1121:1:o;8340:241::-;8396:6;8449:2;8437:9;8428:7;8424:23;8420:32;8417:52;;;8465:1;8462;8455:12;8417:52;8504:9;8491:23;8523:28;8545:5;8523:28;:::i;8586:388::-;8654:6;8662;8715:2;8703:9;8694:7;8690:23;8686:32;8683:52;;;8731:1;8728;8721:12;8683:52;8770:9;8757:23;8789:31;8814:5;8789:31;:::i;:::-;8839:5;-1:-1:-1;8896:2:1;8881:18;;8868:32;8909:33;8868:32;8909:33;:::i;9239:356::-;9441:2;9423:21;;;9460:18;;;9453:30;9519:34;9514:2;9499:18;;9492:62;9586:2;9571:18;;9239:356::o;9889:380::-;9968:1;9964:12;;;;10011;;;10032:61;;10086:4;10078:6;10074:17;10064:27;;10032:61;10139:2;10131:6;10128:14;10108:18;10105:38;10102:161;;10185:10;10180:3;10176:20;10173:1;10166:31;10220:4;10217:1;10210:15;10248:4;10245:1;10238:15;10102:161;;9889:380;;;:::o;11029:127::-;11090:10;11085:3;11081:20;11078:1;11071:31;11121:4;11118:1;11111:15;11145:4;11142:1;11135:15;11161:125;11201:4;11229:1;11226;11223:8;11220:34;;;11234:18;;:::i;:::-;-1:-1:-1;11271:9:1;;11161:125::o;11291:184::-;11361:6;11414:2;11402:9;11393:7;11389:23;11385:32;11382:52;;;11430:1;11427;11420:12;11382:52;-1:-1:-1;11453:16:1;;11291:184;-1:-1:-1;11291:184:1:o;11480:337::-;11682:2;11664:21;;;11721:2;11701:18;;;11694:30;-1:-1:-1;;;11755:2:1;11740:18;;11733:43;11808:2;11793:18;;11480:337::o;12117:128::-;12157:3;12188:1;12184:6;12181:1;12178:13;12175:39;;;12194:18;;:::i;:::-;-1:-1:-1;12230:9:1;;12117:128::o;12603:127::-;12664:10;12659:3;12655:20;12652:1;12645:31;12695:4;12692:1;12685:15;12719:4;12716:1;12709:15;12735:175;12772:3;12816:4;12809:5;12805:16;12845:4;12836:7;12833:17;12830:43;;12853:18;;:::i;:::-;12902:1;12889:15;;12735:175;-1:-1:-1;;12735:175:1:o;13139:245::-;13206:6;13259:2;13247:9;13238:7;13234:23;13230:32;13227:52;;;13275:1;13272;13265:12;13227:52;13307:9;13301:16;13326:28;13348:5;13326:28;:::i;13742:346::-;13944:2;13926:21;;;13983:2;13963:18;;;13956:30;-1:-1:-1;;;14017:2:1;14002:18;;13995:52;14079:2;14064:18;;13742:346::o;14093:422::-;14182:1;14225:5;14182:1;14239:270;14260:7;14250:8;14247:21;14239:270;;;14319:4;14315:1;14311:6;14307:17;14301:4;14298:27;14295:53;;;14328:18;;:::i;:::-;14378:7;14368:8;14364:22;14361:55;;;14398:16;;;;14361:55;14477:22;;;;14437:15;;;;14239:270;;;14243:3;14093:422;;;;;:::o;14520:806::-;14569:5;14599:8;14589:80;;-1:-1:-1;14640:1:1;14654:5;;14589:80;14688:4;14678:76;;-1:-1:-1;14725:1:1;14739:5;;14678:76;14770:4;14788:1;14783:59;;;;14856:1;14851:130;;;;14763:218;;14783:59;14813:1;14804:10;;14827:5;;;14851:130;14888:3;14878:8;14875:17;14872:43;;;14895:18;;:::i;:::-;-1:-1:-1;;14951:1:1;14937:16;;14966:5;;14763:218;;15065:2;15055:8;15052:16;15046:3;15040:4;15037:13;15033:36;15027:2;15017:8;15014:16;15009:2;15003:4;15000:12;14996:35;14993:77;14990:159;;;-1:-1:-1;15102:19:1;;;15134:5;;14990:159;15181:34;15206:8;15200:4;15181:34;:::i;:::-;15251:6;15247:1;15243:6;15239:19;15230:7;15227:32;15224:58;;;15262:18;;:::i;:::-;15300:20;;14520:806;-1:-1:-1;;;14520:806:1:o;15331:140::-;15389:5;15418:47;15459:4;15449:8;15445:19;15439:4;15418:47;:::i;15476:168::-;15516:7;15582:1;15578;15574:6;15570:14;15567:1;15564:21;15559:1;15552:9;15545:17;15541:45;15538:71;;;15589:18;;:::i;:::-;-1:-1:-1;15629:9:1;;15476:168::o;15649:135::-;15688:3;15709:17;;;15706:43;;15729:18;;:::i;:::-;-1:-1:-1;15776:1:1;15765:13;;15649:135::o;16207:251::-;16277:6;16330:2;16318:9;16309:7;16305:23;16301:32;16298:52;;;16346:1;16343;16336:12;16298:52;16378:9;16372:16;16397:31;16422:5;16397:31;:::i;16772:497::-;16878:6;16886;16894;16902;16910;16963:3;16951:9;16942:7;16938:23;16934:33;16931:53;;;16980:1;16977;16970:12;16931:53;17012:9;17006:16;17031:31;17056:5;17031:31;:::i;:::-;17126:2;17111:18;;17105:25;17170:2;17155:18;;17149:25;17214:2;17199:18;;17193:25;17258:3;17243:19;;;17237:26;17081:5;;17105:25;;-1:-1:-1;17149:25:1;17193;-1:-1:-1;17237:26:1;;-1:-1:-1;16772:497:1;-1:-1:-1;;;16772:497:1:o;21305:399::-;21507:2;21489:21;;;21546:2;21526:18;;;21519:30;21585:34;21580:2;21565:18;;21558:62;-1:-1:-1;;;21651:2:1;21636:18;;21629:33;21694:3;21679:19;;21305:399::o;21709:397::-;21911:2;21893:21;;;21950:2;21930:18;;;21923:30;21989:34;21984:2;21969:18;;21962:62;-1:-1:-1;;;22055:2:1;22040:18;;22033:31;22096:3;22081:19;;21709:397::o;22111:217::-;22151:1;22177;22167:132;;22221:10;22216:3;22212:20;22209:1;22202:31;22256:4;22253:1;22246:15;22284:4;22281:1;22274:15;22167:132;-1:-1:-1;22313:9:1;;22111:217::o;22679:400::-;22881:2;22863:21;;;22920:2;22900:18;;;22893:30;22959:34;22954:2;22939:18;;22932:62;-1:-1:-1;;;23025:2:1;23010:18;;23003:34;23069:3;23054:19;;22679:400::o;24084:980::-;24346:4;24394:3;24383:9;24379:19;24425:6;24414:9;24407:25;24451:2;24489:6;24484:2;24473:9;24469:18;24462:34;24532:3;24527:2;24516:9;24512:18;24505:31;24556:6;24591;24585:13;24622:6;24614;24607:22;24660:3;24649:9;24645:19;24638:26;;24699:2;24691:6;24687:15;24673:29;;24720:1;24730:195;24744:6;24741:1;24738:13;24730:195;;;24809:13;;-1:-1:-1;;;;;24805:39:1;24793:52;;24900:15;;;;24865:12;;;;24841:1;24759:9;24730:195;;;-1:-1:-1;;;;;;;24981:32:1;;;;24976:2;24961:18;;24954:60;-1:-1:-1;;;25045:3:1;25030:19;25023:35;24942:3;24084:980;-1:-1:-1;;;24084:980:1:o;28028:274::-;28157:3;28195:6;28189:13;28211:53;28257:6;28252:3;28245:4;28237:6;28233:17;28211:53;:::i;:::-;28280:16;;;;;28028:274;-1:-1:-1;;28028:274:1:o

Swarm Source

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