ETH Price: $3,094.05 (+0.21%)

Token

Trump Capital (TRC)
 

Overview

Max Total Supply

1,000,000,000,000 TRC

Holders

41

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0 TRC

Value
$0.00
0x65d10ece318f33c05865d09be52385afda49d331
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
TrumpCapital

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-29
*/

/**
 * Twitter: https://twitter.com/crypto_trumps
 * Website: https://trumpcapital.great
 */


//SPDX-License-Identifier: Unlicensed
pragma solidity >=0.7.0 <0.9.0;
abstract contract Context {
    function _msgSender() internal view returns (address payable) {
        return payable(msg.sender);
    }

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

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// 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 generally not needed starting with Solidity 0.8, since 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 subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

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

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

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

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

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

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

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

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

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

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

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

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

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

contract TrumpCapital is ERC20 {
    using Address for address;

    mapping(address => uint256) cooldown;
    mapping(address => bool) isCooldownExempt;
    mapping(address => bool) isFeeExempt;
    mapping(address => bool) isMaxWalletExempt;
    mapping(address => bool) lpHolder;
    mapping(address => bool) lpPairs;

    address public owner;
    address public autoLiquidityReceiver;
    address public treasuryFeeReceiver;
    address public pair;

    uint256 _totalSupply = 1_000_000_000_000 * (10**9); // total supply amount
    uint256 totalFee;
    uint256 feeAmount;
    uint256 burnedTokens;
    uint feeDenominator = 1000;
    bool tradingOpen;
    struct IFees {
        uint16 liquidityFee;
        uint16 treasuryFee;
        uint16 totalFee;
    }
    struct ICooldown {
        bool buycooldownEnabled;
        bool sellcooldownEnabled;
        uint8 cooldownLimit;
        uint8 cooldownTime;
    }
    struct ITransactionSettings {
        uint256 maxTxAmount;
        uint256 maxWalletAmount;
        bool txLimits;
    }     
    struct ILiquiditySettings {
        uint256 liquidityFeeAccumulator;
        uint256 treasuryFees;
        uint256 numTokensToSwap;
        uint256 lastSwap;
        uint8 swapInterval;
        bool swapEnabled;
        bool inSwap;
        bool feesEnabled;
        bool autoLiquifyEnabled;
    } 
    ICooldown public cooldownInfo;
    IFees public BuyFees;
    IFees public MaxFees;
    IFees public SellFees;
    IFees public TransferFees;
    ILiquiditySettings public LiquiditySettings;
    ITransactionSettings TransactionSettings;
    IUniswapV2Router02 public router;
    modifier onlyOwner() {
        require(isOwner(msg.sender), "You are not the owner");
        _;
    }
    modifier swapping() {
        LiquiditySettings.inSwap = true;
        _;
        LiquiditySettings.inSwap = false;
    }

    constructor() ERC20("Trump Capital", "TRC") {
        owner = _msgSender();
        setFeeReceivers(0x656bCe13255a889712e15eA0Edcda0703483f3F1, 0xE457a2ec073052A2D4755705D1CBdAa3A8b74A7a);
        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IUniswapV2Factory(router.factory()).createPair(router.WETH(), address(this));
        lpHolder[_msgSender()] = true;
        lpPairs[pair] = true;

        _approve(address(this), address(router), type(uint256).max);
        _approve(_msgSender(), address(router), type(uint256).max);

        isMaxWalletExempt[_msgSender()] = true;
        isMaxWalletExempt[address(this)] = true;
        isMaxWalletExempt[pair] = true;

        isFeeExempt[address(this)] = true;
        isFeeExempt[_msgSender()] = true;

        isCooldownExempt[_msgSender()] = true;
        isCooldownExempt[pair] = true;
        isCooldownExempt[address(this)] = true;
        isCooldownExempt[address(router)] = true;

        cooldownInfo.buycooldownEnabled = true;
        cooldownInfo.sellcooldownEnabled = true;
        cooldownInfo.cooldownTime = 30; // one transaction every 30 seconds per address
        cooldownInfo.cooldownLimit = 60; // cooldown cannot go over 60 seconds

        TransactionSettings.txLimits = true; // limits in effect

        TransactionSettings.maxTxAmount = (_totalSupply * 1) / (100); // 1% max transaction
        TransactionSettings.maxWalletAmount = (_totalSupply * 2) / 100; // 2% max wallet

        BuyFees = IFees({
            liquidityFee: 0,
            treasuryFee: 4,
            totalFee: 4 // 1%
        });
        SellFees = IFees({
            liquidityFee: 0,
            treasuryFee: 20,
            totalFee: 20 // 1%
        });    
        MaxFees.totalFee = 100; // 20% roundtrip

        LiquiditySettings.swapEnabled = true;
        LiquiditySettings.autoLiquifyEnabled = true;
        LiquiditySettings.swapInterval = 5;
        LiquiditySettings.numTokensToSwap = (_totalSupply * (10)) / (10000);
        LiquiditySettings.feesEnabled = true;

        _mint(_msgSender(), _totalSupply);
    }
    
    receive() external payable {}

    // =============================================================
    //                      OWNERSHIP OPERATIONS
    // =============================================================   
    function renounceOwnership(bool keepLimits) public onlyOwner {
        emit OwnershipRenounced();
        setExemptionsWallets(owner, false, false, false, false);
        limitsInEffect(keepLimits);
        owner = address(0);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address, use renounceOwnership Function");
        emit OwnershipTransferred(owner, newOwner);

        if(balanceOf(owner) > 0) _basicTransfer(owner, newOwner, balanceOf(owner));
        setExemptionsWallets(owner, false, false, false, false);
        setExemptionsWallets(newOwner, true, true, true, false);

        owner = newOwner;
    }

    // =============================================================
    //                      ADMIN OPERATIONS
    // =============================================================  

    function clearStuckBalance(uint256 amountPercentage) external onlyOwner {
        require(amountPercentage <= 100);
        uint256 amountEth = address(this).balance;
        payable(treasuryFeeReceiver).transfer(
            (amountEth * amountPercentage) / 100
        );
        LiquiditySettings.treasuryFees += amountEth * amountPercentage;
    }

    function clearStuckTokens(address _token, address _to) external onlyOwner returns (bool _sent) {
        require(_token != address(0) && _token != address(this));
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
    }

    function setWalletLimits(uint256 percent, uint256 divisor, bool txOrWallet) external onlyOwner() {
        if(txOrWallet){
            require(percent >= 1 && divisor <= 1000, "Max Transaction must be set above .1%");
            TransactionSettings.maxTxAmount = (_totalSupply * percent) / (divisor);
            emit TxLimitUpdated(TransactionSettings.maxTxAmount);
        } else {
            require(percent >= 1 && divisor <= 100, "Max Wallet must be set above 1%");
            TransactionSettings.maxWalletAmount = (_totalSupply * percent) / divisor;
            emit WalletLimitUpdated(TransactionSettings.maxWalletAmount);
        }
    }

    function setExemptionsWallets(address holder, bool lpHolders, bool feeExempt, bool maxWalletExempt, bool CooldownExempt) public onlyOwner(){
        isMaxWalletExempt[holder] = maxWalletExempt;
        isCooldownExempt[holder] = CooldownExempt;
        isFeeExempt[holder] = feeExempt;
        lpHolder[holder] = lpHolders;
    }

    function limitsInEffect(bool limit) public onlyOwner() {
        TransactionSettings.txLimits = limit;
        emit LimitsLifted(limit);
    }

    function setPair(address pairing, bool lpPair) external onlyOwner {
        lpPairs[pairing] = lpPair;
    }

    function setCooldownEnabled(bool buy, bool sell, uint8 _cooldown) external onlyOwner() {
        require(_cooldown <= cooldownInfo.cooldownLimit, "Cooldown time must be below cooldown limit");
        cooldownInfo.cooldownTime = _cooldown;
        cooldownInfo.buycooldownEnabled = buy;
        cooldownInfo.sellcooldownEnabled = sell;
    }

    function launch() internal {
        tradingOpen = true;
        emit Launched();
    }

    function setBuyFees(uint16 _liquidityFee, uint16 _treasuryFee) external onlyOwner {
        require(_liquidityFee + _treasuryFee <= MaxFees.totalFee);
        BuyFees = IFees({
            liquidityFee: _liquidityFee,
            treasuryFee: _treasuryFee,
            totalFee: _liquidityFee + _treasuryFee
        });
    }
    
    function setTransferFees(uint16 _liquidityFee, uint16 _treasuryFee) external onlyOwner {
        require(_liquidityFee + _treasuryFee <= MaxFees.totalFee);
        TransferFees = IFees({
            liquidityFee: _liquidityFee,
            treasuryFee: _treasuryFee,
            totalFee: _liquidityFee + _treasuryFee
        });
    }

    function setSellFees(uint16 _liquidityFee, uint16 _treasuryFee) external onlyOwner {
        require(_liquidityFee + _treasuryFee <= MaxFees.totalFee);
        SellFees = IFees({
            liquidityFee: _liquidityFee,
            treasuryFee: _treasuryFee,
            totalFee: _liquidityFee + _treasuryFee
        });
    } 

    function setMaxFees(uint16 _totalFee) external onlyOwner {
        require(_totalFee <= MaxFees.totalFee);
        MaxFees.totalFee = _totalFee;
    }

    function setFeesEnabled(bool enabled) public onlyOwner {
        LiquiditySettings.feesEnabled = enabled;
    }

    function setFeeReceivers(address _autoLiquidityReceiver, address _treasuryFeeReceiver) public onlyOwner {
        autoLiquidityReceiver = _autoLiquidityReceiver;
        treasuryFeeReceiver = _treasuryFeeReceiver;
    }

    function setSwapBackSettings(bool _enabled, bool enabled, uint8 interval, uint256 _amount) public onlyOwner{
        LiquiditySettings.swapEnabled = _enabled;
        LiquiditySettings.swapInterval = interval;
        LiquiditySettings.autoLiquifyEnabled = enabled;
        LiquiditySettings.numTokensToSwap = (_totalSupply * (_amount)) / (10000);
    }
    // =============================================================
    //                      INTERNAL OPERATIONS
    // ============================================================= 

    function limits(address from, address to) private view returns (bool) {
        return !isOwner(from)
            && !isOwner(to)
            && tx.origin != owner
            && !lpHolder[from]
            && !lpHolder[to]
            && to != address(0xdead)
            && from != address(this);
    }

    function _transfer(address from, address to, uint256 amount ) internal override {
        if(!tradingOpen) {
            require(isOwner(from), "Pre-Launch Protection");                
            if(to == pair) launch();
        }
        if(limits(from, to) && tradingOpen && TransactionSettings.txLimits){
            if(!isMaxWalletExempt[to]){
                require(amount <= TransactionSettings.maxTxAmount && balanceOf(to) + amount <= TransactionSettings.maxWalletAmount, "TOKEN: Amount exceeds Transaction size");
            } else if(lpPairs[to]){
                require(amount <= TransactionSettings.maxTxAmount, "TOKEN: Amount exceeds Transaction size");
            }
            if (lpPairs[from] && !isCooldownExempt[to] && cooldownInfo.buycooldownEnabled) {
                require(cooldown[to] < block.timestamp, "Recipient must wait until cooldown is over");
                cooldown[to] = block.timestamp + (cooldownInfo.cooldownTime);
            } else if (!isCooldownExempt[from] && cooldownInfo.sellcooldownEnabled){
                require(cooldown[from] <= block.timestamp, "Sender must wait until cooldown is over");
                cooldown[from] = block.timestamp + (cooldownInfo.cooldownTime);
            } 
        }
        if (shouldSwapBack()) {
            swapBack();
        }

        uint256 amountReceived = shouldTakeFee(from) ? takeFee(from, to, amount) : amount;
        _basicTransfer(from, to, amountReceived);
    }

    function _basicTransfer(address from, address to, uint256 amount) internal {
        super._transfer(from, to, amount);
    }

    function shouldTakeFee(address sender) internal view returns (bool) {
        return LiquiditySettings.feesEnabled && !isFeeExempt[sender];
    }

    function takeFee(address sender, address receiver, uint256 amount) internal returns (uint256) {
        if (isFeeExempt[receiver]) {
            return amount;
        }
        if(lpPairs[receiver]) {            
            totalFee = SellFees.totalFee;         
        } else if(lpPairs[sender]){
            totalFee = BuyFees.totalFee;
        } else {
            totalFee = TransferFees.totalFee;
        }

        feeAmount = (amount * totalFee) / feeDenominator;
        if (LiquiditySettings.autoLiquifyEnabled) {
            LiquiditySettings.liquidityFeeAccumulator += (feeAmount * (BuyFees.liquidityFee + SellFees.liquidityFee)) / ((BuyFees.totalFee + SellFees.totalFee) + (BuyFees.liquidityFee + SellFees.liquidityFee));
        }
        _basicTransfer(sender, address(this), feeAmount); 
        return amount - feeAmount;
    }

    function shouldSwapBack() internal view returns (bool) {
        return
            !lpPairs[_msgSender()] &&
            !LiquiditySettings.inSwap &&
            LiquiditySettings.swapEnabled &&
            block.timestamp >= LiquiditySettings.lastSwap + LiquiditySettings.swapInterval &&
            _balances[address(this)] >= LiquiditySettings.numTokensToSwap;
    }
 
    function swapBack() internal swapping {
        LiquiditySettings.lastSwap = block.timestamp;
        if (LiquiditySettings.liquidityFeeAccumulator >= LiquiditySettings.numTokensToSwap && LiquiditySettings.autoLiquifyEnabled) {
            LiquiditySettings.liquidityFeeAccumulator -= LiquiditySettings.numTokensToSwap;
            uint256 amountToLiquify = LiquiditySettings.numTokensToSwap / 2;

            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = router.WETH();

            uint256 balanceBefore = address(this).balance;

            router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                amountToLiquify,
                0,
                path,
                address(this),
                block.timestamp
            );

            uint256 amountEth = address(this).balance - (balanceBefore);

            router.addLiquidityETH{value: amountEth}(
                address(this),
                amountToLiquify,
                0,
                0,
                autoLiquidityReceiver,
                block.timestamp
            );

        } else {
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = router.WETH();

            router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                LiquiditySettings.numTokensToSwap,
                0,
                path,
                address(this),
                block.timestamp
            );
            uint256 balance = address(this).balance;

            (bool treasury, ) = payable(treasuryFeeReceiver).call{ value: balance, gas: 30000}("");
            if(treasury) LiquiditySettings.treasuryFees += balance;

        }
    }

    // =============================================================
    //                      PUBLIC OPERATIONS
    // ============================================================= 

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

    function getTransactionAmounts() external view returns(uint maxTransaction, uint maxWallet, bool transactionLimits){
        if(TransactionSettings.txLimits){
            maxTransaction = TransactionSettings.maxTxAmount / 10**9;
            maxWallet = TransactionSettings.maxWalletAmount / 10**9;
            transactionLimits = TransactionSettings.txLimits;
        } else {
            maxTransaction = totalSupply();
            maxWallet = totalSupply();
            transactionLimits = false;
        }
    }

    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    function amountBurned() external view returns(uint256 amount) {
        amount = burnedTokens;
    }

    function burn(uint256 amount) external {
        _burn(_msgSender(), amount);
        burnedTokens = _totalSupply - totalSupply();
    }

    function airDropTokens(address[] memory addresses, uint256[] memory amounts) external {
        require(addresses.length == amounts.length, "Lengths do not match.");
        for (uint8 i = 0; i < addresses.length; i++) {
            require(balanceOf(_msgSender()) >= amounts[i]);
            _basicTransfer(_msgSender(), addresses[i], amounts[i]*10**9);
        }
    }

    event Launched();
    event WalletLimitUpdated(uint256 amount);
    event TxLimitUpdated(uint256 amount);
    event LimitsLifted(bool limits);
    event OwnershipRenounced();
    event OwnershipTransferred(address oldOwner, address newOwner);
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"Launched","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"limits","type":"bool"}],"name":"LimitsLifted","type":"event"},{"anonymous":false,"inputs":[],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TxLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WalletLimitUpdated","type":"event"},{"inputs":[],"name":"BuyFees","outputs":[{"internalType":"uint16","name":"liquidityFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"totalFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LiquiditySettings","outputs":[{"internalType":"uint256","name":"liquidityFeeAccumulator","type":"uint256"},{"internalType":"uint256","name":"treasuryFees","type":"uint256"},{"internalType":"uint256","name":"numTokensToSwap","type":"uint256"},{"internalType":"uint256","name":"lastSwap","type":"uint256"},{"internalType":"uint8","name":"swapInterval","type":"uint8"},{"internalType":"bool","name":"swapEnabled","type":"bool"},{"internalType":"bool","name":"inSwap","type":"bool"},{"internalType":"bool","name":"feesEnabled","type":"bool"},{"internalType":"bool","name":"autoLiquifyEnabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxFees","outputs":[{"internalType":"uint16","name":"liquidityFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"totalFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellFees","outputs":[{"internalType":"uint16","name":"liquidityFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"totalFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TransferFees","outputs":[{"internalType":"uint16","name":"liquidityFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"totalFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airDropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountBurned","outputs":[{"internalType":"uint256","name":"amount","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":[],"name":"autoLiquidityReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountPercentage","type":"uint256"}],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"clearStuckTokens","outputs":[{"internalType":"bool","name":"_sent","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldownInfo","outputs":[{"internalType":"bool","name":"buycooldownEnabled","type":"bool"},{"internalType":"bool","name":"sellcooldownEnabled","type":"bool"},{"internalType":"uint8","name":"cooldownLimit","type":"uint8"},{"internalType":"uint8","name":"cooldownTime","type":"uint8"}],"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":"getTransactionAmounts","outputs":[{"internalType":"uint256","name":"maxTransaction","type":"uint256"},{"internalType":"uint256","name":"maxWallet","type":"uint256"},{"internalType":"bool","name":"transactionLimits","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"limit","type":"bool"}],"name":"limitsInEffect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"keepLimits","type":"bool"}],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidityFee","type":"uint16"},{"internalType":"uint16","name":"_treasuryFee","type":"uint16"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"bool","name":"sell","type":"bool"},{"internalType":"uint8","name":"_cooldown","type":"uint8"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"lpHolders","type":"bool"},{"internalType":"bool","name":"feeExempt","type":"bool"},{"internalType":"bool","name":"maxWalletExempt","type":"bool"},{"internalType":"bool","name":"CooldownExempt","type":"bool"}],"name":"setExemptionsWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_autoLiquidityReceiver","type":"address"},{"internalType":"address","name":"_treasuryFeeReceiver","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_totalFee","type":"uint16"}],"name":"setMaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairing","type":"address"},{"internalType":"bool","name":"lpPair","type":"bool"}],"name":"setPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidityFee","type":"uint16"},{"internalType":"uint16","name":"_treasuryFee","type":"uint16"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint8","name":"interval","type":"uint8"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidityFee","type":"uint16"},{"internalType":"uint16","name":"_treasuryFee","type":"uint16"}],"name":"setTransferFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"},{"internalType":"bool","name":"txOrWallet","type":"bool"}],"name":"setWalletLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052683635c9adc5dea00000600f556103e86013553480156200002457600080fd5b506040518060400160405280600d81526020016c151c9d5b5c0810d85c1a5d185b609a1b8152506040518060400160405280600381526020016254524360e81b815250816003908162000078919062000820565b50600462000087828262000820565b50620000939150503390565b600b80546001600160a01b0319166001600160a01b0392909216919091179055620000e773656bce13255a889712e15ea0edcda0703483f3f173e457a2ec073052a2d4755705d1cbdaa3a8b74a7a620004fe565b602280546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200014c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001729190620008ec565b6001600160a01b031663c9c65396602260009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001fa9190620008ec565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af115801562000247573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026d9190620008ec565b600e80546001600160a01b0319166001600160a01b03929092169190911790556001600960006200029b3390565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600e5482168152600a90935291208054909216600117909155602254620002f6913091166000196200058c565b62000310336022546001600160a01b03166000196200058c565b336000818152600860209081526040808320805460ff199081166001908117909255308086528386208054831684179055600e80546001600160a01b039081168852858820805485168617905582885260078752858820805485168617905597875284872080548416851790556006909552838620805483168417905593548616855282852080548216831790559284528184208054841682179055602254909416835290912080548216831790556015805463ffffffff1916631e3c01011790556021805490911682179055600f54606491620003ef919062000934565b620003fb919062000956565b601f55600f546064906200041190600262000934565b6200041d919062000956565b6020908155604080516060808201835260008083526004838601819052928401929092526016805465ffffffffffff199081166404000400001790915583519182018452918152601493810184905290910191909152601880549091166414001400001790556017805461ffff60201b1916646400000000179055601e805464ff0000ffff1916640100000105179055600f5461271090620004c190600a62000934565b620004cd919062000956565b601c55601e805463ff00000019166301000000179055620004f8620004ef3390565b600f54620006b4565b62000995565b600b546001600160a01b031633146200055e5760405162461bcd60e51b815260206004820152601560248201527f596f7520617265206e6f7420746865206f776e6572000000000000000000000060448201526064015b60405180910390fd5b600c80546001600160a01b039384166001600160a01b031991821617909155600d8054929093169116179055565b6001600160a01b038316620005f05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000555565b6001600160a01b038216620006535760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000555565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0382166200070c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000555565b806002600082825462000720919062000979565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620007a757607f821691505b602082108103620007c857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200077757600081815260208120601f850160051c81016020861015620007f75750805b601f850160051c820191505b81811015620008185782815560010162000803565b505050505050565b81516001600160401b038111156200083c576200083c6200077c565b62000854816200084d845462000792565b84620007ce565b602080601f8311600181146200088c5760008415620008735750858301515b600019600386901b1c1916600185901b17855562000818565b600085815260208120601f198616915b82811015620008bd578886015182559484019460019091019084016200089c565b5085821015620008dc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620008ff57600080fd5b81516001600160a01b03811681146200091757600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156200095157620009516200091e565b500290565b6000826200097457634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200098f576200098f6200091e565b92915050565b612f6280620009a56000396000f3fe60806040526004361061026a5760003560e01c806386a22eff11610144578063b2c57fff116100b6578063dc7703671161007a578063dc77036714610895578063dd62ed3e146108c5578063f2421d2c146108e5578063f2fde38b14610915578063f887ea4014610935578063ff787dc61461095557600080fd5b8063b2c57fff14610776578063b7b69ec514610815578063c40fedc614610835578063ca33e64c14610855578063ccd721311461087557600080fd5b80639ab005f9116101085780639ab005f9146106b6578063a457c2d7146106d6578063a4b45c00146106f6578063a8aa1b3114610716578063a901dd9214610736578063a9059cbb1461075657600080fd5b806386a22eff146105e05780638c9dcf9e146106005780638da5cb5b1461062057806395d89b411461064057806395f93d481461065557600080fd5b80633c310f5e116101dd578063674a29cb116101a1578063674a29cb146104db5780636ebcf6071461050d57806370a082311461053a5780637303df9a146105705780637e926b4b146105a0578063816f52ef146105c057600080fd5b80633c310f5e1461044657806342966c6814610466578063461a4450146104865780634c57f8d2146104a65780635290d773146104c657600080fd5b806323b872dd1161022f57806323b872dd146103635780632af10fac146103835780632ecd7e8f146103bb5780632f54bf6e146103db578063313ce5671461040a578063395093511461042657600080fd5b8062167e931461027657806306fdde03146102d0578063095ea7b3146102f257806318160ddd146103225780631da1db5e1461034157600080fd5b3661027157005b600080fd5b34801561028257600080fd5b506019546102a69061ffff80821691620100008104821691600160201b9091041683565b6040805161ffff948516815292841660208401529216918101919091526060015b60405180910390f35b3480156102dc57600080fd5b506102e5610975565b6040516102c791906127ce565b3480156102fe57600080fd5b5061031261030d366004612834565b610a07565b60405190151581526020016102c7565b34801561032e57600080fd5b506002545b6040519081526020016102c7565b34801561034d57600080fd5b5061036161035c366004612860565b610a21565b005b34801561036f57600080fd5b5061031261037e366004612879565b610ad7565b34801561038f57600080fd5b50600d546103a3906001600160a01b031681565b6040516001600160a01b0390911681526020016102c7565b3480156103c757600080fd5b506103616103d63660046128d1565b610afd565b3480156103e757600080fd5b506103126103f6366004612904565b600b546001600160a01b0391821691161490565b34801561041657600080fd5b50604051600981526020016102c7565b34801561043257600080fd5b50610312610441366004612834565b610bc4565b34801561045257600080fd5b506103616104613660046128d1565b610be6565b34801561047257600080fd5b50610361610481366004612860565b610cad565b34801561049257600080fd5b506103616104a1366004612940565b610ccd565b3480156104b257600080fd5b506103616104c1366004612a5d565b610da6565b3480156104d257600080fd5b50601254610333565b3480156104e757600080fd5b506104f0610e99565b6040805193845260208401929092521515908201526060016102c7565b34801561051957600080fd5b50610333610528366004612904565b60006020819052908152604090205481565b34801561054657600080fd5b50610333610555366004612904565b6001600160a01b031660009081526020819052604090205490565b34801561057c57600080fd5b506017546102a69061ffff80821691620100008104821691600160201b9091041683565b3480156105ac57600080fd5b506103616105bb366004612b1f565b610ef0565b3480156105cc57600080fd5b506103616105db366004612b3c565b610f79565b3480156105ec57600080fd5b506103616105fb366004612bad565b61100f565b34801561060c57600080fd5b5061036161061b366004612b1f565b611064565b34801561062c57600080fd5b50600b546103a3906001600160a01b031681565b34801561064c57600080fd5b506102e56110d5565b34801561066157600080fd5b5060155461068b9060ff808216916101008104821691620100008204811691630100000090041684565b604080519415158552921515602085015260ff918216928401929092521660608201526080016102c7565b3480156106c257600080fd5b506103616106d1366004612be6565b6110e4565b3480156106e257600080fd5b506103126106f1366004612834565b611162565b34801561070257600080fd5b50610361610711366004612c35565b6111e8565b34801561072257600080fd5b50600e546103a3906001600160a01b031681565b34801561074257600080fd5b50610361610751366004612b1f565b611240565b34801561076257600080fd5b50610312610771366004612834565b611288565b34801561078257600080fd5b50601a54601b54601c54601d54601e546107c7949392919060ff80821691610100810482169162010000820481169163010000008104821691600160201b9091041689565b60408051998a5260208a019890985296880195909552606087019390935260ff9091166080860152151560a0850152151560c0840152151560e08301521515610100820152610120016102c7565b34801561082157600080fd5b506103616108303660046128d1565b611296565b34801561084157600080fd5b50610312610850366004612c35565b61135d565b34801561086157600080fd5b50600c546103a3906001600160a01b031681565b34801561088157600080fd5b50610361610890366004612c63565b61149e565b3480156108a157600080fd5b506016546102a69061ffff80821691620100008104821691600160201b9091041683565b3480156108d157600080fd5b506103336108e0366004612c35565b61163c565b3480156108f157600080fd5b506018546102a69061ffff80821691620100008104821691600160201b9091041683565b34801561092157600080fd5b50610361610930366004612904565b611667565b34801561094157600080fd5b506022546103a3906001600160a01b031681565b34801561096157600080fd5b50610361610970366004612c9c565b6117f6565b60606003805461098490612cb7565b80601f01602080910402602001604051908101604052809291908181526020018280546109b090612cb7565b80156109fd5780601f106109d2576101008083540402835291602001916109fd565b820191906000526020600020905b8154815290600101906020018083116109e057829003601f168201915b5050505050905090565b600033610a15818585611861565b60019150505b92915050565b600b546001600160a01b03163314610a545760405162461bcd60e51b8152600401610a4b90612cf1565b60405180910390fd5b6064811115610a6257600080fd5b600d5447906001600160a01b03166108fc6064610a7f8585612d36565b610a899190612d55565b6040518115909202916000818181858888f19350505050158015610ab1573d6000803e3d6000fd5b50610abc8282612d36565b601b8054600090610ace908490612d77565b90915550505050565b600033610ae5858285611985565b610af08585856119ff565b60019150505b9392505050565b600b546001600160a01b03163314610b275760405162461bcd60e51b8152600401610a4b90612cf1565b601754600160201b900461ffff16610b3f8284612d8a565b61ffff161115610b4e57600080fd5b6040805160608101825261ffff808516825283166020820152908101610b748385612d8a565b61ffff908116909152815160168054602085015160409095015192841663ffffffff199091161762010000948416949094029390931765ffff000000001916600160201b91909216021790555050565b600033610a15818585610bd7838361163c565b610be19190612d77565b611861565b600b546001600160a01b03163314610c105760405162461bcd60e51b8152600401610a4b90612cf1565b601754600160201b900461ffff16610c288284612d8a565b61ffff161115610c3757600080fd5b6040805160608101825261ffff808516825283166020820152908101610c5d8385612d8a565b61ffff908116909152815160188054602085015160409095015192841663ffffffff199091161762010000948416949094029390931765ffff000000001916600160201b91909216021790555050565b610cb73382611d8b565b600254600f54610cc79190612dac565b60125550565b600b546001600160a01b03163314610cf75760405162461bcd60e51b8152600401610a4b90612cf1565b60155460ff6201000090910481169082161115610d695760405162461bcd60e51b815260206004820152602a60248201527f436f6f6c646f776e2074696d65206d7573742062652062656c6f7720636f6f6c604482015269191bdddb881b1a5b5a5d60b21b6064820152608401610a4b565b6015805463ff0000ff1916630100000060ff939093169290920260ff1916919091179215159290921761ff00191661010091151591909102179055565b8051825114610def5760405162461bcd60e51b81526020600482015260156024820152742632b733ba3439903237903737ba1036b0ba31b41760591b6044820152606401610a4b565b60005b82518160ff161015610e9457818160ff1681518110610e1357610e13612dbf565b6020026020010151610e256105553390565b1015610e3057600080fd5b610e8233848360ff1681518110610e4957610e49612dbf565b6020026020010151848460ff1681518110610e6657610e66612dbf565b6020026020010151633b9aca00610e7d9190612d36565b611ebd565b80610e8c81612dd5565b915050610df2565b505050565b6021546000908190819060ff1615610ee257601f54610ebd90633b9aca0090612d55565b602054909350610ed290633b9aca0090612d55565b60215490925060ff169050909192565b505060025491829150600090565b600b546001600160a01b03163314610f1a5760405162461bcd60e51b8152600401610a4b90612cf1565b6040517fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce90600090a1600b54610f5d906001600160a01b03166000808080610f79565b610f6681611064565b50600b80546001600160a01b0319169055565b600b546001600160a01b03163314610fa35760405162461bcd60e51b8152600401610a4b90612cf1565b6001600160a01b039094166000908152600860209081526040808320805494151560ff1995861617905560068252808320805497151597851697909717909655600781528582208054941515948416949094179093556009909252929020805491151591909216179055565b600b546001600160a01b031633146110395760405162461bcd60e51b8152600401610a4b90612cf1565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b600b546001600160a01b0316331461108e5760405162461bcd60e51b8152600401610a4b90612cf1565b6021805460ff19168215159081179091556040519081527f190cf1bdfcaea87520373223c818b71931f9b786e469403c9c0c0cdae19763e79060200160405180910390a150565b60606004805461098490612cb7565b600b546001600160a01b0316331461110e5760405162461bcd60e51b8152600401610a4b90612cf1565b601e805460ff841664ff0000ffff199091166101008715150264ff000000ff19161717600160201b85151502179055600f546127109061114f908390612d36565b6111599190612d55565b601c5550505050565b60003381611170828661163c565b9050838110156111d05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a4b565b6111dd8286868403611861565b506001949350505050565b600b546001600160a01b031633146112125760405162461bcd60e51b8152600401610a4b90612cf1565b600c80546001600160a01b039384166001600160a01b031991821617909155600d8054929093169116179055565b600b546001600160a01b0316331461126a5760405162461bcd60e51b8152600401610a4b90612cf1565b601e805491151563010000000263ff00000019909216919091179055565b600033610a158185856119ff565b600b546001600160a01b031633146112c05760405162461bcd60e51b8152600401610a4b90612cf1565b601754600160201b900461ffff166112d88284612d8a565b61ffff1611156112e757600080fd5b6040805160608101825261ffff80851682528316602082015290810161130d8385612d8a565b61ffff908116909152815160198054602085015160409095015192841663ffffffff199091161762010000948416949094029390931765ffff000000001916600160201b91909216021790555050565b600b546000906001600160a01b0316331461138a5760405162461bcd60e51b8152600401610a4b90612cf1565b6001600160a01b038316158015906113ab57506001600160a01b0383163014155b6113b457600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156113fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141f9190612df4565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114969190612e0d565b949350505050565b600b546001600160a01b031633146114c85760405162461bcd60e51b8152600401610a4b90612cf1565b801561159257600183101580156114e157506103e88211155b61153b5760405162461bcd60e51b815260206004820152602560248201527f4d6178205472616e73616374696f6e206d757374206265207365742061626f7660448201526465202e312560d81b6064820152608401610a4b565b8183600f5461154a9190612d36565b6115549190612d55565b601f8190556040519081527fa53407ff336a78b145e1a297adce2a5d7a54e6c31d13b4e69e04aad80b07b44b906020015b60405180910390a1505050565b600183101580156115a4575060648211155b6115f05760405162461bcd60e51b815260206004820152601f60248201527f4d61782057616c6c6574206d757374206265207365742061626f7665203125006044820152606401610a4b565b8183600f546115ff9190612d36565b6116099190612d55565b60208181556040519182527f199db6b3f784dbaaa5df3981a282a84eb13409a543eaaeb8e8f309c467b45e189101611585565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600b546001600160a01b031633146116915760405162461bcd60e51b8152600401610a4b90612cf1565b6001600160a01b03811661171c5760405162461bcd60e51b815260206004820152604660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573732c207573652072656e6f756e63654f776e6572736869702046756064820152653731ba34b7b760d11b608482015260a401610a4b565b600b54604080516001600160a01b03928316815291831660208301527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1600b546001600160a01b0316600090815260208190526040902054156117aa57600b546001600160a01b03166000818152602081905260409020546117aa91908390611ebd565b600b546117c4906001600160a01b03166000808080610f79565b6117d48160018060016000610f79565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031633146118205760405162461bcd60e51b8152600401610a4b90612cf1565b60175461ffff600160201b9091048116908216111561183e57600080fd5b6017805461ffff909216600160201b0265ffff0000000019909216919091179055565b6001600160a01b0383166118c35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a4b565b6001600160a01b0382166119245760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a4b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611991848461163c565b905060001981146119f957818110156119ec5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a4b565b6119f98484848403611861565b50505050565b60145460ff16611a7c57600b546001600160a01b03848116911614611a5e5760405162461bcd60e51b815260206004820152601560248201527428393296a630bab731b410283937ba32b1ba34b7b760591b6044820152606401610a4b565b600e546001600160a01b0390811690831603611a7c57611a7c611ec8565b611a868383611f00565b8015611a94575060145460ff165b8015611aa2575060215460ff165b15611d49576001600160a01b03821660009081526008602052604090205460ff16611b2557601f548111801590611b04575060205481611af7846001600160a01b031660009081526020819052604090205490565b611b019190612d77565b11155b611b205760405162461bcd60e51b8152600401610a4b90612e2a565b611b68565b6001600160a01b0382166000908152600a602052604090205460ff1615611b6857601f54811115611b685760405162461bcd60e51b8152600401610a4b90612e2a565b6001600160a01b0383166000908152600a602052604090205460ff168015611ba957506001600160a01b03821660009081526006602052604090205460ff16155b8015611bb7575060155460ff165b15611c6b576001600160a01b0382166000908152600560205260409020544211611c365760405162461bcd60e51b815260206004820152602a60248201527f526563697069656e74206d757374207761697420756e74696c20636f6f6c646f6044820152693bb71034b99037bb32b960b11b6064820152608401610a4b565b601554611c4d906301000000900460ff1642612d77565b6001600160a01b038316600090815260056020526040902055611d49565b6001600160a01b03831660009081526006602052604090205460ff16158015611c9b5750601554610100900460ff165b15611d49576001600160a01b038316600090815260056020526040902054421015611d185760405162461bcd60e51b815260206004820152602760248201527f53656e646572206d757374207761697420756e74696c20636f6f6c646f776e2060448201526634b99037bb32b960c91b6064820152608401610a4b565b601554611d2f906301000000900460ff1642612d77565b6001600160a01b0384166000908152600560205260409020555b611d51611fc8565b15611d5e57611d5e612044565b6000611d6984612471565b611d735781611d7e565b611d7e8484846124a8565b90506119f9848483611ebd565b6001600160a01b038216611deb5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a4b565b6001600160a01b03821660009081526020819052604090205481811015611e5f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a4b565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b610e9483838361262a565b6014805460ff191660011790556040517fba61a96074b3d636edeee92caddc86293c917d5b6818b7d3698bb52e02ec86c890600090a1565b6000611f1a83600b546001600160a01b0391821691161490565b158015611f355750600b546001600160a01b03838116911614155b8015611f4c5750600b546001600160a01b03163214155b8015611f7157506001600160a01b03831660009081526009602052604090205460ff16155b8015611f9657506001600160a01b03821660009081526009602052604090205460ff16155b8015611fad57506001600160a01b03821661dead14155b8015610af657506001600160a01b0383163014159392505050565b336000908152600a602052604081205460ff16158015611ff15750601e5462010000900460ff16155b80156120045750601e54610100900460ff165b80156120225750601e54601d5461201e9160ff1690612d77565b4210155b801561203f5750601c543060009081526020819052604090205410155b905090565b601e805462ff000019166201000017905542601d55601c54601a54108015906120765750601e54600160201b900460ff165b1561229e57601c54601a8054600090612090908490612dac565b9091555050601c546000906120a790600290612d55565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106120e1576120e1612dbf565b6001600160a01b03928316602091820292909201810191909152602254604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561213a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215e9190612e70565b8160018151811061217157612171612dbf565b6001600160a01b03928316602091820292909201015260225460405163791ac94760e01b81524792919091169063791ac947906121bb908690600090879030904290600401612e8d565b600060405180830381600087803b1580156121d557600080fd5b505af11580156121e9573d6000803e3d6000fd5b50505050600081476121fb9190612dac565b602254600c5460405163f305d71960e01b81523060048201526024810188905260006044820181905260648201526001600160a01b0391821660848201524260a4820152929350169063f305d71990839060c40160606040518083038185885af115801561226d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906122929190612efe565b50505050505050612463565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106122d3576122d3612dbf565b6001600160a01b03928316602091820292909201810191909152602254604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561232c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123509190612e70565b8160018151811061236357612363612dbf565b6001600160a01b039283166020918202929092010152602254601c5460405163791ac94760e01b8152919092169163791ac947916123ad9190600090869030904290600401612e8d565b600060405180830381600087803b1580156123c757600080fd5b505af11580156123db573d6000803e3d6000fd5b5050600d54604051479350600092506001600160a01b039091169061753090849084818181858888f193505050503d8060008114612435576040519150601f19603f3d011682016040523d82523d6000602084013e61243a565b606091505b50509050801561245f5781601a60010160008282546124599190612d77565b90915550505b5050505b601e805462ff000019169055565b601e546000906301000000900460ff168015610a1b5750506001600160a01b031660009081526007602052604090205460ff161590565b6001600160a01b03821660009081526007602052604081205460ff16156124d0575080610af6565b6001600160a01b0383166000908152600a602052604090205460ff161561250757601854600160201b900461ffff16601055612550565b6001600160a01b0384166000908152600a602052604090205460ff161561253e57601654600160201b900461ffff16601055612550565b601954600160201b900461ffff166010555b6013546010546125609084612d36565b61256a9190612d55565b601155601e54600160201b900460ff1615612610576018546016546125969161ffff9081169116612d8a565b6018546016546125b99161ffff600160201b918290048116929190910416612d8a565b6125c39190612d8a565b60185460165461ffff928316926125dd9281169116612d8a565b61ffff166011546125ee9190612d36565b6125f89190612d55565b601a805460009061260a908490612d77565b90915550505b61261d8430601154611ebd565b6011546114969083612dac565b6001600160a01b03831661268e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a4b565b6001600160a01b0382166126f05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a4b565b6001600160a01b038316600090815260208190526040902054818110156127685760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a4b565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36119f9565b600060208083528351808285015260005b818110156127fb578581018301518582016040015282016127df565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461283157600080fd5b50565b6000806040838503121561284757600080fd5b82356128528161281c565b946020939093013593505050565b60006020828403121561287257600080fd5b5035919050565b60008060006060848603121561288e57600080fd5b83356128998161281c565b925060208401356128a98161281c565b929592945050506040919091013590565b803561ffff811681146128cc57600080fd5b919050565b600080604083850312156128e457600080fd5b6128ed836128ba565b91506128fb602084016128ba565b90509250929050565b60006020828403121561291657600080fd5b8135610af68161281c565b801515811461283157600080fd5b803560ff811681146128cc57600080fd5b60008060006060848603121561295557600080fd5b833561296081612921565b9250602084013561297081612921565b915061297e6040850161292f565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156129c6576129c6612987565b604052919050565b600067ffffffffffffffff8211156129e8576129e8612987565b5060051b60200190565b600082601f830112612a0357600080fd5b81356020612a18612a13836129ce565b61299d565b82815260059290921b84018101918181019086841115612a3757600080fd5b8286015b84811015612a525780358352918301918301612a3b565b509695505050505050565b60008060408385031215612a7057600080fd5b823567ffffffffffffffff80821115612a8857600080fd5b818501915085601f830112612a9c57600080fd5b81356020612aac612a13836129ce565b82815260059290921b84018101918181019089841115612acb57600080fd5b948201945b83861015612af2578535612ae38161281c565b82529482019490820190612ad0565b96505086013592505080821115612b0857600080fd5b50612b15858286016129f2565b9150509250929050565b600060208284031215612b3157600080fd5b8135610af681612921565b600080600080600060a08688031215612b5457600080fd5b8535612b5f8161281c565b94506020860135612b6f81612921565b93506040860135612b7f81612921565b92506060860135612b8f81612921565b91506080860135612b9f81612921565b809150509295509295909350565b60008060408385031215612bc057600080fd5b8235612bcb8161281c565b91506020830135612bdb81612921565b809150509250929050565b60008060008060808587031215612bfc57600080fd5b8435612c0781612921565b93506020850135612c1781612921565b9250612c256040860161292f565b9396929550929360600135925050565b60008060408385031215612c4857600080fd5b8235612c538161281c565b91506020830135612bdb8161281c565b600080600060608486031215612c7857600080fd5b83359250602084013591506040840135612c9181612921565b809150509250925092565b600060208284031215612cae57600080fd5b610af6826128ba565b600181811c90821680612ccb57607f821691505b602082108103612ceb57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601590820152742cb7ba9030b932903737ba103a34329037bbb732b960591b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612d5057612d50612d20565b500290565b600082612d7257634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610a1b57610a1b612d20565b61ffff818116838216019080821115612da557612da5612d20565b5092915050565b81810381811115610a1b57610a1b612d20565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff8103612deb57612deb612d20565b60010192915050565b600060208284031215612e0657600080fd5b5051919050565b600060208284031215612e1f57600080fd5b8151610af681612921565b60208082526026908201527f544f4b454e3a20416d6f756e742065786365656473205472616e73616374696f6040820152656e2073697a6560d01b606082015260800190565b600060208284031215612e8257600080fd5b8151610af68161281c565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612edd5784516001600160a01b031683529383019391830191600101612eb8565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612f1357600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220ee8e338cb8cc447fef5e9182012c47c59d48f9efa014a0d5fd90403314efba7064736f6c63430008100033

Deployed Bytecode

0x60806040526004361061026a5760003560e01c806386a22eff11610144578063b2c57fff116100b6578063dc7703671161007a578063dc77036714610895578063dd62ed3e146108c5578063f2421d2c146108e5578063f2fde38b14610915578063f887ea4014610935578063ff787dc61461095557600080fd5b8063b2c57fff14610776578063b7b69ec514610815578063c40fedc614610835578063ca33e64c14610855578063ccd721311461087557600080fd5b80639ab005f9116101085780639ab005f9146106b6578063a457c2d7146106d6578063a4b45c00146106f6578063a8aa1b3114610716578063a901dd9214610736578063a9059cbb1461075657600080fd5b806386a22eff146105e05780638c9dcf9e146106005780638da5cb5b1461062057806395d89b411461064057806395f93d481461065557600080fd5b80633c310f5e116101dd578063674a29cb116101a1578063674a29cb146104db5780636ebcf6071461050d57806370a082311461053a5780637303df9a146105705780637e926b4b146105a0578063816f52ef146105c057600080fd5b80633c310f5e1461044657806342966c6814610466578063461a4450146104865780634c57f8d2146104a65780635290d773146104c657600080fd5b806323b872dd1161022f57806323b872dd146103635780632af10fac146103835780632ecd7e8f146103bb5780632f54bf6e146103db578063313ce5671461040a578063395093511461042657600080fd5b8062167e931461027657806306fdde03146102d0578063095ea7b3146102f257806318160ddd146103225780631da1db5e1461034157600080fd5b3661027157005b600080fd5b34801561028257600080fd5b506019546102a69061ffff80821691620100008104821691600160201b9091041683565b6040805161ffff948516815292841660208401529216918101919091526060015b60405180910390f35b3480156102dc57600080fd5b506102e5610975565b6040516102c791906127ce565b3480156102fe57600080fd5b5061031261030d366004612834565b610a07565b60405190151581526020016102c7565b34801561032e57600080fd5b506002545b6040519081526020016102c7565b34801561034d57600080fd5b5061036161035c366004612860565b610a21565b005b34801561036f57600080fd5b5061031261037e366004612879565b610ad7565b34801561038f57600080fd5b50600d546103a3906001600160a01b031681565b6040516001600160a01b0390911681526020016102c7565b3480156103c757600080fd5b506103616103d63660046128d1565b610afd565b3480156103e757600080fd5b506103126103f6366004612904565b600b546001600160a01b0391821691161490565b34801561041657600080fd5b50604051600981526020016102c7565b34801561043257600080fd5b50610312610441366004612834565b610bc4565b34801561045257600080fd5b506103616104613660046128d1565b610be6565b34801561047257600080fd5b50610361610481366004612860565b610cad565b34801561049257600080fd5b506103616104a1366004612940565b610ccd565b3480156104b257600080fd5b506103616104c1366004612a5d565b610da6565b3480156104d257600080fd5b50601254610333565b3480156104e757600080fd5b506104f0610e99565b6040805193845260208401929092521515908201526060016102c7565b34801561051957600080fd5b50610333610528366004612904565b60006020819052908152604090205481565b34801561054657600080fd5b50610333610555366004612904565b6001600160a01b031660009081526020819052604090205490565b34801561057c57600080fd5b506017546102a69061ffff80821691620100008104821691600160201b9091041683565b3480156105ac57600080fd5b506103616105bb366004612b1f565b610ef0565b3480156105cc57600080fd5b506103616105db366004612b3c565b610f79565b3480156105ec57600080fd5b506103616105fb366004612bad565b61100f565b34801561060c57600080fd5b5061036161061b366004612b1f565b611064565b34801561062c57600080fd5b50600b546103a3906001600160a01b031681565b34801561064c57600080fd5b506102e56110d5565b34801561066157600080fd5b5060155461068b9060ff808216916101008104821691620100008204811691630100000090041684565b604080519415158552921515602085015260ff918216928401929092521660608201526080016102c7565b3480156106c257600080fd5b506103616106d1366004612be6565b6110e4565b3480156106e257600080fd5b506103126106f1366004612834565b611162565b34801561070257600080fd5b50610361610711366004612c35565b6111e8565b34801561072257600080fd5b50600e546103a3906001600160a01b031681565b34801561074257600080fd5b50610361610751366004612b1f565b611240565b34801561076257600080fd5b50610312610771366004612834565b611288565b34801561078257600080fd5b50601a54601b54601c54601d54601e546107c7949392919060ff80821691610100810482169162010000820481169163010000008104821691600160201b9091041689565b60408051998a5260208a019890985296880195909552606087019390935260ff9091166080860152151560a0850152151560c0840152151560e08301521515610100820152610120016102c7565b34801561082157600080fd5b506103616108303660046128d1565b611296565b34801561084157600080fd5b50610312610850366004612c35565b61135d565b34801561086157600080fd5b50600c546103a3906001600160a01b031681565b34801561088157600080fd5b50610361610890366004612c63565b61149e565b3480156108a157600080fd5b506016546102a69061ffff80821691620100008104821691600160201b9091041683565b3480156108d157600080fd5b506103336108e0366004612c35565b61163c565b3480156108f157600080fd5b506018546102a69061ffff80821691620100008104821691600160201b9091041683565b34801561092157600080fd5b50610361610930366004612904565b611667565b34801561094157600080fd5b506022546103a3906001600160a01b031681565b34801561096157600080fd5b50610361610970366004612c9c565b6117f6565b60606003805461098490612cb7565b80601f01602080910402602001604051908101604052809291908181526020018280546109b090612cb7565b80156109fd5780601f106109d2576101008083540402835291602001916109fd565b820191906000526020600020905b8154815290600101906020018083116109e057829003601f168201915b5050505050905090565b600033610a15818585611861565b60019150505b92915050565b600b546001600160a01b03163314610a545760405162461bcd60e51b8152600401610a4b90612cf1565b60405180910390fd5b6064811115610a6257600080fd5b600d5447906001600160a01b03166108fc6064610a7f8585612d36565b610a899190612d55565b6040518115909202916000818181858888f19350505050158015610ab1573d6000803e3d6000fd5b50610abc8282612d36565b601b8054600090610ace908490612d77565b90915550505050565b600033610ae5858285611985565b610af08585856119ff565b60019150505b9392505050565b600b546001600160a01b03163314610b275760405162461bcd60e51b8152600401610a4b90612cf1565b601754600160201b900461ffff16610b3f8284612d8a565b61ffff161115610b4e57600080fd5b6040805160608101825261ffff808516825283166020820152908101610b748385612d8a565b61ffff908116909152815160168054602085015160409095015192841663ffffffff199091161762010000948416949094029390931765ffff000000001916600160201b91909216021790555050565b600033610a15818585610bd7838361163c565b610be19190612d77565b611861565b600b546001600160a01b03163314610c105760405162461bcd60e51b8152600401610a4b90612cf1565b601754600160201b900461ffff16610c288284612d8a565b61ffff161115610c3757600080fd5b6040805160608101825261ffff808516825283166020820152908101610c5d8385612d8a565b61ffff908116909152815160188054602085015160409095015192841663ffffffff199091161762010000948416949094029390931765ffff000000001916600160201b91909216021790555050565b610cb73382611d8b565b600254600f54610cc79190612dac565b60125550565b600b546001600160a01b03163314610cf75760405162461bcd60e51b8152600401610a4b90612cf1565b60155460ff6201000090910481169082161115610d695760405162461bcd60e51b815260206004820152602a60248201527f436f6f6c646f776e2074696d65206d7573742062652062656c6f7720636f6f6c604482015269191bdddb881b1a5b5a5d60b21b6064820152608401610a4b565b6015805463ff0000ff1916630100000060ff939093169290920260ff1916919091179215159290921761ff00191661010091151591909102179055565b8051825114610def5760405162461bcd60e51b81526020600482015260156024820152742632b733ba3439903237903737ba1036b0ba31b41760591b6044820152606401610a4b565b60005b82518160ff161015610e9457818160ff1681518110610e1357610e13612dbf565b6020026020010151610e256105553390565b1015610e3057600080fd5b610e8233848360ff1681518110610e4957610e49612dbf565b6020026020010151848460ff1681518110610e6657610e66612dbf565b6020026020010151633b9aca00610e7d9190612d36565b611ebd565b80610e8c81612dd5565b915050610df2565b505050565b6021546000908190819060ff1615610ee257601f54610ebd90633b9aca0090612d55565b602054909350610ed290633b9aca0090612d55565b60215490925060ff169050909192565b505060025491829150600090565b600b546001600160a01b03163314610f1a5760405162461bcd60e51b8152600401610a4b90612cf1565b6040517fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce90600090a1600b54610f5d906001600160a01b03166000808080610f79565b610f6681611064565b50600b80546001600160a01b0319169055565b600b546001600160a01b03163314610fa35760405162461bcd60e51b8152600401610a4b90612cf1565b6001600160a01b039094166000908152600860209081526040808320805494151560ff1995861617905560068252808320805497151597851697909717909655600781528582208054941515948416949094179093556009909252929020805491151591909216179055565b600b546001600160a01b031633146110395760405162461bcd60e51b8152600401610a4b90612cf1565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b600b546001600160a01b0316331461108e5760405162461bcd60e51b8152600401610a4b90612cf1565b6021805460ff19168215159081179091556040519081527f190cf1bdfcaea87520373223c818b71931f9b786e469403c9c0c0cdae19763e79060200160405180910390a150565b60606004805461098490612cb7565b600b546001600160a01b0316331461110e5760405162461bcd60e51b8152600401610a4b90612cf1565b601e805460ff841664ff0000ffff199091166101008715150264ff000000ff19161717600160201b85151502179055600f546127109061114f908390612d36565b6111599190612d55565b601c5550505050565b60003381611170828661163c565b9050838110156111d05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a4b565b6111dd8286868403611861565b506001949350505050565b600b546001600160a01b031633146112125760405162461bcd60e51b8152600401610a4b90612cf1565b600c80546001600160a01b039384166001600160a01b031991821617909155600d8054929093169116179055565b600b546001600160a01b0316331461126a5760405162461bcd60e51b8152600401610a4b90612cf1565b601e805491151563010000000263ff00000019909216919091179055565b600033610a158185856119ff565b600b546001600160a01b031633146112c05760405162461bcd60e51b8152600401610a4b90612cf1565b601754600160201b900461ffff166112d88284612d8a565b61ffff1611156112e757600080fd5b6040805160608101825261ffff80851682528316602082015290810161130d8385612d8a565b61ffff908116909152815160198054602085015160409095015192841663ffffffff199091161762010000948416949094029390931765ffff000000001916600160201b91909216021790555050565b600b546000906001600160a01b0316331461138a5760405162461bcd60e51b8152600401610a4b90612cf1565b6001600160a01b038316158015906113ab57506001600160a01b0383163014155b6113b457600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156113fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141f9190612df4565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114969190612e0d565b949350505050565b600b546001600160a01b031633146114c85760405162461bcd60e51b8152600401610a4b90612cf1565b801561159257600183101580156114e157506103e88211155b61153b5760405162461bcd60e51b815260206004820152602560248201527f4d6178205472616e73616374696f6e206d757374206265207365742061626f7660448201526465202e312560d81b6064820152608401610a4b565b8183600f5461154a9190612d36565b6115549190612d55565b601f8190556040519081527fa53407ff336a78b145e1a297adce2a5d7a54e6c31d13b4e69e04aad80b07b44b906020015b60405180910390a1505050565b600183101580156115a4575060648211155b6115f05760405162461bcd60e51b815260206004820152601f60248201527f4d61782057616c6c6574206d757374206265207365742061626f7665203125006044820152606401610a4b565b8183600f546115ff9190612d36565b6116099190612d55565b60208181556040519182527f199db6b3f784dbaaa5df3981a282a84eb13409a543eaaeb8e8f309c467b45e189101611585565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600b546001600160a01b031633146116915760405162461bcd60e51b8152600401610a4b90612cf1565b6001600160a01b03811661171c5760405162461bcd60e51b815260206004820152604660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573732c207573652072656e6f756e63654f776e6572736869702046756064820152653731ba34b7b760d11b608482015260a401610a4b565b600b54604080516001600160a01b03928316815291831660208301527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1600b546001600160a01b0316600090815260208190526040902054156117aa57600b546001600160a01b03166000818152602081905260409020546117aa91908390611ebd565b600b546117c4906001600160a01b03166000808080610f79565b6117d48160018060016000610f79565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031633146118205760405162461bcd60e51b8152600401610a4b90612cf1565b60175461ffff600160201b9091048116908216111561183e57600080fd5b6017805461ffff909216600160201b0265ffff0000000019909216919091179055565b6001600160a01b0383166118c35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a4b565b6001600160a01b0382166119245760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a4b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611991848461163c565b905060001981146119f957818110156119ec5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a4b565b6119f98484848403611861565b50505050565b60145460ff16611a7c57600b546001600160a01b03848116911614611a5e5760405162461bcd60e51b815260206004820152601560248201527428393296a630bab731b410283937ba32b1ba34b7b760591b6044820152606401610a4b565b600e546001600160a01b0390811690831603611a7c57611a7c611ec8565b611a868383611f00565b8015611a94575060145460ff165b8015611aa2575060215460ff165b15611d49576001600160a01b03821660009081526008602052604090205460ff16611b2557601f548111801590611b04575060205481611af7846001600160a01b031660009081526020819052604090205490565b611b019190612d77565b11155b611b205760405162461bcd60e51b8152600401610a4b90612e2a565b611b68565b6001600160a01b0382166000908152600a602052604090205460ff1615611b6857601f54811115611b685760405162461bcd60e51b8152600401610a4b90612e2a565b6001600160a01b0383166000908152600a602052604090205460ff168015611ba957506001600160a01b03821660009081526006602052604090205460ff16155b8015611bb7575060155460ff165b15611c6b576001600160a01b0382166000908152600560205260409020544211611c365760405162461bcd60e51b815260206004820152602a60248201527f526563697069656e74206d757374207761697420756e74696c20636f6f6c646f6044820152693bb71034b99037bb32b960b11b6064820152608401610a4b565b601554611c4d906301000000900460ff1642612d77565b6001600160a01b038316600090815260056020526040902055611d49565b6001600160a01b03831660009081526006602052604090205460ff16158015611c9b5750601554610100900460ff165b15611d49576001600160a01b038316600090815260056020526040902054421015611d185760405162461bcd60e51b815260206004820152602760248201527f53656e646572206d757374207761697420756e74696c20636f6f6c646f776e2060448201526634b99037bb32b960c91b6064820152608401610a4b565b601554611d2f906301000000900460ff1642612d77565b6001600160a01b0384166000908152600560205260409020555b611d51611fc8565b15611d5e57611d5e612044565b6000611d6984612471565b611d735781611d7e565b611d7e8484846124a8565b90506119f9848483611ebd565b6001600160a01b038216611deb5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a4b565b6001600160a01b03821660009081526020819052604090205481811015611e5f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a4b565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b610e9483838361262a565b6014805460ff191660011790556040517fba61a96074b3d636edeee92caddc86293c917d5b6818b7d3698bb52e02ec86c890600090a1565b6000611f1a83600b546001600160a01b0391821691161490565b158015611f355750600b546001600160a01b03838116911614155b8015611f4c5750600b546001600160a01b03163214155b8015611f7157506001600160a01b03831660009081526009602052604090205460ff16155b8015611f9657506001600160a01b03821660009081526009602052604090205460ff16155b8015611fad57506001600160a01b03821661dead14155b8015610af657506001600160a01b0383163014159392505050565b336000908152600a602052604081205460ff16158015611ff15750601e5462010000900460ff16155b80156120045750601e54610100900460ff165b80156120225750601e54601d5461201e9160ff1690612d77565b4210155b801561203f5750601c543060009081526020819052604090205410155b905090565b601e805462ff000019166201000017905542601d55601c54601a54108015906120765750601e54600160201b900460ff165b1561229e57601c54601a8054600090612090908490612dac565b9091555050601c546000906120a790600290612d55565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106120e1576120e1612dbf565b6001600160a01b03928316602091820292909201810191909152602254604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561213a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215e9190612e70565b8160018151811061217157612171612dbf565b6001600160a01b03928316602091820292909201015260225460405163791ac94760e01b81524792919091169063791ac947906121bb908690600090879030904290600401612e8d565b600060405180830381600087803b1580156121d557600080fd5b505af11580156121e9573d6000803e3d6000fd5b50505050600081476121fb9190612dac565b602254600c5460405163f305d71960e01b81523060048201526024810188905260006044820181905260648201526001600160a01b0391821660848201524260a4820152929350169063f305d71990839060c40160606040518083038185885af115801561226d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906122929190612efe565b50505050505050612463565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106122d3576122d3612dbf565b6001600160a01b03928316602091820292909201810191909152602254604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561232c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123509190612e70565b8160018151811061236357612363612dbf565b6001600160a01b039283166020918202929092010152602254601c5460405163791ac94760e01b8152919092169163791ac947916123ad9190600090869030904290600401612e8d565b600060405180830381600087803b1580156123c757600080fd5b505af11580156123db573d6000803e3d6000fd5b5050600d54604051479350600092506001600160a01b039091169061753090849084818181858888f193505050503d8060008114612435576040519150601f19603f3d011682016040523d82523d6000602084013e61243a565b606091505b50509050801561245f5781601a60010160008282546124599190612d77565b90915550505b5050505b601e805462ff000019169055565b601e546000906301000000900460ff168015610a1b5750506001600160a01b031660009081526007602052604090205460ff161590565b6001600160a01b03821660009081526007602052604081205460ff16156124d0575080610af6565b6001600160a01b0383166000908152600a602052604090205460ff161561250757601854600160201b900461ffff16601055612550565b6001600160a01b0384166000908152600a602052604090205460ff161561253e57601654600160201b900461ffff16601055612550565b601954600160201b900461ffff166010555b6013546010546125609084612d36565b61256a9190612d55565b601155601e54600160201b900460ff1615612610576018546016546125969161ffff9081169116612d8a565b6018546016546125b99161ffff600160201b918290048116929190910416612d8a565b6125c39190612d8a565b60185460165461ffff928316926125dd9281169116612d8a565b61ffff166011546125ee9190612d36565b6125f89190612d55565b601a805460009061260a908490612d77565b90915550505b61261d8430601154611ebd565b6011546114969083612dac565b6001600160a01b03831661268e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a4b565b6001600160a01b0382166126f05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a4b565b6001600160a01b038316600090815260208190526040902054818110156127685760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a4b565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36119f9565b600060208083528351808285015260005b818110156127fb578581018301518582016040015282016127df565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461283157600080fd5b50565b6000806040838503121561284757600080fd5b82356128528161281c565b946020939093013593505050565b60006020828403121561287257600080fd5b5035919050565b60008060006060848603121561288e57600080fd5b83356128998161281c565b925060208401356128a98161281c565b929592945050506040919091013590565b803561ffff811681146128cc57600080fd5b919050565b600080604083850312156128e457600080fd5b6128ed836128ba565b91506128fb602084016128ba565b90509250929050565b60006020828403121561291657600080fd5b8135610af68161281c565b801515811461283157600080fd5b803560ff811681146128cc57600080fd5b60008060006060848603121561295557600080fd5b833561296081612921565b9250602084013561297081612921565b915061297e6040850161292f565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156129c6576129c6612987565b604052919050565b600067ffffffffffffffff8211156129e8576129e8612987565b5060051b60200190565b600082601f830112612a0357600080fd5b81356020612a18612a13836129ce565b61299d565b82815260059290921b84018101918181019086841115612a3757600080fd5b8286015b84811015612a525780358352918301918301612a3b565b509695505050505050565b60008060408385031215612a7057600080fd5b823567ffffffffffffffff80821115612a8857600080fd5b818501915085601f830112612a9c57600080fd5b81356020612aac612a13836129ce565b82815260059290921b84018101918181019089841115612acb57600080fd5b948201945b83861015612af2578535612ae38161281c565b82529482019490820190612ad0565b96505086013592505080821115612b0857600080fd5b50612b15858286016129f2565b9150509250929050565b600060208284031215612b3157600080fd5b8135610af681612921565b600080600080600060a08688031215612b5457600080fd5b8535612b5f8161281c565b94506020860135612b6f81612921565b93506040860135612b7f81612921565b92506060860135612b8f81612921565b91506080860135612b9f81612921565b809150509295509295909350565b60008060408385031215612bc057600080fd5b8235612bcb8161281c565b91506020830135612bdb81612921565b809150509250929050565b60008060008060808587031215612bfc57600080fd5b8435612c0781612921565b93506020850135612c1781612921565b9250612c256040860161292f565b9396929550929360600135925050565b60008060408385031215612c4857600080fd5b8235612c538161281c565b91506020830135612bdb8161281c565b600080600060608486031215612c7857600080fd5b83359250602084013591506040840135612c9181612921565b809150509250925092565b600060208284031215612cae57600080fd5b610af6826128ba565b600181811c90821680612ccb57607f821691505b602082108103612ceb57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601590820152742cb7ba9030b932903737ba103a34329037bbb732b960591b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612d5057612d50612d20565b500290565b600082612d7257634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610a1b57610a1b612d20565b61ffff818116838216019080821115612da557612da5612d20565b5092915050565b81810381811115610a1b57610a1b612d20565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff8103612deb57612deb612d20565b60010192915050565b600060208284031215612e0657600080fd5b5051919050565b600060208284031215612e1f57600080fd5b8151610af681612921565b60208082526026908201527f544f4b454e3a20416d6f756e742065786365656473205472616e73616374696f6040820152656e2073697a6560d01b606082015260800190565b600060208284031215612e8257600080fd5b8151610af68161281c565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612edd5784516001600160a01b031683529383019391830191600101612eb8565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612f1357600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220ee8e338cb8cc447fef5e9182012c47c59d48f9efa014a0d5fd90403314efba7064736f6c63430008100033

Deployed Bytecode Sourcemap

38533:16796:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40056:25;;;;;;;;;;-1:-1:-1;40056:25:0;;;;;;;;;;;;;;;-1:-1:-1;;;40056:25:0;;;;;;;;;;220:6:1;253:15;;;235:34;;305:15;;;300:2;285:18;;278:43;357:15;;337:18;;;330:43;;;;198:2;183:18;40056:25:0;;;;;;;;19517:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21868:201::-;;;;;;;;;;-1:-1:-1;21868:201:0;;;;;:::i;:::-;;:::i;:::-;;;1558:14:1;;1551:22;1533:41;;1521:2;1506:18;21868:201:0;1393:187:1;20637:108:0;;;;;;;;;;-1:-1:-1;20725:12:0;;20637:108;;;1731:25:1;;;1719:2;1704:18;20637:108:0;1585:177:1;43807:358:0;;;;;;;;;;-1:-1:-1;43807:358:0;;;;;:::i;:::-;;:::i;:::-;;22649:295;;;;;;;;;;-1:-1:-1;22649:295:0;;;;;:::i;:::-;;:::i;38939:34::-;;;;;;;;;;-1:-1:-1;38939:34:0;;;;-1:-1:-1;;;;;38939:34:0;;;;;;-1:-1:-1;;;;;2577:32:1;;;2559:51;;2547:2;2532:18;38939:34:0;2413:203:1;46224:332:0;;;;;;;;;;-1:-1:-1;46224:332:0;;;;;:::i;:::-;;:::i;54327:103::-;;;;;;;;;;-1:-1:-1;54327:103:0;;;;;:::i;:::-;54417:5;;-1:-1:-1;;;;;54406:16:0;;;54417:5;;54406:16;;54327:103;53695:92;;;;;;;;;;-1:-1:-1;53695:92:0;;53778:1;3440:36:1;;3428:2;3413:18;53695:92:0;3298:184:1;23353:238:0;;;;;;;;;;-1:-1:-1;23353:238:0;;;;;:::i;:::-;;:::i;46918:334::-;;;;;;;;;;-1:-1:-1;46918:334:0;;;;;:::i;:::-;;:::i;54548:139::-;;;;;;;;;;-1:-1:-1;54548:139:0;;;;;:::i;:::-;;:::i;45772:346::-;;;;;;;;;;-1:-1:-1;45772:346:0;;;;;:::i;:::-;;:::i;54695:376::-;;;;;;;;;;-1:-1:-1;54695:376:0;;;;;:::i;:::-;;:::i;54438:102::-;;;;;;;;;;-1:-1:-1;54520:12:0;;54438:102;;53795:524;;;;;;;;;;;;;:::i;:::-;;;;6905:25:1;;;6961:2;6946:18;;6939:34;;;;7016:14;7009:22;6989:18;;;6982:50;6893:2;6878:18;53795:524:0;6709:329:1;18795:44:0;;;;;;;;;;-1:-1:-1;18795:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;20808:127;;;;;;;;;;-1:-1:-1;20808:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;20909:18:0;20882:7;20909:18;;;;;;;;;;;;20808:127;40001:20;;;;;;;;;;-1:-1:-1;40001:20:0;;;;;;;;;;;;;;;-1:-1:-1;;;40001:20:0;;;;;;42877:237;;;;;;;;;;-1:-1:-1;42877:237:0;;;;;:::i;:::-;;:::i;45159:334::-;;;;;;;;;;-1:-1:-1;45159:334:0;;;;;:::i;:::-;;:::i;45654:110::-;;;;;;;;;;-1:-1:-1;45654:110:0;;;;;:::i;:::-;;:::i;45501:145::-;;;;;;;;;;-1:-1:-1;45501:145:0;;;;;:::i;:::-;;:::i;38869:20::-;;;;;;;;;;-1:-1:-1;38869:20:0;;;;-1:-1:-1;;;;;38869:20:0;;;19736:104;;;;;;;;;;;;;:::i;39938:29::-;;;;;;;;;;-1:-1:-1;39938:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8706:14:1;;8699:22;8681:41;;8765:14;;8758:22;8753:2;8738:18;;8731:50;8829:4;8817:17;;;8797:18;;;8790:45;;;;8871:17;8866:2;8851:18;;8844:45;8668:3;8653:19;39938:29:0;8470:425:1;47773:358:0;;;;;;;;;;-1:-1:-1;47773:358:0;;;;;:::i;:::-;;:::i;24094:436::-;;;;;;;;;;-1:-1:-1;24094:436:0;;;;;:::i;:::-;;:::i;47543:222::-;;;;;;;;;;-1:-1:-1;47543:222:0;;;;;:::i;:::-;;:::i;38980:19::-;;;;;;;;;;-1:-1:-1;38980:19:0;;;;-1:-1:-1;;;;;38980:19:0;;;47422:113;;;;;;;;;;-1:-1:-1;47422:113:0;;;;;:::i;:::-;;:::i;21141:193::-;;;;;;;;;;-1:-1:-1;21141:193:0;;;;;:::i;:::-;;:::i;40088:43::-;;;;;;;;;;-1:-1:-1;40088:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40088:43:0;;;;;;;;;;10156:25:1;;;10212:2;10197:18;;10190:34;;;;10240:18;;;10233:34;;;;10298:2;10283:18;;10276:34;;;;10359:4;10347:17;;;10341:3;10326:19;;10319:46;10409:14;10402:22;10396:3;10381:19;;10374:51;10469:14;10462:22;10456:3;10441:19;;10434:51;10529:14;10522:22;10516:3;10501:19;;10494:51;10589:14;10582:22;10576:3;10561:19;;10554:51;10143:3;10128:19;40088:43:0;9813:798:1;46568:342:0;;;;;;;;;;-1:-1:-1;46568:342:0;;;;;:::i;:::-;;:::i;44173:312::-;;;;;;;;;;-1:-1:-1;44173:312:0;;;;;:::i;:::-;;:::i;38896:36::-;;;;;;;;;;-1:-1:-1;38896:36:0;;;;-1:-1:-1;;;;;38896:36:0;;;44493:658;;;;;;;;;;-1:-1:-1;44493:658:0;;;;;:::i;:::-;;:::i;39974:20::-;;;;;;;;;;-1:-1:-1;39974:20:0;;;;;;;;;;;;;;;-1:-1:-1;;;39974:20:0;;;;;;21397:151;;;;;;;;;;-1:-1:-1;21397:151:0;;;;;:::i;:::-;;:::i;40028:21::-;;;;;;;;;;-1:-1:-1;40028:21:0;;;;;;;;;;;;;;;-1:-1:-1;;;40028:21:0;;;;;;43122:487;;;;;;;;;;-1:-1:-1;43122:487:0;;;;;:::i;:::-;;:::i;40185:32::-;;;;;;;;;;-1:-1:-1;40185:32:0;;;;-1:-1:-1;;;;;40185:32:0;;;47261:153;;;;;;;;;;-1:-1:-1;47261:153:0;;;;;:::i;:::-;;:::i;19517:100::-;19571:13;19604:5;19597:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19517:100;:::o;21868:201::-;21951:4;294:10;22007:32;294:10;22023:7;22032:6;22007:8;:32::i;:::-;22057:4;22050:11;;;21868:201;;;;;:::o;43807:358::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;;;;;;;;;43918:3:::1;43898:16;:23;;43890:32;;;::::0;::::1;;43993:19;::::0;43953:21:::1;::::0;-1:-1:-1;;;;;43993:19:0::1;43985:99;44070:3;44038:28;44050:16:::0;43953:21;44038:28:::1;:::i;:::-;44037:36;;;;:::i;:::-;43985:99;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;44129:28:0::1;44141:16:::0;44129:9;:28:::1;:::i;:::-;44095:30:::0;:62;;:30:::1;::::0;:62:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;43807:358:0:o;22649:295::-;22780:4;294:10;22838:38;22854:4;294:10;22869:6;22838:15;:38::i;:::-;22887:27;22897:4;22903:2;22907:6;22887:9;:27::i;:::-;22932:4;22925:11;;;22649:295;;;;;;:::o;46224:332::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;46357:7:::1;:16:::0;-1:-1:-1;;;46357:16:0;::::1;;;46325:28;46341:12:::0;46325:13;:28:::1;:::i;:::-;:48;;;;46317:57;;;::::0;::::1;;46395:153;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;;;46508:28:::1;46471:12:::0;46430:13;46508:28:::1;:::i;:::-;46395:153;::::0;;::::1;::::0;;;46385:163;;:7:::1;:163:::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;46385:163:0;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;46385:163:0::1;-1:-1:-1::0;;;46385:163:0;;;::::1;;;::::0;;-1:-1:-1;;46224:332:0:o;23353:238::-;23441:4;294:10;23497:64;294:10;23513:7;23550:10;23522:25;294:10;23513:7;23522:9;:25::i;:::-;:38;;;;:::i;:::-;23497:8;:64::i;46918:334::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;47052:7:::1;:16:::0;-1:-1:-1;;;47052:16:0;::::1;;;47020:28;47036:12:::0;47020:13;:28:::1;:::i;:::-;:48;;;;47012:57;;;::::0;::::1;;47091:153;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;;;47204:28:::1;47167:12:::0;47126:13;47204:28:::1;:::i;:::-;47091:153;::::0;;::::1;::::0;;;47080:164;;:8:::1;:164:::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;47080:164:0;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;47080:164:0::1;-1:-1:-1::0;;;47080:164:0;;;::::1;;;::::0;;-1:-1:-1;;46918:334:0:o;54548:139::-;54598:27;294:10;54618:6;54598:5;:27::i;:::-;20725:12;;54651;;:28;;;;:::i;:::-;54636:12;:43;-1:-1:-1;54548:139:0:o;45772:346::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;45891:12:::1;:26:::0;::::1;::::0;;;::::1;::::0;::::1;45878:39:::0;;::::1;;;45870:94;;;::::0;-1:-1:-1;;;45870:94:0;;13322:2:1;45870:94:0::1;::::0;::::1;13304:21:1::0;13361:2;13341:18;;;13334:30;13400:34;13380:18;;;13373:62;-1:-1:-1;;;13451:18:1;;;13444:40;13501:19;;45870:94:0::1;13120:406:1::0;45870:94:0::1;45975:12;:37:::0;;-1:-1:-1;;46023:37:0;45975;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;46023:37:0;;;;;;::::1;;::::0;;;::::1;-1:-1:-1::0;;46071:39:0::1;45975:37;46071:39:::0;::::1;;::::0;;;::::1;;::::0;;45772:346::o;54695:376::-;54820:7;:14;54800:9;:16;:34;54792:68;;;;-1:-1:-1;;;54792:68:0;;13733:2:1;54792:68:0;;;13715:21:1;13772:2;13752:18;;;13745:30;-1:-1:-1;;;13791:18:1;;;13784:51;13852:18;;54792:68:0;13531:345:1;54792:68:0;54876:7;54871:193;54893:9;:16;54889:1;:20;;;54871:193;;;54966:7;54974:1;54966:10;;;;;;;;;;:::i;:::-;;;;;;;54939:23;54949:12;294:10;;206:107;54939:23;:37;;54931:46;;;;;;54992:60;294:10;55021:9;55031:1;55021:12;;;;;;;;;;:::i;:::-;;;;;;;55035:7;55043:1;55035:10;;;;;;;;;;:::i;:::-;;;;;;;55046:5;55035:16;;;;:::i;:::-;54992:14;:60::i;:::-;54911:3;;;;:::i;:::-;;;;54871:193;;;;54695:376;;:::o;53795:524::-;53924:28;;53850:19;;;;;;53924:28;;53921:391;;;53985:19;:31;:39;;54019:5;;53985:39;:::i;:::-;54051:35;;53968:56;;-1:-1:-1;54051:43:0;;54089:5;;54051:43;:::i;:::-;54129:28;;54039:55;;-1:-1:-1;54129:28:0;;;-1:-1:-1;53795:524:0;;;:::o;53921:391::-;-1:-1:-1;;20725:12:0;;;;;-1:-1:-1;54295:5:0;;53795:524::o;42877:237::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;42954:20:::1;::::0;::::1;::::0;;;::::1;43006:5;::::0;42985:55:::1;::::0;-1:-1:-1;;;;;43006:5:0::1;;::::0;;;42985:20:::1;:55::i;:::-;43051:26;43066:10;43051:14;:26::i;:::-;-1:-1:-1::0;43088:5:0::1;:18:::0;;-1:-1:-1;;;;;;43088:18:0::1;::::0;;42877:237::o;45159:334::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45309:25:0;;::::1;;::::0;;;:17:::1;:25;::::0;;;;;;;:43;;;::::1;;-1:-1:-1::0;;45309:43:0;;::::1;;::::0;;45363:16:::1;:24:::0;;;;;:41;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;45415:11:::1;:19:::0;;;;;:31;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;45457:8:::1;:16:::0;;;;;;:28;;;::::1;;::::0;;;::::1;;::::0;;45159:334::o;45654:110::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45731:16:0;;;::::1;;::::0;;;:7:::1;:16;::::0;;;;:25;;-1:-1:-1;;45731:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;45654:110::o;45501:145::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;45567:28;:36;;-1:-1:-1;;45567:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;45619:19:::1;::::0;1533:41:1;;;45619:19:0::1;::::0;1521:2:1;1506:18;45619:19:0::1;;;;;;;45501:145:::0;:::o;19736:104::-;19792:13;19825:7;19818:14;;;;;:::i;47773:358::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;47891:29;:40;;::::1;47942:41:::0;::::1;-1:-1:-1::0;;47994:46:0;;;47891:40:::1;::::0;::::1;;;-1:-1:-1::0;;47994:46:0;;;-1:-1:-1;;;47994:46:0;::::1;;;;::::0;;48088:12:::1;::::0;48117:5:::1;::::0;48088:24:::1;::::0;48104:7;;48088:24:::1;:::i;:::-;48087:36;;;;:::i;:::-;48051:33:::0;:72;-1:-1:-1;;;;47773:358:0:o;24094:436::-;24187:4;294:10;24187:4;24270:25;294:10;24287:7;24270:9;:25::i;:::-;24243:52;;24334:15;24314:16;:35;;24306:85;;;;-1:-1:-1;;;24306:85:0;;14395:2:1;24306:85:0;;;14377:21:1;14434:2;14414:18;;;14407:30;14473:34;14453:18;;;14446:62;-1:-1:-1;;;14524:18:1;;;14517:35;14569:19;;24306:85:0;14193:401:1;24306:85:0;24427:60;24436:5;24443:7;24471:15;24452:16;:34;24427:8;:60::i;:::-;-1:-1:-1;24518:4:0;;24094:436;-1:-1:-1;;;;24094:436:0:o;47543:222::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;47658:21:::1;:46:::0;;-1:-1:-1;;;;;47658:46:0;;::::1;-1:-1:-1::0;;;;;;47658:46:0;;::::1;;::::0;;;47715:19:::1;:42:::0;;;;;::::1;::::0;::::1;;::::0;;47543:222::o;47422:113::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;47488:29;:39;;;::::1;;::::0;::::1;-1:-1:-1::0;;47488:39:0;;::::1;::::0;;;::::1;::::0;;47422:113::o;21141:193::-;21220:4;294:10;21276:28;294:10;21293:2;21297:6;21276:9;:28::i;46568:342::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;46706:7:::1;:16:::0;-1:-1:-1;;;46706:16:0;::::1;;;46674:28;46690:12:::0;46674:13;:28:::1;:::i;:::-;:48;;;;46666:57;;;::::0;::::1;;46749:153;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;;;46862:28:::1;46825:12:::0;46784:13;46862:28:::1;:::i;:::-;46749:153;::::0;;::::1;::::0;;;46734:168;;:12:::1;:168:::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;46734:168:0;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;46734:168:0::1;-1:-1:-1::0;;;46734:168:0;;;::::1;;;::::0;;-1:-1:-1;;46568:342:0:o;44173:312::-;54417:5;;44256:10;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44287:20:0;::::1;::::0;;::::1;::::0;:47:::1;;-1:-1:-1::0;;;;;;44311:23:0;::::1;44329:4;44311:23;;44287:47;44279:56;;;::::0;::::1;;44373:39;::::0;-1:-1:-1;;;44373:39:0;;44406:4:::1;44373:39;::::0;::::1;2559:51:1::0;44346:24:0::1;::::0;-1:-1:-1;;;;;44373:24:0;::::1;::::0;::::1;::::0;2532:18:1;;44373:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44431:46;::::0;-1:-1:-1;;;44431:46:0;;-1:-1:-1;;;;;14980:32:1;;;44431:46:0::1;::::0;::::1;14962:51:1::0;15029:18;;;15022:34;;;44346:66:0;;-1:-1:-1;44431:23:0;;::::1;::::0;::::1;::::0;14935:18:1;;44431:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44423:54:::0;44173:312;-1:-1:-1;;;;44173:312:0:o;44493:658::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;44604:10:::1;44601:543;;;44649:1;44638:7;:12;;:31;;;;;44665:4;44654:7;:15;;44638:31;44630:81;;;::::0;-1:-1:-1;;;44630:81:0;;15519:2:1;44630:81:0::1;::::0;::::1;15501:21:1::0;15558:2;15538:18;;;15531:30;15597:34;15577:18;;;15570:62;-1:-1:-1;;;15648:18:1;;;15641:35;15693:19;;44630:81:0::1;15317:401:1::0;44630:81:0::1;44788:7;44776;44761:12;;:22;;;;:::i;:::-;44760:36;;;;:::i;:::-;44726:19;:70:::0;;;44816:47:::1;::::0;1731:25:1;;;44816:47:0::1;::::0;1719:2:1;1704:18;44816:47:0::1;;;;;;;;54871:193:::0;54695:376;;:::o;44601:543::-:1;44915:1;44904:7;:12;;:30;;;;;44931:3;44920:7;:14;;44904:30;44896:74;;;::::0;-1:-1:-1;;;44896:74:0;;15925:2:1;44896:74:0::1;::::0;::::1;15907:21:1::0;15964:2;15944:18;;;15937:30;16003:33;15983:18;;;15976:61;16054:18;;44896:74:0::1;15723:355:1::0;44896:74:0::1;45050:7;45039;45024:12;;:22;;;;:::i;:::-;45023:34;;;;:::i;:::-;44985:35:::0;:72;;;45077:55:::1;::::0;1731:25:1;;;45077:55:0::1;::::0;1704:18:1;45077:55:0::1;1585:177:1::0;21397:151:0;-1:-1:-1;;;;;21513:18:0;;;21486:7;21513:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21397:151::o;43122:487::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43203:22:0;::::1;43195:105;;;::::0;-1:-1:-1;;;43195:105:0;;16285:2:1;43195:105:0::1;::::0;::::1;16267:21:1::0;16324:2;16304:18;;;16297:30;16363:34;16343:18;;;16336:62;16434:34;16414:18;;;16407:62;-1:-1:-1;;;16485:19:1;;;16478:37;16532:19;;43195:105:0::1;16083:474:1::0;43195:105:0::1;43337:5;::::0;43316:37:::1;::::0;;-1:-1:-1;;;;;43337:5:0;;::::1;16774:34:1::0;;16844:15;;;16839:2;16824:18;;16817:43;43316:37:0::1;::::0;16709:18:1;43316:37:0::1;;;;;;;43379:5;::::0;-1:-1:-1;;;;;43379:5:0::1;43388:1;20909:18:::0;;;;;;;;;;;43369:20;43366:74:::1;;43406:5;::::0;-1:-1:-1;;;;;43406:5:0::1;20882:7:::0;20909:18;;;;;;;;;;;43391:49:::1;::::0;43406:5;43413:8;;54992:14;:60::i;43391:49::-:1;43472:5;::::0;43451:55:::1;::::0;-1:-1:-1;;;;;43472:5:0::1;;::::0;;;43451:20:::1;:55::i;:::-;43517;43538:8;43548:4;43554::::0;43560::::1;43566:5;43517:20;:55::i;:::-;43585:5;:16:::0;;-1:-1:-1;;;;;;43585:16:0::1;-1:-1:-1::0;;;;;43585:16:0;;;::::1;::::0;;;::::1;::::0;;43122:487::o;47261:153::-;54417:5;;-1:-1:-1;;;;;54417:5:0;40272:10;54406:16;40256:53;;;;-1:-1:-1;;;40256:53:0;;;;;;;:::i;:::-;47350:7:::1;:16:::0;::::1;-1:-1:-1::0;;;47350:16:0;;::::1;::::0;::::1;47337:29:::0;;::::1;;;47329:38;;;::::0;::::1;;47378:7;:28:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;47378:28:0::1;-1:-1:-1::0;;47378:28:0;;::::1;::::0;;;::::1;::::0;;47261:153::o;28121:380::-;-1:-1:-1;;;;;28257:19:0;;28249:68;;;;-1:-1:-1;;;28249:68:0;;17073:2:1;28249:68:0;;;17055:21:1;17112:2;17092:18;;;17085:30;17151:34;17131:18;;;17124:62;-1:-1:-1;;;17202:18:1;;;17195:34;17246:19;;28249:68:0;16871:400:1;28249:68:0;-1:-1:-1;;;;;28336:21:0;;28328:68;;;;-1:-1:-1;;;28328:68:0;;17478:2:1;28328:68:0;;;17460:21:1;17517:2;17497:18;;;17490:30;17556:34;17536:18;;;17529:62;-1:-1:-1;;;17607:18:1;;;17600:32;17649:19;;28328:68:0;17276:398:1;28328:68:0;-1:-1:-1;;;;;28409:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;28461:32;;1731:25:1;;;28461:32:0;;1704:18:1;28461:32:0;;;;;;;28121:380;;;:::o;28792:453::-;28927:24;28954:25;28964:5;28971:7;28954:9;:25::i;:::-;28927:52;;-1:-1:-1;;28994:16:0;:37;28990:248;;29076:6;29056:16;:26;;29048:68;;;;-1:-1:-1;;;29048:68:0;;17881:2:1;29048:68:0;;;17863:21:1;17920:2;17900:18;;;17893:30;17959:31;17939:18;;;17932:59;18008:18;;29048:68:0;17679:353:1;29048:68:0;29160:51;29169:5;29176:7;29204:6;29185:16;:25;29160:8;:51::i;:::-;28916:329;28792:453;;;:::o;48649:1490::-;48744:11;;;;48740:145;;54417:5;;-1:-1:-1;;;;;54406:16:0;;;54417:5;;54406:16;48772:47;;;;-1:-1:-1;;;48772:47:0;;18239:2:1;48772:47:0;;;18221:21:1;18278:2;18258:18;;;18251:30;-1:-1:-1;;;18297:18:1;;;18290:51;18358:18;;48772:47:0;18037:345:1;48772:47:0;48859:4;;-1:-1:-1;;;;;48859:4:0;;;48853:10;;;;48850:23;;48865:8;:6;:8::i;:::-;48898:16;48905:4;48911:2;48898:6;:16::i;:::-;:31;;;;-1:-1:-1;48918:11:0;;;;48898:31;:63;;;;-1:-1:-1;48933:28:0;;;;48898:63;48895:1023;;;-1:-1:-1;;;;;48981:21:0;;;;;;:17;:21;;;;;;;;48977:366;;49040:19;:31;49030:41;;;;;:106;;-1:-1:-1;49101:35:0;;49091:6;49075:13;49085:2;-1:-1:-1;;;;;20909:18:0;20882:7;20909:18;;;;;;;;;;;;20808:127;49075:13;:22;;;;:::i;:::-;:61;;49030:106;49022:157;;;;-1:-1:-1;;;49022:157:0;;;;;;;:::i;:::-;48977:366;;;-1:-1:-1;;;;;49204:11:0;;;;;;:7;:11;;;;;;;;49201:142;;;49253:19;:31;49243:41;;;49235:92;;;;-1:-1:-1;;;49235:92:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49361:13:0;;;;;;:7;:13;;;;;;;;:38;;;;-1:-1:-1;;;;;;49379:20:0;;;;;;:16;:20;;;;;;;;49378:21;49361:38;:73;;;;-1:-1:-1;49403:12:0;:31;;;49361:73;49357:549;;;-1:-1:-1;;;;;49463:12:0;;;;;;:8;:12;;;;;;49478:15;-1:-1:-1;49455:85:0;;;;-1:-1:-1;;;49455:85:0;;18996:2:1;49455:85:0;;;18978:21:1;19035:2;19015:18;;;19008:30;19074:34;19054:18;;;19047:62;-1:-1:-1;;;19125:18:1;;;19118:40;19175:19;;49455:85:0;18794:406:1;49455:85:0;49593:12;:25;49574:45;;49593:25;;;;;49574:15;:45;:::i;:::-;-1:-1:-1;;;;;49559:12:0;;;;;;:8;:12;;;;;:60;49357:549;;;-1:-1:-1;;;;;49646:22:0;;;;;;:16;:22;;;;;;;;49645:23;:59;;;;-1:-1:-1;49672:12:0;:32;;;;;;49645:59;49641:265;;;-1:-1:-1;;;;;49732:14:0;;;;;;:8;:14;;;;;;49750:15;-1:-1:-1;49732:33:0;49724:85;;;;-1:-1:-1;;;49724:85:0;;19407:2:1;49724:85:0;;;19389:21:1;19446:2;19426:18;;;19419:30;19485:34;19465:18;;;19458:62;-1:-1:-1;;;19536:18:1;;;19529:37;19583:19;;49724:85:0;19205:403:1;49724:85:0;49864:12;:25;49845:45;;49864:25;;;;;49845:15;:45;:::i;:::-;-1:-1:-1;;;;;49828:14:0;;;;;;:8;:14;;;;;:62;49641:265;49932:16;:14;:16::i;:::-;49928:59;;;49965:10;:8;:10::i;:::-;49999:22;50024:19;50038:4;50024:13;:19::i;:::-;:56;;50074:6;50024:56;;;50046:25;50054:4;50060:2;50064:6;50046:7;:25::i;:::-;49999:81;;50091:40;50106:4;50112:2;50116:14;50091;:40::i;27008:675::-;-1:-1:-1;;;;;27092:21:0;;27084:67;;;;-1:-1:-1;;;27084:67:0;;19815:2:1;27084:67:0;;;19797:21:1;19854:2;19834:18;;;19827:30;19893:34;19873:18;;;19866:62;-1:-1:-1;;;19944:18:1;;;19937:31;19985:19;;27084:67:0;19613:397:1;27084:67:0;-1:-1:-1;;;;;27251:18:0;;27226:22;27251:18;;;;;;;;;;;27288:24;;;;27280:71;;;;-1:-1:-1;;;27280:71:0;;20217:2:1;27280:71:0;;;20199:21:1;20256:2;20236:18;;;20229:30;20295:34;20275:18;;;20268:62;-1:-1:-1;;;20346:18:1;;;20339:32;20388:19;;27280:71:0;20015:398:1;27280:71:0;-1:-1:-1;;;;;27387:18:0;;:9;:18;;;;;;;;;;;27408:23;;;27387:44;;27526:12;:22;;;;;;;27577:37;1731:25:1;;;27387:9:0;;:18;27577:37;;1704:18:1;27577:37:0;;;;;;;54871:193;54695:376;;:::o;50147:127::-;50233:33;50249:4;50255:2;50259:6;50233:15;:33::i;46126:90::-;46164:11;:18;;-1:-1:-1;;46164:18:0;46178:4;46164:18;;;46198:10;;;;46164:11;;46198:10;46126:90::o;48329:312::-;48393:4;48418:13;48426:4;54417:5;;-1:-1:-1;;;;;54406:16:0;;;54417:5;;54406:16;;54327:103;48418:13;48417:14;:43;;;;-1:-1:-1;54417:5:0;;-1:-1:-1;;;;;54406:16:0;;;54417:5;;54406:16;48448:12;48417:43;:78;;;;-1:-1:-1;48490:5:0;;-1:-1:-1;;;;;48490:5:0;48477:9;:18;;48417:78;:110;;;;-1:-1:-1;;;;;;48513:14:0;;;;;;:8;:14;;;;;;;;48512:15;48417:110;:140;;;;-1:-1:-1;;;;;;48545:12:0;;;;;;:8;:12;;;;;;;;48544:13;48417:140;:178;;;;-1:-1:-1;;;;;;48574:21:0;;48588:6;48574:21;;48417:178;:216;;;;-1:-1:-1;;;;;;48612:21:0;;48628:4;48612:21;;48410:223;48329:312;-1:-1:-1;;;48329:312:0:o;51309:377::-;294:10;51358:4;51396:21;;;:7;:21;;;;;;;;51395:22;:64;;;;-1:-1:-1;51435:24:0;;;;;;;51434:25;51395:64;:110;;;;-1:-1:-1;51476:29:0;;;;;;;51395:110;:205;;;;-1:-1:-1;51570:30:0;;51541:26;;:59;;51570:30;;;51541:59;:::i;:::-;51522:15;:78;;51395:205;:283;;;;-1:-1:-1;51645:33:0;;51635:4;51617:9;:24;;;;;;;;;;;:61;;51395:283;51375:303;;51309:377;:::o;51695:1802::-;40366:24;:31;;-1:-1:-1;;40366:31:0;;;;;51773:15:::1;51744:26:::0;:44;51848:33;;40366:17;51803:41;:78:::1;::::0;::::1;::::0;:118:::1;;-1:-1:-1::0;51885:36:0;;-1:-1:-1;;;51885:36:0;::::1;;;51803:118;51799:1691;;;51983:33:::0;;:17:::1;51938:78:::0;;:41:::1;::::0;:78:::1;::::0;51983:33;;51938:78:::1;:::i;:::-;::::0;;;-1:-1:-1;;52057:33:0;;52031:23:::1;::::0;52057:37:::1;::::0;52093:1:::1;::::0;52057:37:::1;:::i;:::-;52135:16;::::0;;52149:1:::1;52135:16:::0;;;;;::::1;::::0;;52031:63;;-1:-1:-1;52111:21:0::1;::::0;52135:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;52135:16:0::1;52111:40;;52184:4;52166;52171:1;52166:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52166:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;52214:6:::1;::::0;:13:::1;::::0;;-1:-1:-1;;;52214:13:0;;;;:6;;;::::1;::::0;:11:::1;::::0;:13:::1;::::0;;::::1;::::0;52166:7;;52214:13;;;;;:6;:13:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52204:4;52209:1;52204:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52204:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;52306:6:::1;::::0;:215:::1;::::0;-1:-1:-1;;;52306:215:0;;52268:21:::1;::::0;52306:6;;;::::1;::::0;:57:::1;::::0;:215:::1;::::0;52382:15;;52244:21:::1;::::0;52436:4;;52467::::1;::::0;52491:15:::1;::::0;52306:215:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;52538:17;52583:13;52558:21;:39;;;;:::i;:::-;52614:6;::::0;52779:21:::1;::::0;52614:235:::1;::::0;-1:-1:-1;;;52614:235:0;;52681:4:::1;52614:235;::::0;::::1;22000:34:1::0;22050:18;;;22043:34;;;52614:6:0::1;22093:18:1::0;;;22086:34;;;22136:18;;;22129:34;-1:-1:-1;;;;;52779:21:0;;::::1;22179:19:1::0;;;22172:44;52819:15:0::1;22232:19:1::0;;;22225:35;52538:59:0;;-1:-1:-1;52614:6:0::1;::::0;:22:::1;::::0;52538:59;;21934:19:1;;52614:235:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;51923:940;;;;51799:1691;;;52908:16;::::0;;52922:1:::1;52908:16:::0;;;;;::::1;::::0;;52884:21:::1;::::0;52908:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;52908:16:0::1;52884:40;;52957:4;52939;52944:1;52939:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52939:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;52987:6:::1;::::0;:13:::1;::::0;;-1:-1:-1;;;52987:13:0;;;;:6;;;::::1;::::0;:11:::1;::::0;:13:::1;::::0;;::::1;::::0;52939:7;;52987:13;;;;;:6;:13:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52977:4;52982:1;52977:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52977:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;53017:6:::1;::::0;53093:33;;53017:233:::1;::::0;-1:-1:-1;;;53017:233:0;;:6;;;::::1;::::0;:57:::1;::::0;:233:::1;::::0;53093:33;53017:6:::1;::::0;53165:4;;53196::::1;::::0;53220:15:::1;::::0;53017:233:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;53349:19:0::1;::::0;53341:66:::1;::::0;53283:21:::1;::::0;-1:-1:-1;53265:15:0::1;::::0;-1:-1:-1;;;;;;53349:19:0;;::::1;::::0;53397:5:::1;::::0;53283:21;;53265:15;53341:66;53265:15;53341:66;53283:21;53349:19;53397:5;53341:66:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53321:86;;;53425:8;53422:54;;;53469:7;53435:17;:30;;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;53422:54:0::1;52869:621;;;51799:1691;40420:24:::0;:32;;-1:-1:-1;;40420:32:0;;;51695:1802::o;50282:147::-;50368:29;;50344:4;;50368:29;;;;;:53;;;;-1:-1:-1;;;;;;;50402:19:0;;;;;:11;:19;;;;;;;;50401:20;;50282:147::o;50437:864::-;-1:-1:-1;;;;;50546:21:0;;50522:7;50546:21;;;:11;:21;;;;;;;;50542:67;;;-1:-1:-1;50591:6:0;50584:13;;50542:67;-1:-1:-1;;;;;50622:17:0;;;;;;:7;:17;;;;;;;;50619:242;;;50679:8;:17;-1:-1:-1;;;50679:17:0;;;;50668:8;:28;50619:242;;;-1:-1:-1;;;;;50726:15:0;;;;;;:7;:15;;;;;;;;50723:138;;;50768:7;:16;-1:-1:-1;;;50768:16:0;;;;50757:8;:27;50723:138;;;50828:12;:21;-1:-1:-1;;;50828:21:0;;;;50817:8;:32;50723:138;50907:14;;50895:8;;50886:17;;:6;:17;:::i;:::-;50885:36;;;;:::i;:::-;50873:9;:48;50936:36;;-1:-1:-1;;;50936:36:0;;;;50932:266;;;51163:8;:21;51140:7;:20;:44;;51163:21;;;;;51140:20;:44;:::i;:::-;51118:8;:17;51099:7;:16;:36;;51118:17;-1:-1:-1;;;51118:17:0;;;;;;;51099:16;;;;;:36;:::i;:::-;51098:87;;;;:::i;:::-;51071:8;:21;51048:7;:20;51034:152;;;;;51048:44;;51071:21;;;51048:20;:44;:::i;:::-;51035:58;;:9;;:58;;;;:::i;:::-;51034:152;;;;:::i;:::-;50989:17;:197;;:41;;:197;;;;;:::i;:::-;;;;-1:-1:-1;;50932:266:0;51208:48;51223:6;51239:4;51246:9;;51208:14;:48::i;:::-;51284:9;;51275:18;;:6;:18;:::i;25000:840::-;-1:-1:-1;;;;;25131:18:0;;25123:68;;;;-1:-1:-1;;;25123:68:0;;22994:2:1;25123:68:0;;;22976:21:1;23033:2;23013:18;;;23006:30;23072:34;23052:18;;;23045:62;-1:-1:-1;;;23123:18:1;;;23116:35;23168:19;;25123:68:0;22792:401:1;25123:68:0;-1:-1:-1;;;;;25210:16:0;;25202:64;;;;-1:-1:-1;;;25202:64:0;;23400:2:1;25202:64:0;;;23382:21:1;23439:2;23419:18;;;23412:30;23478:34;23458:18;;;23451:62;-1:-1:-1;;;23529:18:1;;;23522:33;23572:19;;25202:64:0;23198:399:1;25202:64:0;-1:-1:-1;;;;;25352:15:0;;25330:19;25352:15;;;;;;;;;;;25386:21;;;;25378:72;;;;-1:-1:-1;;;25378:72:0;;23804:2:1;25378:72:0;;;23786:21:1;23843:2;23823:18;;;23816:30;23882:34;23862:18;;;23855:62;-1:-1:-1;;;23933:18:1;;;23926:36;23979:19;;25378:72:0;23602:402:1;25378:72:0;-1:-1:-1;;;;;25486:15:0;;;:9;:15;;;;;;;;;;;25504:20;;;25486:38;;25704:13;;;;;;;;;;:23;;;;;;25756:26;;1731:25:1;;;25704:13:0;;25756:26;;1704:18:1;25756:26:0;;;;;;;25795:37;54695:376;384:548:1;496:4;525:2;554;543:9;536:21;586:6;580:13;629:6;624:2;613:9;609:18;602:34;654:1;664:140;678:6;675:1;672:13;664:140;;;773:14;;;769:23;;763:30;739:17;;;758:2;735:26;728:66;693:10;;664:140;;;668:3;853:1;848:2;839:6;828:9;824:22;820:31;813:42;923:2;916;912:7;907:2;899:6;895:15;891:29;880:9;876:45;872:54;864:62;;;;384:548;;;;:::o;937:131::-;-1:-1:-1;;;;;1012:31:1;;1002:42;;992:70;;1058:1;1055;1048:12;992:70;937:131;:::o;1073:315::-;1141:6;1149;1202:2;1190:9;1181:7;1177:23;1173:32;1170:52;;;1218:1;1215;1208:12;1170:52;1257:9;1244:23;1276:31;1301:5;1276:31;:::i;:::-;1326:5;1378:2;1363:18;;;;1350:32;;-1:-1:-1;;;1073:315:1:o;1767:180::-;1826:6;1879:2;1867:9;1858:7;1854:23;1850:32;1847:52;;;1895:1;1892;1885:12;1847:52;-1:-1:-1;1918:23:1;;1767:180;-1:-1:-1;1767:180:1:o;1952:456::-;2029:6;2037;2045;2098:2;2086:9;2077:7;2073:23;2069:32;2066:52;;;2114:1;2111;2104:12;2066:52;2153:9;2140:23;2172:31;2197:5;2172:31;:::i;:::-;2222:5;-1:-1:-1;2279:2:1;2264:18;;2251:32;2292:33;2251:32;2292:33;:::i;:::-;1952:456;;2344:7;;-1:-1:-1;;;2398:2:1;2383:18;;;;2370:32;;1952:456::o;2621:159::-;2688:20;;2748:6;2737:18;;2727:29;;2717:57;;2770:1;2767;2760:12;2717:57;2621:159;;;:::o;2785:256::-;2851:6;2859;2912:2;2900:9;2891:7;2887:23;2883:32;2880:52;;;2928:1;2925;2918:12;2880:52;2951:28;2969:9;2951:28;:::i;:::-;2941:38;;2998:37;3031:2;3020:9;3016:18;2998:37;:::i;:::-;2988:47;;2785:256;;;;;:::o;3046:247::-;3105:6;3158:2;3146:9;3137:7;3133:23;3129:32;3126:52;;;3174:1;3171;3164:12;3126:52;3213:9;3200:23;3232:31;3257:5;3232:31;:::i;3487:118::-;3573:5;3566:13;3559:21;3552:5;3549:32;3539:60;;3595:1;3592;3585:12;3610:156;3676:20;;3736:4;3725:16;;3715:27;;3705:55;;3756:1;3753;3746:12;3771:446;3840:6;3848;3856;3909:2;3897:9;3888:7;3884:23;3880:32;3877:52;;;3925:1;3922;3915:12;3877:52;3964:9;3951:23;3983:28;4005:5;3983:28;:::i;:::-;4030:5;-1:-1:-1;4087:2:1;4072:18;;4059:32;4100:30;4059:32;4100:30;:::i;:::-;4149:7;-1:-1:-1;4175:36:1;4207:2;4192:18;;4175:36;:::i;:::-;4165:46;;3771:446;;;;;:::o;4222:127::-;4283:10;4278:3;4274:20;4271:1;4264:31;4314:4;4311:1;4304:15;4338:4;4335:1;4328:15;4354:275;4425:2;4419:9;4490:2;4471:13;;-1:-1:-1;;4467:27:1;4455:40;;4525:18;4510:34;;4546:22;;;4507:62;4504:88;;;4572:18;;:::i;:::-;4608:2;4601:22;4354:275;;-1:-1:-1;4354:275:1:o;4634:183::-;4694:4;4727:18;4719:6;4716:30;4713:56;;;4749:18;;:::i;:::-;-1:-1:-1;4794:1:1;4790:14;4806:4;4786:25;;4634:183::o;4822:662::-;4876:5;4929:3;4922:4;4914:6;4910:17;4906:27;4896:55;;4947:1;4944;4937:12;4896:55;4983:6;4970:20;5009:4;5033:60;5049:43;5089:2;5049:43;:::i;:::-;5033:60;:::i;:::-;5127:15;;;5213:1;5209:10;;;;5197:23;;5193:32;;;5158:12;;;;5237:15;;;5234:35;;;5265:1;5262;5255:12;5234:35;5301:2;5293:6;5289:15;5313:142;5329:6;5324:3;5321:15;5313:142;;;5395:17;;5383:30;;5433:12;;;;5346;;5313:142;;;-1:-1:-1;5473:5:1;4822:662;-1:-1:-1;;;;;;4822:662:1:o;5489:1215::-;5607:6;5615;5668:2;5656:9;5647:7;5643:23;5639:32;5636:52;;;5684:1;5681;5674:12;5636:52;5724:9;5711:23;5753:18;5794:2;5786:6;5783:14;5780:34;;;5810:1;5807;5800:12;5780:34;5848:6;5837:9;5833:22;5823:32;;5893:7;5886:4;5882:2;5878:13;5874:27;5864:55;;5915:1;5912;5905:12;5864:55;5951:2;5938:16;5973:4;5997:60;6013:43;6053:2;6013:43;:::i;5997:60::-;6091:15;;;6173:1;6169:10;;;;6161:19;;6157:28;;;6122:12;;;;6197:19;;;6194:39;;;6229:1;6226;6219:12;6194:39;6253:11;;;;6273:217;6289:6;6284:3;6281:15;6273:217;;;6369:3;6356:17;6386:31;6411:5;6386:31;:::i;:::-;6430:18;;6306:12;;;;6468;;;;6273:217;;;6509:5;-1:-1:-1;;6552:18:1;;6539:32;;-1:-1:-1;;6583:16:1;;;6580:36;;;6612:1;6609;6602:12;6580:36;;6635:63;6690:7;6679:8;6668:9;6664:24;6635:63;:::i;:::-;6625:73;;;5489:1215;;;;;:::o;7043:241::-;7099:6;7152:2;7140:9;7131:7;7127:23;7123:32;7120:52;;;7168:1;7165;7158:12;7120:52;7207:9;7194:23;7226:28;7248:5;7226:28;:::i;7289:789::-;7372:6;7380;7388;7396;7404;7457:3;7445:9;7436:7;7432:23;7428:33;7425:53;;;7474:1;7471;7464:12;7425:53;7513:9;7500:23;7532:31;7557:5;7532:31;:::i;:::-;7582:5;-1:-1:-1;7639:2:1;7624:18;;7611:32;7652:30;7611:32;7652:30;:::i;:::-;7701:7;-1:-1:-1;7760:2:1;7745:18;;7732:32;7773:30;7732:32;7773:30;:::i;:::-;7822:7;-1:-1:-1;7881:2:1;7866:18;;7853:32;7894:30;7853:32;7894:30;:::i;:::-;7943:7;-1:-1:-1;8002:3:1;7987:19;;7974:33;8016:30;7974:33;8016:30;:::i;:::-;8065:7;8055:17;;;7289:789;;;;;;;;:::o;8083:382::-;8148:6;8156;8209:2;8197:9;8188:7;8184:23;8180:32;8177:52;;;8225:1;8222;8215:12;8177:52;8264:9;8251:23;8283:31;8308:5;8283:31;:::i;:::-;8333:5;-1:-1:-1;8390:2:1;8375:18;;8362:32;8403:30;8362:32;8403:30;:::i;:::-;8452:7;8442:17;;;8083:382;;;;;:::o;8900:515::-;8978:6;8986;8994;9002;9055:3;9043:9;9034:7;9030:23;9026:33;9023:53;;;9072:1;9069;9062:12;9023:53;9111:9;9098:23;9130:28;9152:5;9130:28;:::i;:::-;9177:5;-1:-1:-1;9234:2:1;9219:18;;9206:32;9247:30;9206:32;9247:30;:::i;:::-;9296:7;-1:-1:-1;9322:36:1;9354:2;9339:18;;9322:36;:::i;:::-;8900:515;;;;-1:-1:-1;9312:46:1;;9405:2;9390:18;9377:32;;-1:-1:-1;;8900:515:1:o;9420:388::-;9488:6;9496;9549:2;9537:9;9528:7;9524:23;9520:32;9517:52;;;9565:1;9562;9555:12;9517:52;9604:9;9591:23;9623:31;9648:5;9623:31;:::i;:::-;9673:5;-1:-1:-1;9730:2:1;9715:18;;9702:32;9743:33;9702:32;9743:33;:::i;10616:377::-;10690:6;10698;10706;10759:2;10747:9;10738:7;10734:23;10730:32;10727:52;;;10775:1;10772;10765:12;10727:52;10811:9;10798:23;10788:33;;10868:2;10857:9;10853:18;10840:32;10830:42;;10922:2;10911:9;10907:18;10894:32;10935:28;10957:5;10935:28;:::i;:::-;10982:5;10972:15;;;10616:377;;;;;:::o;11233:184::-;11291:6;11344:2;11332:9;11323:7;11319:23;11315:32;11312:52;;;11360:1;11357;11350:12;11312:52;11383:28;11401:9;11383:28;:::i;11422:380::-;11501:1;11497:12;;;;11544;;;11565:61;;11619:4;11611:6;11607:17;11597:27;;11565:61;11672:2;11664:6;11661:14;11641:18;11638:38;11635:161;;11718:10;11713:3;11709:20;11706:1;11699:31;11753:4;11750:1;11743:15;11781:4;11778:1;11771:15;11635:161;;11422:380;;;:::o;11807:345::-;12009:2;11991:21;;;12048:2;12028:18;;;12021:30;-1:-1:-1;;;12082:2:1;12067:18;;12060:51;12143:2;12128:18;;11807:345::o;12157:127::-;12218:10;12213:3;12209:20;12206:1;12199:31;12249:4;12246:1;12239:15;12273:4;12270:1;12263:15;12289:168;12329:7;12395:1;12391;12387:6;12383:14;12380:1;12377:21;12372:1;12365:9;12358:17;12354:45;12351:71;;;12402:18;;:::i;:::-;-1:-1:-1;12442:9:1;;12289:168::o;12462:217::-;12502:1;12528;12518:132;;12572:10;12567:3;12563:20;12560:1;12553:31;12607:4;12604:1;12597:15;12635:4;12632:1;12625:15;12518:132;-1:-1:-1;12664:9:1;;12462:217::o;12684:125::-;12749:9;;;12770:10;;;12767:36;;;12783:18;;:::i;12814:168::-;12881:6;12907:10;;;12919;;;12903:27;;12942:11;;;12939:37;;;12956:18;;:::i;:::-;12939:37;12814:168;;;;:::o;12987:128::-;13054:9;;;13075:11;;;13072:37;;;13089:18;;:::i;13881:127::-;13942:10;13937:3;13933:20;13930:1;13923:31;13973:4;13970:1;13963:15;13997:4;13994:1;13987:15;14013:175;14050:3;14094:4;14087:5;14083:16;14123:4;14114:7;14111:17;14108:43;;14131:18;;:::i;:::-;14180:1;14167:15;;14013:175;-1:-1:-1;;14013:175:1:o;14599:184::-;14669:6;14722:2;14710:9;14701:7;14697:23;14693:32;14690:52;;;14738:1;14735;14728:12;14690:52;-1:-1:-1;14761:16:1;;14599:184;-1:-1:-1;14599:184:1:o;15067:245::-;15134:6;15187:2;15175:9;15166:7;15162:23;15158:32;15155:52;;;15203:1;15200;15193:12;15155:52;15235:9;15229:16;15254:28;15276:5;15254:28;:::i;18387:402::-;18589:2;18571:21;;;18628:2;18608:18;;;18601:30;18667:34;18662:2;18647:18;;18640:62;-1:-1:-1;;;18733:2:1;18718:18;;18711:36;18779:3;18764:19;;18387:402::o;20418:251::-;20488:6;20541:2;20529:9;20520:7;20516:23;20512:32;20509:52;;;20557:1;20554;20547:12;20509:52;20589:9;20583:16;20608:31;20633:5;20608:31;:::i;20674:980::-;20936:4;20984:3;20973:9;20969:19;21015:6;21004:9;20997:25;21041:2;21079:6;21074:2;21063:9;21059:18;21052:34;21122:3;21117:2;21106:9;21102:18;21095:31;21146:6;21181;21175:13;21212:6;21204;21197:22;21250:3;21239:9;21235:19;21228:26;;21289:2;21281:6;21277:15;21263:29;;21310:1;21320:195;21334:6;21331:1;21328:13;21320:195;;;21399:13;;-1:-1:-1;;;;;21395:39:1;21383:52;;21490:15;;;;21455:12;;;;21431:1;21349:9;21320:195;;;-1:-1:-1;;;;;;;21571:32:1;;;;21566:2;21551:18;;21544:60;-1:-1:-1;;;21635:3:1;21620:19;21613:35;21532:3;20674:980;-1:-1:-1;;;20674:980:1:o;22271:306::-;22359:6;22367;22375;22428:2;22416:9;22407:7;22403:23;22399:32;22396:52;;;22444:1;22441;22434:12;22396:52;22473:9;22467:16;22457:26;;22523:2;22512:9;22508:18;22502:25;22492:35;;22567:2;22556:9;22552:18;22546:25;22536:35;;22271:306;;;;;:::o

Swarm Source

ipfs://ee8e338cb8cc447fef5e9182012c47c59d48f9efa014a0d5fd90403314efba70
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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