Token Croshi Inu

DeFi  

Overview

Price
$0.00 @ 0.000000 CRO
Fully Diluted Market Cap
Total Supply:
0

Holders:
1,060 addresses

Transfers:
-

Loading
Loading
Loading

OVERVIEW

Project Description: Croshi Inu is a decentralised, peer-to-peer digital asset and meme token on the Cronos blockchain.


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

Contract Source Code Verified (Exact Match)

Contract Name:
CroshiInu

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-03-27
*/

// SPDX-License-Identifier: MIT

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

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

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

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

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

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

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

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

// Dependency file: @openzeppelin/contracts/utils/Context.sol

// pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

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

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

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

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

/**
 * @dev Collection of functions related to the address type
 */
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);
            }
        }
    }
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity =0.8.13;

contract CroshiInu is IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

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

    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcluded;
    mapping(address => bool) private _isBlackedlisted;

    address WCRO = 0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23;

    address[] private _excluded;
    address payable public crommunityAddress;
    address payable public developmentAddress;
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tFeeTotal;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    uint256 public _taxFee;
    uint256 private _previousTaxFee = _taxFee;

    uint256 public _liquidityFee;
    uint256 private _previousLiquidityFee = _liquidityFee;

    uint256 public _crommunityFee;
    uint256 private _previouscrommunityFee = _crommunityFee;

    uint256 public _developmentFee;
    uint256 private _previousDevelopmentFee = _developmentFee;

    uint256 public _totalTaxes;
    uint256 private _previousTotalTaxes = _totalTaxes;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled;

    uint256 public numTokensSellToAddToLiquidity;

    uint256 private _launchTime;
    uint256 private _launchTimeOriginal;

    bool public _isLaunched;

    uint256 public _extraSellFee = 0;

    uint256 public _maxWalletSize;
	
	uint256 public _maxTxSize;

    uint256 private randNum;

    bool private sell = false;

    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

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

    constructor(
    ) payable {
        
        _name = "Croshi Inu";
        _symbol = "CROSHI";
        _decimals = 9;

        _tTotal = 100000000000000000;
                
        _rTotal = (MAX - (MAX % _tTotal));

        _maxWalletSize = 1000000000000000; //%1
		_maxTxSize = MAX;// Will set to after liq added 500000000000000; //%1

        _taxFee = 0;
        _previousTaxFee = 0;

        _liquidityFee = 300;
        _previousLiquidityFee = 300;

        _crommunityFee = 300;
        _previouscrommunityFee = 300;

        _developmentFee = 100;
        _previousDevelopmentFee = 100;

        _totalTaxes = 700;
        _previousTotalTaxes = 700;

        //numTokensSellToAddToLiquidity =  _tTotal.mul(5).div(10**4); // 0.05%

        numTokensSellToAddToLiquidity =  1000000000000000; // 1% of an CRO
        swapAndLiquifyEnabled = true;

        _rOwned[owner()] = _rTotal;

        //address router_=0x10ED43C718714eb63d5aA57B78B54704E256024E;       
        
        address router_=0x145677FC4d9b8F19B5D56d1820c48e0443049a30;

        crommunityAddress=payable(0xfD14D72EfcB6f5636D66140ddC8664Bdef9Dcf67);

        developmentAddress=payable(0x0ECC2fE42cb55C6C916E0B50307cAD82989308a2);

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

        // set the rest of the contract variables
        uniswapV2Router = _uniswapV2Router;

        // exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        random();

        emit Transfer(address(0), owner(), _tTotal);

    }

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

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

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

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

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    function random() private
    {        
        uint256 randomnumber = uint256(keccak256(abi.encodePacked(block.timestamp,block.difficulty,  
            _msgSender()))) % 60;
        randNum = randomnumber + 1; 

    }

    function updateCrommunityAddress(address payable _newCrommunityAddress) external onlyOwner { 
        crommunityAddress= _newCrommunityAddress;
    }

    function setExtraSellFee(uint256 amt) public onlyOwner 
    {
        require(
            amt >= 0 && amt <= 10**4,
            "Invalid bps"
        );
         _extraSellFee = amt;

    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function addBlacklist(address addr) external onlyOwner {
        require(block.timestamp < _launchTime + 1 hours);
        _isBlackedlisted[addr]=true;

    }

    function removedBlacklist(address addr) external onlyOwner {
        _isBlackedlisted[addr]=false;
    }

    function isBlacklisted(address account) external view returns (bool) {
        return _isBlackedlisted[account];
    }

    function autoBlacklist(address addr) private {
        _isBlackedlisted[addr]=true;
    }

 

    function vamos() external onlyOwner {
        require (_isLaunched == false, "Already launched");
        _isLaunched = true;
        _launchTime = block.timestamp;
        _launchTimeOriginal = block.timestamp;
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
        public
        view
        returns (uint256)
    {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount, , , , , , ,  ) = _getValues(tAmount);
            return rAmount;
        } else {
            (, uint256 rTransferAmount, , , , , , ) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount)
        public
        view
        returns (uint256)
    {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) public onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner {
        require(_isExcluded[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tCrommunity,
            uint256 tDevelopment
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _takeCrommunityFee(tCrommunity);
        _takeDevFee(tDevelopment);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function setTaxPercents(uint256 taxFeeBps,uint256 liquidityFeeBps, uint256 crommunityFeeBps, uint256 developmentFeeBps) external onlyOwner {
        require(taxFeeBps >= 0 && taxFeeBps <= 10**4, "Invalid bps");
        require(
            liquidityFeeBps >= 0 && liquidityFeeBps <= 10**4,
            "Invalid bps"
        );
        require(
            crommunityFeeBps >= 0 && crommunityFeeBps <= 10**4,
            "Invalid bps"
        );

        require(
            developmentFeeBps >= 0 && developmentFeeBps <= 10**4,
            "Invalid bps"
        );

        _taxFee = taxFeeBps;
        _liquidityFee = liquidityFeeBps;
        _crommunityFee = crommunityFeeBps;
        _developmentFee = developmentFeeBps;

        _totalTaxes = _liquidityFee + _crommunityFee + _taxFee + _developmentFee;

        require(
            _totalTaxes >= 0 && _totalTaxes <= 20**4,
            "Invalid bps"
        );
    }

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

    function setSwapValue(uint256 amount) external onlyOwner {
        require(amount>0, "Value too low");
        numTokensSellToAddToLiquidity = amount;

    }

    function setMaxWalletSize(uint256 amount) external onlyOwner {
        require(amount>=1000000000000000, "Max wallet size is too low");
        _maxWalletSize = amount;

    }

     function setMaxTxtSize(uint256 amount) external onlyOwner {
        require(amount>=500000000000000, "Max wallet size is too low");
        _maxTxSize = amount;

    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    struct GetValueVar
    {
        uint256 tTransferAmount;
        uint256 tFee;
        uint256 tLiquidity;
        uint256 tCrommunity;
        uint256 tDevelopment;
    }

    function _getValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {

        GetValueVar memory _var;
   
        (
            _var.tTransferAmount,
            _var.tFee,
            _var.tLiquidity,
            _var.tCrommunity,
            _var.tDevelopment
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            _var.tFee,
            _var.tLiquidity,
            _var.tCrommunity,
            _var.tDevelopment,
            _getRate()
        );
        return (
            rAmount,
            rTransferAmount,
            rFee,
            _var.tTransferAmount,
            _var.tFee,
            _var.tLiquidity,
            _var.tCrommunity,
            _var.tDevelopment
        );
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tCrommunityFee = calculateCrommunityFee(tAmount);
        uint256 tDevelopmentFee = calculateDevelopmentFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee);
        tTransferAmount=tTransferAmount.sub(tLiquidity);
        tTransferAmount=tTransferAmount.sub(tCrommunityFee).sub(tDevelopmentFee);

        return (tTransferAmount, tFee, tLiquidity, tCrommunityFee, tDevelopmentFee);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tLiquidity,
        uint256 tCrommunity,
        uint256 tDevelopment,
        uint256 currentRate
    )
        private
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rCrommunity = tCrommunity.mul(currentRate);
        uint256 rDev = tDevelopment.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee);
        rTransferAmount=rTransferAmount.sub(rLiquidity);
        rTransferAmount=rTransferAmount.sub(rCrommunity);
        rTransferAmount=rTransferAmount.sub(rDev);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }

    function _takeCrommunityFee(uint256 tCrommunity) private {

        uint256 currentRate = _getRate();
        uint256 rCrommunity = tCrommunity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rCrommunity);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tCrommunity);
     }

    function _takeDevFee(uint256 tCharity) private {
        uint256 currentRate = _getRate();
        uint256 rDev = tCharity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rDev);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tCharity);
     }

    

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(10**4);
    }

    function calculateLiquidityFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_liquidityFee).div(10**4);
    }

    function calculateCrommunityFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        if(sell==true)
        {   
            return _amount.mul((_crommunityFee.add(_extraSellFee))).div(10**4);
        }

         return _amount.mul(_crommunityFee).div(10**4);
    }

     function calculateDevelopmentFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_developmentFee).div(10**4);
    }


    function removeAllFee() private {
        if (_taxFee == 0 && _liquidityFee == 0 && _crommunityFee == 0 && _developmentFee == 0) return;

        _previousTaxFee = _taxFee;
        _previousLiquidityFee = _liquidityFee;
        _previouscrommunityFee = _crommunityFee;
        _previousDevelopmentFee = _developmentFee;
        _previousTotalTaxes = _totalTaxes;

        _taxFee = 0;
        _liquidityFee = 0;
        _developmentFee = 0;
        _crommunityFee = 0;
        _totalTaxes = 0;

    }

    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _liquidityFee = _previousLiquidityFee;
        _crommunityFee = _previouscrommunityFee;
        _developmentFee = _previousDevelopmentFee;
        _totalTaxes = _previousTotalTaxes;
    }

    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        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);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(_isBlackedlisted[from]!=true && _isBlackedlisted[to]!=true, "Address is blacklisted");

        // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swap + liquidity lock?
        // also, don't get caught in a circular liquidity event.
        // also, don't swap & liquify if sender is uniswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));
        sell=false;

        if (to==uniswapV2Pair)
        {
            sell=true;
        }

        bool overMinTokenBalance = contractTokenBalance >=
            numTokensSellToAddToLiquidity;
        if (
            from != uniswapV2Pair &&
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            swapAndLiquifyEnabled
        ) {
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }

        //indicates if fee should be deducted from transfer
        bool takeFee = true;

        //if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }

        //transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from, to, amount, takeFee);
    }

    function manualETH(uint256 amountPercentage) external onlyOwner {
        uint256 amountETH = address(this).balance;
        payable(owner()).transfer(amountETH * amountPercentage / 100);
    }

    function manualToken() external onlyOwner {
        
        uint256 amountToken = balanceOf(address(this));
        _rOwned[address(this)] = _rOwned[address(this)].sub(amountToken);
        _rOwned[owner()] = _rOwned[owner()].add(amountToken);
        _tOwned[address(this)] = _tOwned[address(this)].sub(amountToken);
        _tOwned[owner()] = _tOwned[owner()].add(amountToken);
        emit Transfer(address(this), owner(), (amountToken));

    }

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        // split the contract balance into halves
        uint256 liquidityTokenPortion = contractTokenBalance.div(_totalTaxes).mul(_liquidityFee);
        liquidityTokenPortion = liquidityTokenPortion.div(2);

        uint256 otherPortion = contractTokenBalance.sub(liquidityTokenPortion);

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

        // swap tokens for ETH
        swapTokensForEth(otherPortion); 

        uint256 liqD = _liquidityFee.div(2);
        uint256 divisor = _crommunityFee + _developmentFee  + _taxFee + liqD;

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

        uint256 liquidityETHPortion = newBalance.mul(_totalTaxes).div(divisor);
        liquidityETHPortion = liquidityETHPortion.div(_totalTaxes).mul(liqD);

        uint256 newBalanceAfterLiq = address(this).balance.sub(liquidityETHPortion);

       // uint256 taxesWithoutLiq = _totalTaxes.sub(_liquidityFee);

        uint256 total = _totalTaxes.sub(_liquidityFee);

        uint256 crommunityPortion = newBalanceAfterLiq.div(total).mul(_crommunityFee);
        payable(crommunityAddress).transfer(crommunityPortion);

        uint256 developmentPortion = newBalanceAfterLiq.div(total).mul(_developmentFee);
        payable(developmentAddress).transfer(developmentPortion);

        // add liquidity to uniswap
        addLiquidity(liquidityTokenPortion, liquidityETHPortion);
        emit SwapAndLiquify(liquidityTokenPortion, newBalanceAfterLiq, liquidityETHPortion);
    }

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

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

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

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

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

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) private {
        if (!takeFee) removeAllFee();
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }

        if (!takeFee) restoreAllFee();
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tCrommunity,
            uint256 tDevelopment
        ) = _getValues(tAmount);    

        require( tAmount <_maxTxSize, "Amount is larger than max transaction");
        if (_isLaunched !=true && recipient !=uniswapV2Pair && sender!=owner() && recipient!=owner()) 
        {
            _rOwned[sender] = _rOwned[sender].sub(rAmount);
            _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
            emit Transfer(sender, recipient, tTransferAmount);                    
            autoBlacklist(recipient);
        }

        else if (_isLaunched==true && _launchTime + 5 minutes + randNum > block.timestamp && recipient !=uniswapV2Pair && sender!=owner() && recipient!=owner()) 
        {
            _rOwned[sender] = _rOwned[sender].sub(rAmount);
            _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
            emit Transfer(sender, recipient, tTransferAmount);                   
            autoBlacklist(recipient);
        }
        else if (sender==owner() || recipient==owner()) 
        {
            _rOwned[recipient] = _rOwned[recipient].add(rAmount);
            _rOwned[sender] = _rOwned[sender].sub(rAmount);   

            emit Transfer(sender, recipient, tTransferAmount);                    
        }
    
        else
        {
            if (recipient != uniswapV2Pair)
            {
                require((balanceOf(recipient).add(tAmount)) <= _maxWalletSize , "Transfer exceeds max wallet size");
            }

            _rOwned[sender] = _rOwned[sender].sub(rAmount);
            _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
            _takeLiquidity(tLiquidity);
            _takeCrommunityFee(tCrommunity);
            _takeDevFee(tDevelopment);
            _reflectFee(rFee, tFee);
            emit Transfer(sender, recipient, tTransferAmount);

        }  
        
        
        
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tCrommunity,
            uint256 tDevelopment
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _takeCrommunityFee(tCrommunity);
        _takeDevFee(tDevelopment);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tCrommunity,
            uint256 tDevelopment
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _takeCrommunityFee(tCrommunity);
        _takeDevFee(tDevelopment);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function removeLiquidtySteps() public onlyOwner(){
        swapAndLiquifyEnabled=false;
        _maxWalletSize=MAX;
        _maxTxSize=MAX;
        _crommunityFee=0;
        _developmentFee=0;
        _liquidityFee=0;
        _extraSellFee=0;
        _totalTaxes=0;
        excludeFromFee(owner());
        excludeFromReward(owner());
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_crommunityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_developmentFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_extraSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crommunityAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developmentAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountPercentage","type":"uint256"}],"name":"manualETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLiquidtySteps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removedBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"setExtraSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTxtSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFeeBps","type":"uint256"},{"internalType":"uint256","name":"liquidityFeeBps","type":"uint256"},{"internalType":"uint256","name":"crommunityFeeBps","type":"uint256"},{"internalType":"uint256","name":"developmentFeeBps","type":"uint256"}],"name":"setTaxPercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newCrommunityAddress","type":"address"}],"name":"updateCrommunityAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vamos","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600780546001600160a01b031916735c7f8a570d578ed84e63fdfa7b1ee72deae1ae23179055601154601255601354601455601554601655601754601855601954601a5560006021556025805460ff1916905562000069620000633390565b6200043d565b60408051808201909152600a8082526943726f73686920496e7560b01b60209092019182526200009c91600e91620004f1565b506040805180820190915260068082526543524f53484960d01b6020909201918252620000cc91600f91620004f1565b506010805460ff1916600917905567016345785d8a0000600b819055620000f69060001962000597565b6200010490600019620005d0565b600c81905566038d7ea4c68000602281905560001960235560006011819055601281905561012c601381905560148190556015819055601655606460178190556018556102bc6019819055601a55601d91909155601c805460ff60a81b1916600160a81b179055600190620001816000546001600160a01b031690565b6001600160a01b03168152602080820192909252604090810160002092909255600980546001600160a01b031990811673fd14d72efcb6f5636d66140ddc8664bdef9dcf6717909155600a8054909116730ecc2fe42cb55c6c916e0b50307cad82989308a2179055815163c45a015560e01b8152915173145677fc4d9b8f19b5d56d1820c48e0443049a30928392839263c45a01559260048082019392918290030181865afa15801562000239573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025f9190620005ea565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d39190620005ea565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000321573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003479190620005ea565b601c80546001600160a01b03199081166001600160a01b0393841617909155601b80549091169183169190911790556001600460006200038f6000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526004909252902080549091166001179055620003d96200048d565b6000546001600160a01b03166001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600b546040516200042d91815260200190565b60405180910390a3505062000673565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805142602080830191909152448284015233606090811b6001600160601b031916908301528251605481840301815260749092019092528051910120600090620004dc90603c9062000597565b9050620004eb8160016200061c565b60245550565b828054620004ff9062000637565b90600052602060002090601f0160209004810192826200052357600085556200056e565b82601f106200053e57805160ff19168380011785556200056e565b828001600101855582156200056e579182015b828111156200056e57825182559160200191906001019062000551565b506200057c92915062000580565b5090565b5b808211156200057c576000815560010162000581565b600082620005b557634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b600082821015620005e557620005e5620005ba565b500390565b600060208284031215620005fd57600080fd5b81516001600160a01b03811681146200061557600080fd5b9392505050565b60008219821115620006325762000632620005ba565b500190565b600181811c908216806200064c57607f821691505b6020821081036200066d57634e487b7160e01b600052602260045260246000fd5b50919050565b61332180620006836000396000f3fe6080604052600436106103035760003560e01c806370a0823111610190578063be9ace74116100dc578063dd62ed3e11610095578063ea2f0b371161006f578063ea2f0b3714610901578063f2fde38b14610921578063fe2b6bc614610941578063fe575a871461095657600080fd5b8063dd62ed3e14610886578063e24208c6146108cc578063ea1644d5146108e157600080fd5b8063be9ace74146107ee578063c49b9a8014610804578063c665356214610824578063c9e3c0a314610844578063d12a76881461085a578063d14751851461087057600080fd5b80639725cd5b116101495780639e0a7810116101235780639e0a781014610774578063a457c2d71461078e578063a9059cbb146107ae578063bd060bff146107ce57600080fd5b80639725cd5b1461071f57806397bfcda3146107345780639cfe42da1461075457600080fd5b806370a0823114610668578063715018a61461068857806388f820201461069d5780638da5cb5b146106d65780638f9a55c0146106f457806395d89b411461070a57600080fd5b80633b124fe71161024f57806352390c0211610208578063638b1b14116101e2578063638b1b14146105f257806366e930b3146106125780636a570249146106325780636bc87c3a1461065257600080fd5b806352390c02146105795780635342acb41461059957806355739b77146105d257600080fd5b80633b124fe7146104cc578063437823ec146104e25780634549b0391461050257806349bd5a5e146105225780634a74bb0214610542578063511b5f611461056357600080fd5b806318160ddd116102bc578063313ce56711610296578063313ce5671461045457806334936d7a146104765780633685d4191461048c57806339509351146104ac57600080fd5b806318160ddd146103ff57806323b872dd146104145780632d8381191461043457600080fd5b806306b4b8381461030f57806306fdde031461034c578063095ea7b31461036e57806313114a9d1461039e57806314a18e73146103bd5780631694505e146103df57600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5060095461032f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561035857600080fd5b5061036161098f565b6040516103439190612e8f565b34801561037a57600080fd5b5061038e610389366004612ef9565b610a21565b6040519015158152602001610343565b3480156103aa57600080fd5b50600d545b604051908152602001610343565b3480156103c957600080fd5b506103dd6103d8366004612f25565b610a38565b005b3480156103eb57600080fd5b50601b5461032f906001600160a01b031681565b34801561040b57600080fd5b50600b546103af565b34801561042057600080fd5b5061038e61042f366004612f57565b610b55565b34801561044057600080fd5b506103af61044f366004612f98565b610bbe565b34801561046057600080fd5b5060105460405160ff9091168152602001610343565b34801561048257600080fd5b506103af60155481565b34801561049857600080fd5b506103dd6104a7366004612fb1565b610c42565b3480156104b857600080fd5b5061038e6104c7366004612ef9565b610df8565b3480156104d857600080fd5b506103af60115481565b3480156104ee57600080fd5b506103dd6104fd366004612fb1565b610e2e565b34801561050e57600080fd5b506103af61051d366004612fe3565b610e7c565b34801561052e57600080fd5b50601c5461032f906001600160a01b031681565b34801561054e57600080fd5b50601c5461038e90600160a81b900460ff1681565b34801561056f57600080fd5b506103af60235481565b34801561058557600080fd5b506103dd610594366004612fb1565b610f0d565b3480156105a557600080fd5b5061038e6105b4366004612fb1565b6001600160a01b031660009081526004602052604090205460ff1690565b3480156105de57600080fd5b506103dd6105ed366004612f98565b611060565b3480156105fe57600080fd5b50600a5461032f906001600160a01b031681565b34801561061e57600080fd5b506103dd61062d366004612fb1565b6110cf565b34801561063e57600080fd5b506103dd61064d366004612f98565b61111a565b34801561065e57600080fd5b506103af60135481565b34801561067457600080fd5b506103af610683366004612fb1565b61116b565b34801561069457600080fd5b506103dd6111ca565b3480156106a957600080fd5b5061038e6106b8366004612fb1565b6001600160a01b031660009081526005602052604090205460ff1690565b3480156106e257600080fd5b506000546001600160a01b031661032f565b34801561070057600080fd5b506103af60225481565b34801561071657600080fd5b50610361611200565b34801561072b57600080fd5b506103dd61120f565b34801561074057600080fd5b506103dd61074f366004612f98565b6113a7565b34801561076057600080fd5b506103dd61076f366004612fb1565b611433565b34801561078057600080fd5b5060205461038e9060ff1681565b34801561079a57600080fd5b5061038e6107a9366004612ef9565b61149b565b3480156107ba57600080fd5b5061038e6107c9366004612ef9565b6114ea565b3480156107da57600080fd5b506103dd6107e9366004612fb1565b6114f7565b3480156107fa57600080fd5b506103af60215481565b34801561081057600080fd5b506103dd61081f36600461300f565b611543565b34801561083057600080fd5b506103dd61083f366004612f98565b6115c5565b34801561085057600080fd5b506103af60195481565b34801561086657600080fd5b506103af601d5481565b34801561087c57600080fd5b506103af60175481565b34801561089257600080fd5b506103af6108a136600461302a565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156108d857600080fd5b506103dd61164b565b3480156108ed57600080fd5b506103dd6108fc366004612f98565b6116d0565b34801561090d57600080fd5b506103dd61091c366004612fb1565b611756565b34801561092d57600080fd5b506103dd61093c366004612fb1565b6117a1565b34801561094d57600080fd5b506103dd61183c565b34801561096257600080fd5b5061038e610971366004612fb1565b6001600160a01b031660009081526006602052604090205460ff1690565b6060600e805461099e90613063565b80601f01602080910402602001604051908101604052809291908181526020018280546109ca90613063565b8015610a175780601f106109ec57610100808354040283529160200191610a17565b820191906000526020600020905b8154815290600101906020018083116109fa57829003601f168201915b5050505050905090565b6000610a2e3384846118c4565b5060015b92915050565b6000546001600160a01b03163314610a6b5760405162461bcd60e51b8152600401610a629061309d565b60405180910390fd5b612710841115610a8d5760405162461bcd60e51b8152600401610a62906130d2565b612710831115610aaf5760405162461bcd60e51b8152600401610a62906130d2565b612710821115610ad15760405162461bcd60e51b8152600401610a62906130d2565b612710811115610af35760405162461bcd60e51b8152600401610a62906130d2565b60118490556013839055601582905560178190558084610b13848661310d565b610b1d919061310d565b610b27919061310d565b601955620271006019541115610b4f5760405162461bcd60e51b8152600401610a62906130d2565b50505050565b6000610b628484846119e8565b610bb48433610baf8560405180606001604052806028815260200161327f602891396001600160a01b038a1660009081526003602090815260408083203384529091529020549190611c98565b6118c4565b5060019392505050565b6000600c54821115610c255760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610a62565b6000610c2f611cc4565b9050610c3b8382611ce7565b9392505050565b6000546001600160a01b03163314610c6c5760405162461bcd60e51b8152600401610a629061309d565b6001600160a01b03811660009081526005602052604090205460ff16610cd45760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a62565b60005b600854811015610df457816001600160a01b031660088281548110610cfe57610cfe613125565b6000918252602090912001546001600160a01b031603610de25760088054610d289060019061313b565b81548110610d3857610d38613125565b600091825260209091200154600880546001600160a01b039092169183908110610d6457610d64613125565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556008805480610dbc57610dbc613152565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610dec81613168565b915050610cd7565b5050565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610a2e918590610baf9086611cf3565b6000546001600160a01b03163314610e585760405162461bcd60e51b8152600401610a629061309d565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b6000600b54831115610ed05760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a62565b81610ef1576000610ee084611cff565b50959750610a329650505050505050565b6000610efc84611cff565b50949750610a329650505050505050565b6000546001600160a01b03163314610f375760405162461bcd60e51b8152600401610a629061309d565b6001600160a01b03811660009081526005602052604090205460ff1615610fa05760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a62565b6001600160a01b03811660009081526001602052604090205415610ffa576001600160a01b038116600090815260016020526040902054610fe090610bbe565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6000546001600160a01b0316331461108a5760405162461bcd60e51b8152600401610a629061309d565b600081116110ca5760405162461bcd60e51b815260206004820152600d60248201526c56616c756520746f6f206c6f7760981b6044820152606401610a62565b601d55565b6000546001600160a01b031633146110f95760405162461bcd60e51b8152600401610a629061309d565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b031633146111445760405162461bcd60e51b8152600401610a629061309d565b6127108111156111665760405162461bcd60e51b8152600401610a62906130d2565b602155565b6001600160a01b03811660009081526005602052604081205460ff16156111a857506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610a3290610bbe565b6000546001600160a01b031633146111f45760405162461bcd60e51b8152600401610a629061309d565b6111fe6000611dde565b565b6060600f805461099e90613063565b6000546001600160a01b031633146112395760405162461bcd60e51b8152600401610a629061309d565b60006112443061116b565b306000908152600160205260409020549091506112619082611e2e565b3060009081526001602081905260408220929092556112ae91839161128e6000546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000205490611cf3565b600160006112c46000546001600160a01b031690565b6001600160a01b03168152602080820192909252604090810160009081209390935530835260029091529020546112fb9082611e2e565b30600090815260026020819052604082209290925561132891839161128e6000546001600160a01b031690565b6002600061133e6000546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000205561136a6000546001600160a01b031690565b6001600160a01b0316306001600160a01b03166000805160206132a78339815191528360405161139c91815260200190565b60405180910390a350565b6000546001600160a01b031633146113d15760405162461bcd60e51b8152600401610a629061309d565b476113e46000546001600160a01b031690565b6001600160a01b03166108fc60646113fc8585613181565b61140691906131a0565b6040518115909202916000818181858888f1935050505015801561142e573d6000803e3d6000fd5b505050565b6000546001600160a01b0316331461145d5760405162461bcd60e51b8152600401610a629061309d565b601e5461146c90610e1061310d565b421061147757600080fd5b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000610a2e3384610baf856040518060600160405280602581526020016132c7602591393360009081526003602090815260408083206001600160a01b038d1684529091529020549190611c98565b6000610a2e3384846119e8565b6000546001600160a01b031633146115215760405162461bcd60e51b8152600401610a629061309d565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461156d5760405162461bcd60e51b8152600401610a629061309d565b601c8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906115ba90831515815260200190565b60405180910390a150565b6000546001600160a01b031633146115ef5760405162461bcd60e51b8152600401610a629061309d565b6601c6bf526340008110156116465760405162461bcd60e51b815260206004820152601a60248201527f4d61782077616c6c65742073697a6520697320746f6f206c6f770000000000006044820152606401610a62565b602355565b6000546001600160a01b031633146116755760405162461bcd60e51b8152600401610a629061309d565b601c805460ff60a81b191690556000196022819055602355600060158190556017819055601381905560218190556019556116bb6104fd6000546001600160a01b031690565b6111fe6105946000546001600160a01b031690565b6000546001600160a01b031633146116fa5760405162461bcd60e51b8152600401610a629061309d565b66038d7ea4c680008110156117515760405162461bcd60e51b815260206004820152601a60248201527f4d61782077616c6c65742073697a6520697320746f6f206c6f770000000000006044820152606401610a62565b602255565b6000546001600160a01b031633146117805760405162461bcd60e51b8152600401610a629061309d565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6000546001600160a01b031633146117cb5760405162461bcd60e51b8152600401610a629061309d565b6001600160a01b0381166118305760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a62565b61183981611dde565b50565b6000546001600160a01b031633146118665760405162461bcd60e51b8152600401610a629061309d565b60205460ff16156118ac5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481b185d5b98da195960821b6044820152606401610a62565b6020805460ff1916600117905542601e819055601f55565b6001600160a01b0383166119265760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a62565b6001600160a01b0382166119875760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a62565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611a4c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a62565b6001600160a01b038216611aae5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a62565b60008111611b105760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a62565b6001600160a01b03831660009081526006602052604090205460ff161515600114801590611b5c57506001600160a01b03821660009081526006602052604090205460ff161515600114155b611ba15760405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc81a5cc8189b1858dadb1a5cdd195960521b6044820152606401610a62565b6000611bac3061116b565b6025805460ff19169055601c549091506001600160a01b0390811690841603611bdd576025805460ff191660011790555b601d54601c5490821015906001600160a01b03868116911614801590611c005750805b8015611c165750601c54600160a01b900460ff16155b8015611c2b5750601c54600160a81b900460ff165b15611c3957611c3982611e3a565b6001600160a01b03851660009081526004602052604090205460019060ff1680611c7b57506001600160a01b03851660009081526004602052604090205460ff165b15611c84575060005b611c9086868684612053565b505050505050565b60008184841115611cbc5760405162461bcd60e51b8152600401610a629190612e8f565b505050900390565b6000806000611cd16121dc565b9092509050611ce08282611ce7565b9250505090565b6000610c3b82846131a0565b6000610c3b828461310d565b600080600080600080600080611d3d6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b611d468a61235e565b8560000186602001876040018860600189608001858152508581525085815250858152508581525050505050506000806000611d9d8d8560200151866040015187606001518860800151611d98611cc4565b6123da565b92509250925082828286600001518760200151886040015189606001518a608001519b509b509b509b509b509b509b509b5050505050919395975091939597565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610c3b828461313b565b601c805460ff60a01b1916600160a01b179055601354601954600091611e6b91611e65908590611ce7565b9061246a565b9050611e78816002611ce7565b90506000611e868383611e2e565b905047611e9282612476565b601354600090611ea3906002611ce7565b9050600081601154601754601554611ebb919061310d565b611ec5919061310d565b611ecf919061310d565b90506000611edd4785611e2e565b90506000611f0083611efa6019548561246a90919063ffffffff16565b90611ce7565b9050611f1b84611e6560195484611ce790919063ffffffff16565b90506000611f294783611e2e565b90506000611f44601354601954611e2e90919063ffffffff16565b90506000611f61601554611e658486611ce790919063ffffffff16565b6009546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015611f9c573d6000803e3d6000fd5b50601754600090611fb190611e658686611ce7565b600a546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015611fec573d6000803e3d6000fd5b50611ff78b866125c8565b604080518c8152602081018690529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601c805460ff60a01b1916905550505050505050505050565b806120605761206061269d565b6001600160a01b03841660009081526005602052604090205460ff1680156120a157506001600160a01b03831660009081526005602052604090205460ff16155b156120b6576120b1848484612702565b6121b4565b6001600160a01b03841660009081526005602052604090205460ff161580156120f757506001600160a01b03831660009081526005602052604090205460ff165b15612107576120b1848484612843565b6001600160a01b03841660009081526005602052604090205460ff1615801561214957506001600160a01b03831660009081526005602052604090205460ff16155b15612159576120b1848484612905565b6001600160a01b03841660009081526005602052604090205460ff16801561219957506001600160a01b03831660009081526005602052604090205460ff165b156121a9576120b1848484612cac565b6121b4848484612905565b80610b4f57610b4f601254601155601454601355601654601555601854601755601a54601955565b600c54600b546000918291825b60085481101561232e5782600160006008848154811061220b5761220b613125565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612276575081600260006008848154811061224f5761224f613125565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561228c57600c54600b54945094505050509091565b6122d260016000600884815481106122a6576122a6613125565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611e2e565b925061231a60026000600884815481106122ee576122ee613125565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611e2e565b91508061232681613168565b9150506121e9565b50600b54600c5461233e91611ce7565b82101561235557600c54600b549350935050509091565b90939092509050565b60008060008060008061237087612d38565b9050600061237d88612d55565b9050600061238a89612d72565b905060006123978a612dc6565b905060006123a58b86611e2e565b90506123b18185611e2e565b90506123c7826123c18386611e2e565b90611e2e565b9b949a5092985090965094509092505050565b60008080806123e98a8661246a565b905060006123f78a8761246a565b905060006124058a8861246a565b905060006124138a8961246a565b905060006124218a8a61246a565b9050600061242f8686611e2e565b905061243b8185611e2e565b90506124478184611e2e565b90506124538183611e2e565b959f959e50939c50939a5050505050505050505050565b6000610c3b8284613181565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106124ab576124ab613125565b6001600160a01b03928316602091820292909201810191909152601b54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612504573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252891906131c2565b8160018151811061253b5761253b613125565b6001600160a01b039283166020918202929092010152601b5461256191309116846118c4565b601b5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061259a9085906000908690309042906004016131df565b600060405180830381600087803b1580156125b457600080fd5b505af1158015611c90573d6000803e3d6000fd5b601b546125e09030906001600160a01b0316846118c4565b601b546001600160a01b031663f305d7198230856000806126096000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612671573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126969190613250565b5050505050565b6011541580156126ad5750601354155b80156126b95750601554155b80156126c55750601754155b156126cc57565b6011805460125560138054601455601580546016556017805460185560198054601a556000948590559284905583905582905555565b60008060008060008060008061271789611cff565b9750975097509750975097509750975061275f89600260008e6001600160a01b03166001600160a01b0316815260200190815260200160002054611e2e90919063ffffffff16565b6001600160a01b038c1660009081526002602090815260408083209390935560019052205461278e9089611e2e565b6001600160a01b03808d1660009081526001602052604080822093909355908c16815220546127bd9088611cf3565b6001600160a01b038b166000908152600160205260409020556127df83612de3565b6127e882612de3565b6127f181612de3565b6127fb8685612e6b565b896001600160a01b03168b6001600160a01b03166000805160206132a78339815191528760405161282e91815260200190565b60405180910390a35050505050505050505050565b60008060008060008060008061285889611cff565b975097509750975097509750975097506128a088600160008e6001600160a01b03166001600160a01b0316815260200190815260200160002054611e2e90919063ffffffff16565b6001600160a01b03808d16600090815260016020908152604080832094909455918d168152600290915220546128d69086611cf3565b6001600160a01b038b166000908152600260209081526040808320939093556001905220546127bd9088611cf3565b60008060008060008060008061291a89611cff565b9750975097509750975097509750975060235489106129895760405162461bcd60e51b815260206004820152602560248201527f416d6f756e74206973206c6172676572207468616e206d6178207472616e736160448201526431ba34b7b760d91b6064820152608401610a62565b60205460ff1615156001148015906129af5750601c546001600160a01b038b8116911614155b80156129c957506000546001600160a01b038c8116911614155b80156129e357506000546001600160a01b038b8116911614155b15612a92576001600160a01b038b16600090815260016020526040902054612a0b9089611e2e565b6001600160a01b03808d1660009081526001602052604080822093909355908c1681522054612a3a9088611cf3565b6001600160a01b03808c1660008181526001602052604090819020939093559151908d16906000805160206132a783398151915290612a7c9089815260200190565b60405180910390a3612a8d8a611477565b612c9f565b60205460ff1615156001148015612ac4575042602454601e5461012c612ab8919061310d565b612ac2919061310d565b115b8015612ade5750601c546001600160a01b038b8116911614155b8015612af857506000546001600160a01b038c8116911614155b8015612b1257506000546001600160a01b038b8116911614155b15612b3a576001600160a01b038b16600090815260016020526040902054612a0b9089611e2e565b6000546001600160a01b038c811691161480612b6357506000546001600160a01b038b81169116145b15612c03576001600160a01b038a16600090815260016020526040902054612b8b9089611cf3565b6001600160a01b03808c1660009081526001602052604080822093909355908d1681522054612bba9089611e2e565b6001600160a01b038c81166000818152600160209081526040918290209490945551888152918d169290916000805160206132a7833981519152910160405180910390a3612c9f565b601c546001600160a01b038b8116911614612c7c57602254612c2e8a612c288d61116b565b90611cf3565b1115612c7c5760405162461bcd60e51b815260206004820181905260248201527f5472616e736665722065786365656473206d61782077616c6c65742073697a656044820152606401610a62565b6001600160a01b038b1660009081526001602052604090205461278e9089611e2e565b5050505050505050505050565b600080600080600080600080612cc189611cff565b97509750975097509750975097509750612d0989600260008e6001600160a01b03166001600160a01b0316815260200190815260200160002054611e2e90919063ffffffff16565b6001600160a01b038c166000908152600260209081526040808320939093556001905220546128a09089611e2e565b6000610a32612710611efa6011548561246a90919063ffffffff16565b6000610a32612710611efa6013548561246a90919063ffffffff16565b60255460009060ff161515600103612dab57610a32612710611efa612da4602154601554611cf390919063ffffffff16565b859061246a565b610a32612710611efa6015548561246a90919063ffffffff16565b6000610a32612710611efa6017548561246a90919063ffffffff16565b6000612ded611cc4565b90506000612dfb838361246a565b30600090815260016020526040902054909150612e189082611cf3565b3060009081526001602090815260408083209390935560059052205460ff161561142e5730600090815260026020526040902054612e569084611cf3565b30600090815260026020526040902055505050565b600c54612e789083611e2e565b600c55600d54612e889082611cf3565b600d555050565b600060208083528351808285015260005b81811015612ebc57858101830151858201604001528201612ea0565b81811115612ece576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461183957600080fd5b60008060408385031215612f0c57600080fd5b8235612f1781612ee4565b946020939093013593505050565b60008060008060808587031215612f3b57600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215612f6c57600080fd5b8335612f7781612ee4565b92506020840135612f8781612ee4565b929592945050506040919091013590565b600060208284031215612faa57600080fd5b5035919050565b600060208284031215612fc357600080fd5b8135610c3b81612ee4565b80358015158114612fde57600080fd5b919050565b60008060408385031215612ff657600080fd5b8235915061300660208401612fce565b90509250929050565b60006020828403121561302157600080fd5b610c3b82612fce565b6000806040838503121561303d57600080fd5b823561304881612ee4565b9150602083013561305881612ee4565b809150509250929050565b600181811c9082168061307757607f821691505b60208210810361309757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600b908201526a496e76616c69642062707360a81b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115613120576131206130f7565b500190565b634e487b7160e01b600052603260045260246000fd5b60008282101561314d5761314d6130f7565b500390565b634e487b7160e01b600052603160045260246000fd5b60006001820161317a5761317a6130f7565b5060010190565b600081600019048311821515161561319b5761319b6130f7565b500290565b6000826131bd57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156131d457600080fd5b8151610c3b81612ee4565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561322f5784516001600160a01b03168352938301939183019160010161320a565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561326557600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e0b8c29967b5e5cbf2dc12d62c30a48f2434262bbf2001a35159223afd12043864736f6c634300080d0033

Deployed ByteCode Sourcemap

27150:30278:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27705:40;;;;;;;;;;-1:-1:-1;27705:40:0;;;;-1:-1:-1;;;;;27705:40:0;;;;;;-1:-1:-1;;;;;194:32:1;;;176:51;;164:2;149:18;27705:40:0;;;;;;;;31234:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32219:193::-;;;;;;;;;;-1:-1:-1;32219:193:0;;;;;:::i;:::-;;:::i;:::-;;;1461:14:1;;1454:22;1436:41;;1424:2;1409:18;32219:193:0;1296:187:1;35062:87:0;;;;;;;;;;-1:-1:-1;35131:10:0;;35062:87;;;1634:25:1;;;1622:2;1607:18;35062:87:0;1488:177:1;37957:949:0;;;;;;;;;;-1:-1:-1;37957:949:0;;;;;:::i;:::-;;:::i;:::-;;28502:41;;;;;;;;;;-1:-1:-1;28502:41:0;;;;-1:-1:-1;;;;;28502:41:0;;;31511:95;;;;;;;;;;-1:-1:-1;31591:7:0;;31511:95;;32420:446;;;;;;;;;;-1:-1:-1;32420:446:0;;;;;:::i;:::-;;:::i;35653:322::-;;;;;;;;;;-1:-1:-1;35653:322:0;;;;;:::i;:::-;;:::i;31420:83::-;;;;;;;;;;-1:-1:-1;31486:9:0;;31420:83;;31486:9;;;;3083:36:1;;3071:2;3056:18;31420:83:0;2941:184:1;28208:29:0;;;;;;;;;;;;;;;;36323:477;;;;;;;;;;-1:-1:-1;36323:477:0;;;;;:::i;:::-;;:::i;32874:300::-;;;;;;;;;;-1:-1:-1;32874:300:0;;;;;:::i;:::-;;:::i;28032:22::-;;;;;;;;;;;;;;;;37720:111;;;;;;;;;;-1:-1:-1;37720:111:0;;;;;:::i;:::-;;:::i;35157:488::-;;;;;;;;;;-1:-1:-1;35157:488:0;;;;;:::i;:::-;;:::i;28550:28::-;;;;;;;;;;-1:-1:-1;28550:28:0;;;;-1:-1:-1;;;;;28550:28:0;;;28615:33;;;;;;;;;;-1:-1:-1;28615:33:0;;;;-1:-1:-1;;;28615:33:0;;;;;;28897:25;;;;;;;;;;;;;;;;35983:332;;;;;;;;;;-1:-1:-1;35983:332:0;;;;;:::i;:::-;;:::i;46260:124::-;;;;;;;;;;-1:-1:-1;46260:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;46349:27:0;46325:4;46349:27;;;:18;:27;;;;;;;;;46260:124;39095:161;;;;;;;;;;-1:-1:-1;39095:161:0;;;;;:::i;:::-;;:::i;27752:41::-;;;;;;;;;;-1:-1:-1;27752:41:0;;;;-1:-1:-1;;;;;27752:41:0;;;34486:106;;;;;;;;;;-1:-1:-1;34486:106:0;;;;;:::i;:::-;;:::i;33982:198::-;;;;;;;;;;-1:-1:-1;33982:198:0;;;;;:::i;:::-;;:::i;28111:28::-;;;;;;;;;;;;;;;;31614:198;;;;;;;;;;-1:-1:-1;31614:198:0;;;;;:::i;:::-;;:::i;5192:94::-;;;;;;;;;;;;;:::i;34188:120::-;;;;;;;;;;-1:-1:-1;34188:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;34280:20:0;34256:4;34280:20;;;:11;:20;;;;;;;;;34188:120;4541:87;;;;;;;;;;-1:-1:-1;4587:7:0;4614:6;-1:-1:-1;;;;;4614:6:0;4541:87;;28861:29;;;;;;;;;;;;;;;;31325:87;;;;;;;;;;;;;:::i;48652:458::-;;;;;;;;;;;;;:::i;48448:196::-;;;;;;;;;;-1:-1:-1;48448:196:0;;;;;:::i;:::-;;:::i;34316:162::-;;;;;;;;;;-1:-1:-1;34316:162:0;;;;;:::i;:::-;;:::i;28788:23::-;;;;;;;;;;-1:-1:-1;28788:23:0;;;;;;;;33182:400;;;;;;;;;;-1:-1:-1;33182:400:0;;;;;:::i;:::-;;:::i;31820:199::-;;;;;;;;;;-1:-1:-1;31820:199:0;;;;;:::i;:::-;;:::i;33823:151::-;;;;;;;;;;-1:-1:-1;33823:151:0;;;;;:::i;:::-;;:::i;28820:32::-;;;;;;;;;;;;;;;;38914:173;;;;;;;;;;-1:-1:-1;38914:173:0;;;;;:::i;:::-;;:::i;39452:171::-;;;;;;;;;;-1:-1:-1;39452:171:0;;;;;:::i;:::-;;:::i;28411:26::-;;;;;;;;;;;;;;;;28657:44;;;;;;;;;;;;;;;;28308:30;;;;;;;;;;;;;;;;32027:184;;;;;;;;;;-1:-1:-1;32027:184:0;;;;;:::i;:::-;-1:-1:-1;;;;;32176:18:0;;;32144:7;32176:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;32027:184;57074:351;;;;;;;;;;;;;:::i;39264:179::-;;;;;;;;;;-1:-1:-1;39264:179:0;;;;;:::i;:::-;;:::i;37839:110::-;;;;;;;;;;-1:-1:-1;37839:110:0;;;;;:::i;:::-;;:::i;5441:192::-;;;;;;;;;;-1:-1:-1;5441:192:0;;;;;:::i;:::-;;:::i;34832:222::-;;;;;;;;;;;;;:::i;34600:120::-;;;;;;;;;;-1:-1:-1;34600:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;34687:25:0;34663:4;34687:25;;;:16;:25;;;;;;;;;34600:120;31234:83;31271:13;31304:5;31297:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31234:83;:::o;32219:193::-;32321:4;32343:39;3497:10;32366:7;32375:6;32343:8;:39::i;:::-;-1:-1:-1;32400:4:0;32219:193;;;;;:::o;37957:949::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;;;;;;;;;38146:5:::1;38133:9;:18;;38107:60;;;;-1:-1:-1::0;;;38107:60:0::1;;;;;;;:::i;:::-;38243:5;38224:15;:24;;38178:109;;;;-1:-1:-1::0;;;38178:109:0::1;;;;;;;:::i;:::-;38365:5;38345:16;:25;;38298:111;;;;-1:-1:-1::0;;;38298:111:0::1;;;;;;;:::i;:::-;38491:5;38470:17;:26;;38422:113;;;;-1:-1:-1::0;;;38422:113:0::1;;;;;;;:::i;:::-;38548:7;:19:::0;;;38578:13:::1;:31:::0;;;38620:14:::1;:33:::0;;;38664:15:::1;:35:::0;;;38682:17;38558:9;38726:30:::1;38637:16:::0;38594:15;38726:30:::1;:::i;:::-;:40;;;;:::i;:::-;:58;;;;:::i;:::-;38712:11;:72:::0;38854:5:::1;38839:11;;:20;;38797:101;;;;-1:-1:-1::0;;;38797:101:0::1;;;;;;;:::i;:::-;37957:949:::0;;;;:::o;32420:446::-;32552:4;32569:36;32579:6;32587:9;32598:6;32569:9;:36::i;:::-;32616:220;32639:6;3497:10;32687:138;32743:6;32687:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32687:19:0;;;;;;:11;:19;;;;;;;;3497:10;32687:33;;;;;;;;;;:37;:138::i;:::-;32616:8;:220::i;:::-;-1:-1:-1;32854:4:0;32420:446;;;;;:::o;35653:322::-;35747:7;35805;;35794;:18;;35772:110;;;;-1:-1:-1;;;35772:110:0;;6399:2:1;35772:110:0;;;6381:21:1;6438:2;6418:18;;;6411:30;6477:34;6457:18;;;6450:62;-1:-1:-1;;;6528:18:1;;;6521:40;6578:19;;35772:110:0;6197:406:1;35772:110:0;35893:19;35915:10;:8;:10::i;:::-;35893:32;-1:-1:-1;35943:24:0;:7;35893:32;35943:11;:24::i;:::-;35936:31;35653:322;-1:-1:-1;;;35653:322:0:o;36323:477::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36403:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;36395:60;;;::::0;-1:-1:-1;;;36395:60:0;;6810:2:1;36395:60:0::1;::::0;::::1;6792:21:1::0;6849:2;6829:18;;;6822:30;6888:29;6868:18;;;6861:57;6935:18;;36395:60:0::1;6608:351:1::0;36395:60:0::1;36471:9;36466:327;36490:9;:16:::0;36486:20;::::1;36466:327;;;36548:7;-1:-1:-1::0;;;;;36532:23:0::1;:9;36542:1;36532:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;36532:12:0::1;:23:::0;36528:254:::1;;36591:9;36601:16:::0;;:20:::1;::::0;36620:1:::1;::::0;36601:20:::1;:::i;:::-;36591:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;36576:9:::1;:12:::0;;-1:-1:-1;;;;;36591:31:0;;::::1;::::0;36586:1;;36576:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;36576:46:0::1;-1:-1:-1::0;;;;;36576:46:0;;::::1;;::::0;;36641:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;36680:11:::1;:20:::0;;;;:28;;-1:-1:-1;;36680:28:0::1;::::0;;36727:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;36727:15:0;;;;;-1:-1:-1;;;;;;36727:15:0::1;::::0;;;;;36466:327:::1;36323:477:::0;:::o;36528:254::-:1;36508:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36466:327;;;;36323:477:::0;:::o;32874:300::-;3497:10;32989:4;33083:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;33083:34:0;;;;;;;;;;32989:4;;33011:133;;33061:7;;33083:50;;33122:10;33083:38;:50::i;37720:111::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37789:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;37789:34:0::1;37819:4;37789:34;::::0;;37720:111::o;35157:488::-;35275:7;35319;;35308;:18;;35300:62;;;;-1:-1:-1;;;35300:62:0;;7700:2:1;35300:62:0;;;7682:21:1;7739:2;7719:18;;;7712:30;7778:33;7758:18;;;7751:61;7829:18;;35300:62:0;7498:355:1;35300:62:0;35378:17;35373:265;;35413:15;35447:19;35458:7;35447:10;:19::i;:::-;-1:-1:-1;35412:54:0;;-1:-1:-1;35481:14:0;;-1:-1:-1;;;;;;;35481:14:0;35373:265;35531:23;35570:19;35581:7;35570:10;:19::i;:::-;-1:-1:-1;35528:61:0;;-1:-1:-1;35604:22:0;;-1:-1:-1;;;;;;;35604:22:0;35983:332;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36064:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;36063:21;36055:61;;;::::0;-1:-1:-1;;;36055:61:0;;6810:2:1;36055:61:0::1;::::0;::::1;6792:21:1::0;6849:2;6829:18;;;6822:30;6888:29;6868:18;;;6861:57;6935:18;;36055:61:0::1;6608:351:1::0;36055:61:0::1;-1:-1:-1::0;;;;;36131:16:0;::::1;36150:1;36131:16:::0;;;:7:::1;:16;::::0;;;;;:20;36127:109:::1;;-1:-1:-1::0;;;;;36207:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;36187:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;36168:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;36127:109:::1;-1:-1:-1::0;;;;;36246:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;36246:27:0::1;36269:4;36246:27:::0;;::::1;::::0;;;36284:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;36284:23:0::1;::::0;;::::1;::::0;;35983:332::o;39095:161::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;39178:1:::1;39171:6;:8;39163:34;;;::::0;-1:-1:-1;;;39163:34:0;;8060:2:1;39163:34:0::1;::::0;::::1;8042:21:1::0;8099:2;8079:18;;;8072:30;-1:-1:-1;;;8118:18:1;;;8111:43;8171:18;;39163:34:0::1;7858:337:1::0;39163:34:0::1;39208:29;:38:::0;39095:161::o;34486:106::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34556:22:0::1;34579:5;34556:22:::0;;;:16:::1;:22;::::0;;;;:28;;-1:-1:-1;;34556:28:0::1;::::0;;34486:106::o;33982:198::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;34095:5:::1;34088:3;:12;;34054:85;;;;-1:-1:-1::0;;;34054:85:0::1;;;;;;;:::i;:::-;34151:13;:19:::0;33982:198::o;31614:::-;-1:-1:-1;;;;;31704:20:0;;31680:7;31704:20;;;:11;:20;;;;;;;;31700:49;;;-1:-1:-1;;;;;;31733:16:0;;;;;:7;:16;;;;;;;31614:198::o;31700:49::-;-1:-1:-1;;;;;31787:16:0;;;;;;:7;:16;;;;;;31767:37;;:19;:37::i;5192:94::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;5257:21:::1;5275:1;5257:9;:21::i;:::-;5192:94::o:0;31325:87::-;31364:13;31397:7;31390:14;;;;;:::i;48652:458::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;48715:19:::1;48737:24;48755:4;48737:9;:24::i;:::-;48813:4;48797:22;::::0;;;:7:::1;:22;::::0;;;;;48715:46;;-1:-1:-1;48797:39:0::1;::::0;48715:46;48797:26:::1;:39::i;:::-;48788:4;48772:22;::::0;;;:7:::1;:22;::::0;;;;;;:64;;;;48866:33:::1;::::0;48887:11;;48874:7:::1;4587::::0;4614:6;-1:-1:-1;;;;;4614:6:0;;4541:87;48874:7:::1;-1:-1:-1::0;;;;;48866:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;48866:16:0;;;:20:::1;:33::i;:::-;48847:7;:16;48855:7;4587::::0;4614:6;-1:-1:-1;;;;;4614:6:0;;4541:87;48855:7:::1;-1:-1:-1::0;;;;;48847:16:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;48847:16:0;;;:52;;;;48951:4:::1;48935:22:::0;;:7:::1;:22:::0;;;;;;:39:::1;::::0;48962:11;48935:26:::1;:39::i;:::-;48926:4;48910:22;::::0;;;:7:::1;:22;::::0;;;;;;:64;;;;49004:33:::1;::::0;49025:11;;49012:7:::1;4587::::0;4614:6;-1:-1:-1;;;;;4614:6:0;;4541:87;49004:33:::1;48985:7;:16;48993:7;4587::::0;4614:6;-1:-1:-1;;;;;4614:6:0;;4541:87;48993:7:::1;-1:-1:-1::0;;;;;48985:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;48985:16:0;:52;49077:7:::1;4587::::0;4614:6;-1:-1:-1;;;;;4614:6:0;;4541:87;49077:7:::1;-1:-1:-1::0;;;;;49053:47:0::1;49070:4;-1:-1:-1::0;;;;;49053:47:0::1;-1:-1:-1::0;;;;;;;;;;;49087:11:0::1;49053:47;;;;1634:25:1::0;;1622:2;1607:18;;1488:177;49053:47:0::1;;;;;;;;48694:416;48652:458::o:0;48448:196::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;48543:21:::1;48583:7;4587::::0;4614:6;-1:-1:-1;;;;;4614:6:0;;4541:87;48583:7:::1;-1:-1:-1::0;;;;;48575:25:0::1;:61;48632:3;48601:28;48613:16:::0;48601:9;:28:::1;:::i;:::-;:34;;;;:::i;:::-;48575:61;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;48512:132;48448:196:::0;:::o;34316:162::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;34408:11:::1;::::0;:21:::1;::::0;34422:7:::1;34408:21;:::i;:::-;34390:15;:39;34382:48;;;::::0;::::1;;-1:-1:-1::0;;;;;34441:22:0::1;;::::0;;;:16:::1;:22;::::0;;;;:27;;-1:-1:-1;;34441:27:0::1;34464:4;34441:27;::::0;;34316:162::o;33182:400::-;33302:4;33324:228;3497:10;33374:7;33396:145;33453:15;33396:145;;;;;;;;;;;;;;;;;3497:10;33396:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;33396:34:0;;;;;;;;;;;;:38;:145::i;31820:199::-;31925:4;31947:42;3497:10;31971:9;31982:6;31947:9;:42::i;33823:151::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;33926:17:::1;:40:::0;;-1:-1:-1;;;;;;33926:40:0::1;-1:-1:-1::0;;;;;33926:40:0;;;::::1;::::0;;;::::1;::::0;;33823:151::o;38914:173::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;38993:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;38993:32:0::1;-1:-1:-1::0;;;;38993:32:0;;::::1;;::::0;;39041:38:::1;::::0;::::1;::::0;::::1;::::0;39017:8;1461:14:1;1454:22;1436:41;;1424:2;1409:18;;1296:187;39041:38:0::1;;;;;;;;38914:173:::0;:::o;39452:171::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;39537:15:::1;39529:6;:23;;39521:62;;;::::0;-1:-1:-1;;;39521:62:0;;8797:2:1;39521:62:0::1;::::0;::::1;8779:21:1::0;8836:2;8816:18;;;8809:30;8875:28;8855:18;;;8848:56;8921:18;;39521:62:0::1;8595:350:1::0;39521:62:0::1;39594:10;:19:::0;39452:171::o;57074:351::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;57134:21:::1;:27:::0;;-1:-1:-1;;;;57134:27:0::1;::::0;;-1:-1:-1;;57172:14:0::1;:18:::0;;;57201:10:::1;:14:::0;57156:5:::1;57134:21;57226:16:::0;;;57253:15:::1;:17:::0;;;57281:13:::1;:15:::0;;;57307:13:::1;:15:::0;;;57333:11:::1;:13:::0;57357:23:::1;57372:7;4587::::0;4614:6;-1:-1:-1;;;;;4614:6:0;;4541:87;57357:23:::1;57391:26;57409:7;4587::::0;4614:6;-1:-1:-1;;;;;4614:6:0;;4541:87;39264:179;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;39352:16:::1;39344:6;:24;;39336:63;;;::::0;-1:-1:-1;;;39336:63:0;;8797:2:1;39336:63:0::1;::::0;::::1;8779:21:1::0;8836:2;8816:18;;;8809:30;8875:28;8855:18;;;8848:56;8921:18;;39336:63:0::1;8595:350:1::0;39336:63:0::1;39410:14;:23:::0;39264:179::o;37839:110::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37906:27:0::1;37936:5;37906:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;37906:35:0::1;::::0;;37839:110::o;5441:192::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5530:22:0;::::1;5522:73;;;::::0;-1:-1:-1;;;5522:73:0;;9152:2:1;5522:73:0::1;::::0;::::1;9134:21:1::0;9191:2;9171:18;;;9164:30;9230:34;9210:18;;;9203:62;-1:-1:-1;;;9281:18:1;;;9274:36;9327:19;;5522:73:0::1;8950:402:1::0;5522:73:0::1;5606:19;5616:8;5606:9;:19::i;:::-;5441:192:::0;:::o;34832:222::-;4587:7;4614:6;-1:-1:-1;;;;;4614:6:0;3497:10;4761:23;4753:68;;;;-1:-1:-1;;;4753:68:0;;;;;;;:::i;:::-;34888:11:::1;::::0;::::1;;:20;34879:50;;;::::0;-1:-1:-1;;;34879:50:0;;9559:2:1;34879:50:0::1;::::0;::::1;9541:21:1::0;9598:2;9578:18;;;9571:30;-1:-1:-1;;;9617:18:1;;;9610:46;9673:18;;34879:50:0::1;9357:340:1::0;34879:50:0::1;34940:11;:18:::0;;-1:-1:-1;;34940:18:0::1;34954:4;34940:18;::::0;;34983:15:::1;34969:11;:29:::0;;;35009:19:::1;:37:::0;34832:222::o;46392:371::-;-1:-1:-1;;;;;46519:19:0;;46511:68;;;;-1:-1:-1;;;46511:68:0;;9904:2:1;46511:68:0;;;9886:21:1;9943:2;9923:18;;;9916:30;9982:34;9962:18;;;9955:62;-1:-1:-1;;;10033:18:1;;;10026:34;10077:19;;46511:68:0;9702:400:1;46511:68:0;-1:-1:-1;;;;;46598:21:0;;46590:68;;;;-1:-1:-1;;;46590:68:0;;10309:2:1;46590:68:0;;;10291:21:1;10348:2;10328:18;;;10321:30;10387:34;10367:18;;;10360:62;-1:-1:-1;;;10438:18:1;;;10431:32;10480:19;;46590:68:0;10107:398:1;46590:68:0;-1:-1:-1;;;;;46671:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;46723:32;;1634:25:1;;;46723:32:0;;1607:18:1;46723:32:0;;;;;;;46392:371;;;:::o;46771:1669::-;-1:-1:-1;;;;;46893:18:0;;46885:68;;;;-1:-1:-1;;;46885:68:0;;10712:2:1;46885:68:0;;;10694:21:1;10751:2;10731:18;;;10724:30;10790:34;10770:18;;;10763:62;-1:-1:-1;;;10841:18:1;;;10834:35;10886:19;;46885:68:0;10510:401:1;46885:68:0;-1:-1:-1;;;;;46972:16:0;;46964:64;;;;-1:-1:-1;;;46964:64:0;;11118:2:1;46964:64:0;;;11100:21:1;11157:2;11137:18;;;11130:30;11196:34;11176:18;;;11169:62;-1:-1:-1;;;11247:18:1;;;11240:33;11290:19;;46964:64:0;10916:399:1;46964:64:0;47056:1;47047:6;:10;47039:64;;;;-1:-1:-1;;;47039:64:0;;11522:2:1;47039:64:0;;;11504:21:1;11561:2;11541:18;;;11534:30;11600:34;11580:18;;;11573:62;-1:-1:-1;;;11651:18:1;;;11644:39;11700:19;;47039:64:0;11320:405:1;47039:64:0;-1:-1:-1;;;;;47122:22:0;;;;;;:16;:22;;;;;;;;:28;;:22;:28;;;;:58;;-1:-1:-1;;;;;;47154:20:0;;;;;;:16;:20;;;;;;;;:26;;:20;:26;;47122:58;47114:93;;;;-1:-1:-1;;;47114:93:0;;11932:2:1;47114:93:0;;;11914:21:1;11971:2;11951:18;;;11944:30;-1:-1:-1;;;11990:18:1;;;11983:52;12052:18;;47114:93:0;11730:346:1;47114:93:0;47502:28;47533:24;47551:4;47533:9;:24::i;:::-;47568:4;:10;;-1:-1:-1;;47568:10:0;;;47599:13;;47502:55;;-1:-1:-1;;;;;;47599:13:0;;;47595:17;;;;47591:68;;47638:4;:9;;-1:-1:-1;;47638:9:0;47643:4;47638:9;;;47591:68;47735:29;;47801:13;;47698:66;;;;;-1:-1:-1;;;;;47793:21:0;;;47801:13;;47793:21;;;;:57;;;47831:19;47793:57;:91;;;;-1:-1:-1;47868:16:0;;-1:-1:-1;;;47868:16:0;;;;47867:17;47793:91;:129;;;;-1:-1:-1;47901:21:0;;-1:-1:-1;;;47901:21:0;;;;47793:129;47775:251;;;47978:36;47993:20;47978:14;:36::i;:::-;-1:-1:-1;;;;;48219:24:0;;48099:12;48219:24;;;:18;:24;;;;;;48114:4;;48219:24;;;:50;;-1:-1:-1;;;;;;48247:22:0;;;;;;:18;:22;;;;;;;;48219:50;48215:98;;;-1:-1:-1;48296:5:0;48215:98;48391:41;48406:4;48412:2;48416:6;48424:7;48391:14;:41::i;:::-;46874:1566;;;46771:1669;;;:::o;10801:240::-;10921:7;10982:12;10974:6;;;;10966:29;;;;-1:-1:-1;;;10966:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;11017:5:0;;;10801:240::o;42758:164::-;42800:7;42821:15;42838;42857:19;:17;:19::i;:::-;42820:56;;-1:-1:-1;42820:56:0;-1:-1:-1;42894:20:0;42820:56;;42894:11;:20::i;:::-;42887:27;;;;42758:164;:::o;9659:98::-;9717:7;9744:5;9748:1;9744;:5;:::i;8522:98::-;8580:7;8607:5;8611:1;8607;:5;:::i;40066:1032::-;40166:7;40188;40210;40232;40254;40276;40298;40320;40357:23;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40357:23:0;40562:20;40574:7;40562:11;:20::i;:::-;40411:4;:20;;40446:4;:9;;40470:4;:15;;40500:4;:16;;40531:4;:17;;40396:186;;;;;;;;;;;;;;;;;;;;;;;;;40594:15;40611:23;40636:12;40652:186;40678:7;40700:4;:9;;;40724:4;:15;;;40754:4;:16;;;40785:4;:17;;;40817:10;:8;:10::i;:::-;40652:11;:186::i;:::-;40593:245;;;;;;40871:7;40893:15;40923:4;40942;:20;;;40977:4;:9;;;41001:4;:15;;;41031:4;:16;;;41062:4;:17;;;40849:241;;;;;;;;;;;;;;;;;;;;40066:1032;;;;;;;;;:::o;5641:173::-;5697:16;5716:6;;-1:-1:-1;;;;;5733:17:0;;;-1:-1:-1;;;;;;5733:17:0;;;;;;5766:40;;5716:6;;;;;;;5766:40;;5697:16;5766:40;5686:128;5641:173;:::o;8903:98::-;8961:7;8988:5;8992:1;8988;:5;:::i;49118:1922::-;29289:16;:23;;-1:-1:-1;;;;29289:23:0;-1:-1:-1;;;29289:23:0;;;49328:13:::1;::::0;49311:11:::1;::::0;29289:23;;49286:56:::1;::::0;:37:::1;::::0;:20;;:24:::1;:37::i;:::-;:41:::0;::::1;:56::i;:::-;49254:88:::0;-1:-1:-1;49377:28:0::1;49254:88:::0;49403:1:::1;49377:25;:28::i;:::-;49353:52:::0;-1:-1:-1;49418:20:0::1;49441:47;:20:::0;49353:52;49441:24:::1;:47::i;:::-;49418:70:::0;-1:-1:-1;49791:21:0::1;49857:30;49418:70:::0;49857:16:::1;:30::i;:::-;49916:13;::::0;49901:12:::1;::::0;49916:20:::1;::::0;49934:1:::1;49916:17;:20::i;:::-;49901:35;;49947:15;50011:4;50001:7;;49982:15;;49965:14;;:32;;;;:::i;:::-;:43;;;;:::i;:::-;:50;;;;:::i;:::-;49947:68:::0;-1:-1:-1;50076:18:0::1;50097:41;:21;50123:14:::0;50097:25:::1;:41::i;:::-;50076:62;;50151:27;50181:40;50213:7;50181:27;50196:11;;50181:10;:14;;:27;;;;:::i;:::-;:31:::0;::::1;:40::i;:::-;50151:70;;50254:46;50295:4;50254:36;50278:11;;50254:19;:23;;:36;;;;:::i;:46::-;50232:68:::0;-1:-1:-1;50313:26:0::1;50342:46;:21;50232:68:::0;50342:25:::1;:46::i;:::-;50313:75;;50472:13;50488:30;50504:13;;50488:11;;:15;;:30;;;;:::i;:::-;50472:46;;50531:25;50559:49;50593:14;;50559:29;50582:5;50559:18;:22;;:29;;;;:::i;:49::-;50627:17;::::0;50619:54:::1;::::0;50531:77;;-1:-1:-1;;;;;;50627:17:0::1;::::0;50619:54;::::1;;;::::0;50531:77;;50627:17:::1;50619:54:::0;50627:17;50619:54;50531:77;50627:17;50619:54;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;50749:15:0::1;::::0;50686:26:::1;::::0;50715:50:::1;::::0;:29:::1;:18:::0;50738:5;50715:22:::1;:29::i;:50::-;50784:18;::::0;50776:56:::1;::::0;50686:79;;-1:-1:-1;;;;;;50784:18:0::1;::::0;50776:56;::::1;;;::::0;50686:79;;50784:18:::1;50776:56:::0;50784:18;50776:56;50686:79;50784:18;50776:56;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;50882;50895:21;50918:19;50882:12;:56::i;:::-;50954:78;::::0;;12283:25:1;;;12339:2;12324:18;;12317:34;;;12367:18;;;12360:34;;;50954:78:0::1;::::0;12271:2:1;12256:18;50954:78:0::1;;;;;;;-1:-1:-1::0;;29335:16:0;:24;;-1:-1:-1;;;;29335:24:0;;;-1:-1:-1;;;;;;;;;;49118:1922:0:o;52243:836::-;52399:7;52394:28;;52408:14;:12;:14::i;:::-;-1:-1:-1;;;;;52437:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;52461:22:0;;;;;;:11;:22;;;;;;;;52460:23;52437:46;52433:597;;;52500:48;52522:6;52530:9;52541:6;52500:21;:48::i;:::-;52433:597;;;-1:-1:-1;;;;;52571:19:0;;;;;;:11;:19;;;;;;;;52570:20;:46;;;;-1:-1:-1;;;;;;52594:22:0;;;;;;:11;:22;;;;;;;;52570:46;52566:464;;;52633:46;52653:6;52661:9;52672:6;52633:19;:46::i;52566:464::-;-1:-1:-1;;;;;52702:19:0;;;;;;:11;:19;;;;;;;;52701:20;:47;;;;-1:-1:-1;;;;;;52726:22:0;;;;;;:11;:22;;;;;;;;52725:23;52701:47;52697:333;;;52765:44;52783:6;52791:9;52802:6;52765:17;:44::i;52697:333::-;-1:-1:-1;;;;;52831:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;52854:22:0;;;;;;:11;:22;;;;;;;;52831:45;52827:203;;;52893:48;52915:6;52923:9;52934:6;52893:21;:48::i;52827:203::-;52974:44;52992:6;53000:9;53011:6;52974:17;:44::i;:::-;53047:7;53042:29;;53056:15;46035;;46025:7;:25;46077:21;;46061:13;:37;46126:22;;46109:14;:39;46177:23;;46159:15;:41;46225:19;;46211:11;:33;45981:271;42930:605;43028:7;;43064;;42981;;;;;43082:338;43106:9;:16;43102:20;;43082:338;;;43190:7;43166;:21;43174:9;43184:1;43174:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;43174:12:0;43166:21;;;;;;;;;;;;;:31;;:83;;;43242:7;43218;:21;43226:9;43236:1;43226:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;43226:12:0;43218:21;;;;;;;;;;;;;:31;43166:83;43144:146;;;43273:7;;43282;;43265:25;;;;;;;42930:605;;:::o;43144:146::-;43315:34;43327:7;:21;43335:9;43345:1;43335:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;43335:12:0;43327:21;;;;;;;;;;;;;43315:7;;:11;:34::i;:::-;43305:44;;43374:34;43386:7;:21;43394:9;43404:1;43394:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;43394:12:0;43386:21;;;;;;;;;;;;;43374:7;;:11;:34::i;:::-;43364:44;-1:-1:-1;43124:3:0;;;;:::i;:::-;;;;43082:338;;;-1:-1:-1;43456:7:0;;43444;;:20;;:11;:20::i;:::-;43434:7;:30;43430:61;;;43474:7;;43483;;43466:25;;;;;;42930:605;;:::o;43430:61::-;43510:7;;43519;;-1:-1:-1;42930:605:0;-1:-1:-1;42930:605:0:o;41106:752::-;41207:7;41229;41251;41273;41295;41330:12;41345:24;41361:7;41345:15;:24::i;:::-;41330:39;;41380:18;41401:30;41423:7;41401:21;:30::i;:::-;41380:51;;41442:22;41467:31;41490:7;41467:22;:31::i;:::-;41442:56;;41509:23;41535:32;41559:7;41535:23;:32::i;:::-;41509:58;-1:-1:-1;41578:23:0;41604:17;:7;41616:4;41604:11;:17::i;:::-;41578:43;-1:-1:-1;41648:31:0;41578:43;41668:10;41648:19;:31::i;:::-;41632:47;-1:-1:-1;41706:56:0;41746:15;41706:35;41632:47;41726:14;41706:19;:35::i;:::-;:39;;:56::i;:::-;41690:72;41800:4;;-1:-1:-1;41806:10:0;;-1:-1:-1;41818:14:0;;-1:-1:-1;41806:10:0;-1:-1:-1;41106:752:0;;-1:-1:-1;;;41106:752:0:o;41866:884::-;42126:7;;;;42223:24;:7;42235:11;42223;:24::i;:::-;42205:42;-1:-1:-1;42258:12:0;42273:21;:4;42282:11;42273:8;:21::i;:::-;42258:36;-1:-1:-1;42305:18:0;42326:27;:10;42341:11;42326:14;:27::i;:::-;42305:48;-1:-1:-1;42364:19:0;42386:28;:11;42402;42386:15;:28::i;:::-;42364:50;-1:-1:-1;42425:12:0;42440:29;:12;42457:11;42440:16;:29::i;:::-;42425:44;-1:-1:-1;42480:23:0;42506:17;:7;42518:4;42506:11;:17::i;:::-;42480:43;-1:-1:-1;42550:31:0;42480:43;42570:10;42550:19;:31::i;:::-;42534:47;-1:-1:-1;42608:32:0;42534:47;42628:11;42608:19;:32::i;:::-;42592:48;-1:-1:-1;42667:25:0;42592:48;42687:4;42667:19;:25::i;:::-;42711:7;;;;-1:-1:-1;42737:4:0;;-1:-1:-1;41866:884:0;;-1:-1:-1;;;;;;;;;;;41866:884:0:o;9260:98::-;9318:7;9345:5;9349:1;9345;:5;:::i;51048:589::-;51198:16;;;51212:1;51198:16;;;;;;;;51174:21;;51198:16;;;;;;;;;;-1:-1:-1;51198:16:0;51174:40;;51243:4;51225;51230:1;51225:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51225:23:0;;;:7;;;;;;;;;;:23;;;;51269:15;;:22;;;-1:-1:-1;;;51269:22:0;;;;:15;;;;;:20;;:22;;;;;51225:7;;51269:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51259:4;51264:1;51259:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51259:32:0;;;:7;;;;;;;;;:32;51336:15;;51304:62;;51321:4;;51336:15;51354:11;51304:8;:62::i;:::-;51405:15;;:224;;-1:-1:-1;;;51405:224:0;;-1:-1:-1;;;;;51405:15:0;;;;:66;;:224;;51486:11;;51405:15;;51556:4;;51583;;51603:15;;51405:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51649:513;51829:15;;51797:62;;51814:4;;-1:-1:-1;;;;;51829:15:0;51847:11;51797:8;:62::i;:::-;51902:15;;-1:-1:-1;;;;;51902:15:0;:31;51941:9;51974:4;51994:11;51902:15;;52106:7;4587;4614:6;-1:-1:-1;;;;;4614:6:0;;4541:87;52106:7;51902:252;;;;;;-1:-1:-1;;;;;;51902:252:0;;;-1:-1:-1;;;;;14137:15:1;;;51902:252:0;;;14119:34:1;14169:18;;;14162:34;;;;14212:18;;;14205:34;;;;14255:18;;;14248:34;14319:15;;;14298:19;;;14291:44;52128:15:0;14351:19:1;;;14344:35;14053:19;;51902:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;51649:513;;:::o;45458:515::-;45505:7;;:12;:34;;;;-1:-1:-1;45521:13:0;;:18;45505:34;:57;;;;-1:-1:-1;45543:14:0;;:19;45505:57;:81;;;;-1:-1:-1;45566:15:0;;:20;45505:81;45501:94;;;45458:515::o;45501:94::-;45625:7;;;45607:15;:25;45667:13;;;45643:21;:37;45716:14;;;45691:22;:39;45767:15;;;45741:23;:41;45815:11;;;45793:19;:33;-1:-1:-1;45839:11:0;;;;45861:17;;;;45889:19;;;45919:18;;;45948:15;45458:515::o;56233:833::-;56384:15;56414:23;56452:12;56479:23;56517:12;56544:18;56577:19;56611:20;56645:19;56656:7;56645:10;:19::i;:::-;56369:295;;;;;;;;;;;;;;;;56693:28;56713:7;56693;:15;56701:6;-1:-1:-1;;;;;56693:15:0;-1:-1:-1;;;;;56693:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;56675:15:0;;;;;;:7;:15;;;;;;;;:46;;;;56750:7;:15;;;;:28;;56770:7;56750:19;:28::i;:::-;-1:-1:-1;;;;;56732:15:0;;;;;;;:7;:15;;;;;;:46;;;;56810:18;;;;;;;:39;;56833:15;56810:22;:39::i;:::-;-1:-1:-1;;;;;56789:18:0;;;;;;:7;:18;;;;;:60;56860:26;56875:10;56860:14;:26::i;:::-;56897:31;56916:11;56897:18;:31::i;:::-;56939:25;56951:12;56939:11;:25::i;:::-;56975:23;56987:4;56993;56975:11;:23::i;:::-;57031:9;-1:-1:-1;;;;;57014:44:0;57023:6;-1:-1:-1;;;;;57014:44:0;-1:-1:-1;;;;;;;;;;;57042:15:0;57014:44;;;;1634:25:1;;1622:2;1607:18;;1488:177;57014:44:0;;;;;;;;56358:708;;;;;;;;56233:833;;;:::o;55380:845::-;55529:15;55559:23;55597:12;55624:23;55662:12;55689:18;55722:19;55756:20;55790:19;55801:7;55790:10;:19::i;:::-;55514:295;;;;;;;;;;;;;;;;55838:28;55858:7;55838;:15;55846:6;-1:-1:-1;;;;;55838:15:0;-1:-1:-1;;;;;55838:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;55820:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;55898:18;;;;;:7;:18;;;;;:39;;55921:15;55898:22;:39::i;:::-;-1:-1:-1;;;;;55877:18:0;;;;;;:7;:18;;;;;;;;:60;;;;55969:7;:18;;;;:39;;55992:15;55969:22;:39::i;53087:2285::-;53234:15;53264:23;53302:12;53329:23;53367:12;53394:18;53427:19;53461:20;53495:19;53506:7;53495:10;:19::i;:::-;53219:295;;;;;;;;;;;;;;;;53549:10;;53540:7;:19;53531:70;;;;-1:-1:-1;;;53531:70:0;;14903:2:1;53531:70:0;;;14885:21:1;14942:2;14922:18;;;14915:30;14981:34;14961:18;;;14954:62;-1:-1:-1;;;15032:18:1;;;15025:35;15077:19;;53531:70:0;14701:401:1;53531:70:0;53616:11;;;;:18;;:11;:18;;;;:47;;-1:-1:-1;53650:13:0;;-1:-1:-1;;;;;53638:25:0;;;53650:13;;53638:25;;53616:47;:66;;;;-1:-1:-1;4587:7:0;4614:6;-1:-1:-1;;;;;53667:15:0;;;4614:6;;53667:15;;53616:66;:88;;;;-1:-1:-1;4587:7:0;4614:6;-1:-1:-1;;;;;53686:18:0;;;4614:6;;53686:18;;53616:88;53612:1721;;;-1:-1:-1;;;;;53749:15:0;;;;;;:7;:15;;;;;;:28;;53769:7;53749:19;:28::i;:::-;-1:-1:-1;;;;;53731:15:0;;;;;;;:7;:15;;;;;;:46;;;;53813:18;;;;;;;:39;;53836:15;53813:22;:39::i;:::-;-1:-1:-1;;;;;53792:18:0;;;;;;;:7;:18;;;;;;;:60;;;;53872:44;;;;;;-1:-1:-1;;;;;;;;;;;53872:44:0;;;53900:15;1634:25:1;;1622:2;1607:18;;1488:177;53872:44:0;;;;;;;;53951:24;53965:9;53951:13;:24::i;:::-;53612:1721;;;54008:11;;;;:17;;:11;:17;:72;;;;;54065:15;54055:7;;54029:11;;54043:9;54029:23;;;;:::i;:::-;:33;;;;:::i;:::-;:51;54008:72;:101;;;;-1:-1:-1;54096:13:0;;-1:-1:-1;;;;;54084:25:0;;;54096:13;;54084:25;;54008:101;:120;;;;-1:-1:-1;4587:7:0;4614:6;-1:-1:-1;;;;;54113:15:0;;;4614:6;;54113:15;;54008:120;:142;;;;-1:-1:-1;4587:7:0;4614:6;-1:-1:-1;;;;;54132:18:0;;;4614:6;;54132:18;;54008:142;54004:1329;;;-1:-1:-1;;;;;54195:15:0;;;;;;:7;:15;;;;;;:28;;54215:7;54195:19;:28::i;54004:1329::-;4587:7;4614:6;-1:-1:-1;;;;;54451:15:0;;;4614:6;;54451:15;;:37;;-1:-1:-1;4587:7:0;4614:6;-1:-1:-1;;;;;54470:18:0;;;4614:6;;54470:18;54451:37;54447:886;;;-1:-1:-1;;;;;54536:18:0;;;;;;:7;:18;;;;;;:31;;54559:7;54536:22;:31::i;:::-;-1:-1:-1;;;;;54515:18:0;;;;;;;:7;:18;;;;;;:52;;;;54600:15;;;;;;;:28;;54620:7;54600:19;:28::i;:::-;-1:-1:-1;;;;;54582:15:0;;;;;;;:7;:15;;;;;;;;;:46;;;;54653:44;1634:25:1;;;54653:44:0;;;;54582:15;;-1:-1:-1;;;;;;;;;;;54653:44:0;1607:18:1;54653:44:0;;;;;;;54447:886;;;54791:13;;-1:-1:-1;;;;;54778:26:0;;;54791:13;;54778:26;54774:179;;54885:14;;54847:33;54872:7;54847:20;54857:9;54847;:20::i;:::-;:24;;:33::i;:::-;54846:53;;54838:99;;;;-1:-1:-1;;;54838:99:0;;15309:2:1;54838:99:0;;;15291:21:1;;;15328:18;;;15321:30;15387:34;15367:18;;;15360:62;15439:18;;54838:99:0;15107:356:1;54838:99:0;-1:-1:-1;;;;;54987:15:0;;;;;;:7;:15;;;;;;:28;;55007:7;54987:19;:28::i;54447:886::-;53208:2164;;;;;;;;53087:2285;;;:::o;36808:904::-;36959:15;36989:23;37027:12;37054:23;37092:12;37119:18;37152:19;37186:20;37220:19;37231:7;37220:10;:19::i;:::-;36944:295;;;;;;;;;;;;;;;;37268:28;37288:7;37268;:15;37276:6;-1:-1:-1;;;;;37268:15:0;-1:-1:-1;;;;;37268:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;37250:15:0;;;;;;:7;:15;;;;;;;;:46;;;;37325:7;:15;;;;:28;;37345:7;37325:19;:28::i;44632:130::-;44696:7;44723:31;44748:5;44723:20;44735:7;;44723;:11;;:20;;;;:::i;44770:174::-;44867:7;44899:37;44930:5;44899:26;44911:13;;44899:7;:11;;:26;;;;:::i;44952:309::-;45078:4;;45050:7;;45078:4;;:10;;:4;:10;45075:120;;45124:59;45177:5;45124:48;45137:33;45156:13;;45137:14;;:18;;:33;;;;:::i;:::-;45124:7;;:11;:48::i;45075:120::-;45215:38;45247:5;45215:27;45227:14;;45215:7;:11;;:27;;;;:::i;45270:178::-;45369:7;45401:39;45434:5;45401:28;45413:15;;45401:7;:11;;:28;;;;:::i;43543:355::-;43606:19;43628:10;:8;:10::i;:::-;43606:32;-1:-1:-1;43649:18:0;43670:27;:10;43606:32;43670:14;:27::i;:::-;43749:4;43733:22;;;;:7;:22;;;;;;43649:48;;-1:-1:-1;43733:38:0;;43649:48;43733:26;:38::i;:::-;43724:4;43708:22;;;;:7;:22;;;;;;;;:63;;;;43786:11;:26;;;;;;43782:108;;;43868:4;43852:22;;;;:7;:22;;;;;;:38;;43879:10;43852:26;:38::i;:::-;43843:4;43827:22;;;;:7;:22;;;;;:63;43595:303;;43543:355;:::o;39724:147::-;39802:7;;:17;;39814:4;39802:11;:17::i;:::-;39792:7;:27;39843:10;;:20;;39858:4;39843:14;:20::i;:::-;39830:10;:33;-1:-1:-1;;39724:147:0:o;238:597:1:-;350:4;379:2;408;397:9;390:21;440:6;434:13;483:6;478:2;467:9;463:18;456:34;508:1;518:140;532:6;529:1;526:13;518:140;;;627:14;;;623:23;;617:30;593:17;;;612:2;589:26;582:66;547:10;;518:140;;;676:6;673:1;670:13;667:91;;;746:1;741:2;732:6;721:9;717:22;713:31;706:42;667:91;-1:-1:-1;819:2:1;798:15;-1:-1:-1;;794:29:1;779:45;;;;826:2;775:54;;238:597;-1:-1:-1;;;238:597:1:o;840:131::-;-1:-1:-1;;;;;915:31:1;;905:42;;895:70;;961:1;958;951:12;976:315;1044:6;1052;1105:2;1093:9;1084:7;1080:23;1076:32;1073:52;;;1121:1;1118;1111:12;1073:52;1160:9;1147:23;1179:31;1204:5;1179:31;:::i;:::-;1229:5;1281:2;1266:18;;;;1253:32;;-1:-1:-1;;;976:315:1:o;1670:385::-;1756:6;1764;1772;1780;1833:3;1821:9;1812:7;1808:23;1804:33;1801:53;;;1850:1;1847;1840:12;1801:53;-1:-1:-1;;1873:23:1;;;1943:2;1928:18;;1915:32;;-1:-1:-1;1994:2:1;1979:18;;1966:32;;2045:2;2030:18;2017:32;;-1:-1:-1;1670:385:1;-1:-1:-1;1670:385:1:o;2295:456::-;2372:6;2380;2388;2441:2;2429:9;2420:7;2416:23;2412:32;2409:52;;;2457:1;2454;2447:12;2409:52;2496:9;2483:23;2515:31;2540:5;2515:31;:::i;:::-;2565:5;-1:-1:-1;2622:2:1;2607:18;;2594:32;2635:33;2594:32;2635:33;:::i;:::-;2295:456;;2687:7;;-1:-1:-1;;;2741:2:1;2726:18;;;;2713:32;;2295:456::o;2756:180::-;2815:6;2868:2;2856:9;2847:7;2843:23;2839:32;2836:52;;;2884:1;2881;2874:12;2836:52;-1:-1:-1;2907:23:1;;2756:180;-1:-1:-1;2756:180:1:o;3130:247::-;3189:6;3242:2;3230:9;3221:7;3217:23;3213:32;3210:52;;;3258:1;3255;3248:12;3210:52;3297:9;3284:23;3316:31;3341:5;3316:31;:::i;3382:160::-;3447:20;;3503:13;;3496:21;3486:32;;3476:60;;3532:1;3529;3522:12;3476:60;3382:160;;;:::o;3547:248::-;3612:6;3620;3673:2;3661:9;3652:7;3648:23;3644:32;3641:52;;;3689:1;3686;3679:12;3641:52;3725:9;3712:23;3702:33;;3754:35;3785:2;3774:9;3770:18;3754:35;:::i;:::-;3744:45;;3547:248;;;;;:::o;4268:180::-;4324:6;4377:2;4365:9;4356:7;4352:23;4348:32;4345:52;;;4393:1;4390;4383:12;4345:52;4416:26;4432:9;4416:26;:::i;4453:388::-;4521:6;4529;4582:2;4570:9;4561:7;4557:23;4553:32;4550:52;;;4598:1;4595;4588:12;4550:52;4637:9;4624:23;4656:31;4681:5;4656:31;:::i;:::-;4706:5;-1:-1:-1;4763:2:1;4748:18;;4735:32;4776:33;4735:32;4776:33;:::i;:::-;4828:7;4818:17;;;4453:388;;;;;:::o;4846:380::-;4925:1;4921:12;;;;4968;;;4989:61;;5043:4;5035:6;5031:17;5021:27;;4989:61;5096:2;5088:6;5085:14;5065:18;5062:38;5059:161;;5142:10;5137:3;5133:20;5130:1;5123:31;5177:4;5174:1;5167:15;5205:4;5202:1;5195:15;5059:161;;4846:380;;;:::o;5231:356::-;5433:2;5415:21;;;5452:18;;;5445:30;5511:34;5506:2;5491:18;;5484:62;5578:2;5563:18;;5231:356::o;5592:335::-;5794:2;5776:21;;;5833:2;5813:18;;;5806:30;-1:-1:-1;;;5867:2:1;5852:18;;5845:41;5918:2;5903:18;;5592:335::o;5932:127::-;5993:10;5988:3;5984:20;5981:1;5974:31;6024:4;6021:1;6014:15;6048:4;6045:1;6038:15;6064:128;6104:3;6135:1;6131:6;6128:1;6125:13;6122:39;;;6141:18;;:::i;:::-;-1:-1:-1;6177:9:1;;6064:128::o;6964:127::-;7025:10;7020:3;7016:20;7013:1;7006:31;7056:4;7053:1;7046:15;7080:4;7077:1;7070:15;7096:125;7136:4;7164:1;7161;7158:8;7155:34;;;7169:18;;:::i;:::-;-1:-1:-1;7206:9:1;;7096:125::o;7226:127::-;7287:10;7282:3;7278:20;7275:1;7268:31;7318:4;7315:1;7308:15;7342:4;7339:1;7332:15;7358:135;7397:3;7418:17;;;7415:43;;7438:18;;:::i;:::-;-1:-1:-1;7485:1:1;7474:13;;7358:135::o;8200:168::-;8240:7;8306:1;8302;8298:6;8294:14;8291:1;8288:21;8283:1;8276:9;8269:17;8265:45;8262:71;;;8313:18;;:::i;:::-;-1:-1:-1;8353:9:1;;8200:168::o;8373:217::-;8413:1;8439;8429:132;;8483:10;8478:3;8474:20;8471:1;8464:31;8518:4;8515:1;8508:15;8546:4;8543:1;8536:15;8429:132;-1:-1:-1;8575:9:1;;8373:217::o;12537:251::-;12607:6;12660:2;12648:9;12639:7;12635:23;12631:32;12628:52;;;12676:1;12673;12666:12;12628:52;12708:9;12702:16;12727:31;12752:5;12727:31;:::i;12793:980::-;13055:4;13103:3;13092:9;13088:19;13134:6;13123:9;13116:25;13160:2;13198:6;13193:2;13182:9;13178:18;13171:34;13241:3;13236:2;13225:9;13221:18;13214:31;13265:6;13300;13294:13;13331:6;13323;13316:22;13369:3;13358:9;13354:19;13347:26;;13408:2;13400:6;13396:15;13382:29;;13429:1;13439:195;13453:6;13450:1;13447:13;13439:195;;;13518:13;;-1:-1:-1;;;;;13514:39:1;13502:52;;13609:15;;;;13574:12;;;;13550:1;13468:9;13439:195;;;-1:-1:-1;;;;;;;13690:32:1;;;;13685:2;13670:18;;13663:60;-1:-1:-1;;;13754:3:1;13739:19;13732:35;13651:3;12793:980;-1:-1:-1;;;12793:980:1:o;14390:306::-;14478:6;14486;14494;14547:2;14535:9;14526:7;14522:23;14518:32;14515:52;;;14563:1;14560;14553:12;14515:52;14592:9;14586:16;14576:26;;14642:2;14631:9;14627:18;14621:25;14611:35;;14686:2;14675:9;14671:18;14665:25;14655:35;;14390:306;;;;;:::o

Swarm Source

ipfs://e0b8c29967b5e5cbf2dc12d62c30a48f2434262bbf2001a35159223afd120438
Loading