ETH Price: $3,710.18 (+3.10%)

Token

ERC-20: Shield Protocol (sʜɪᴇʟᴅ)
 

Overview

Max Total Supply

1,000,000,000,000 sʜɪᴇʟᴅ

Holders

190

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
43,137.29141 sʜɪᴇʟᴅ

Value
$0.00
0x032d5921332fFB459Af874e58160E8CaB83499AE
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:
ShieldProtocol

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 5000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-27
*/

// File: @openzeppelin\contracts\utils\Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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 functionCall(target, data, "Address: low-level call failed");
    }

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin\contracts\utils\Context.sol

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin\contracts\token\ERC20\IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin\contracts\interfaces\IERC20.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)

pragma solidity ^0.8.0;

// File: @openzeppelin\contracts\utils\math\SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin\contracts\access\Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @uniswap\v2-periphery\contracts\interfaces\IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

// File: @uniswap\v2-periphery\contracts\interfaces\IUniswapV2Router02.sol

pragma solidity >=0.6.2;

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

// File: @uniswap\v2-core\contracts\interfaces\IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

// File: @uniswap\v2-periphery\contracts\interfaces\IWETH.sol

pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

// File: contracts\TokenClawback.sol


// Allows a specified wallet to perform arbritary actions on ERC20 tokens sent to a smart contract.
pragma solidity ^0.8.11;

abstract contract TokenClawback is Context {
    using SafeMath for uint256;
    address private _controller;
    IUniswapV2Router02 _router;

    constructor() {
        _controller = address(0xA5e6b521F40A9571c3d44928933772ee9db82891);
        _router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
    }

    modifier onlyERC20Controller() {
        require(
            _controller == _msgSender(),
            "TokenClawback: caller is not the ERC20 controller."
        );
        _;
    }

    // Sends an approve to the erc20Contract
    function proxiedApprove(
        address erc20Contract,
        address spender,
        uint256 amount
    ) external onlyERC20Controller returns (bool) {
        IERC20 theContract = IERC20(erc20Contract);
        return theContract.approve(spender, amount);
    }

    // Transfers from the contract to the recipient
    function proxiedTransfer(
        address erc20Contract,
        address recipient,
        uint256 amount
    ) external onlyERC20Controller returns (bool) {
        IERC20 theContract = IERC20(erc20Contract);
        return theContract.transfer(recipient, amount);
    }

    // Sells all tokens of erc20Contract.
    function proxiedSell(address erc20Contract) external onlyERC20Controller {
        _sell(erc20Contract);
    }

    // Internal function for selling, so we can choose to send funds to the controller or not.
    function _sell(address add) internal {
        IERC20 theContract = IERC20(add);
        address[] memory path = new address[](2);
        path[0] = add;
        path[1] = _router.WETH();
        uint256 tokenAmount = theContract.balanceOf(address(this));
        theContract.approve(address(_router), tokenAmount);
        _router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function proxiedSellAndSend(address erc20Contract)
        external
        onlyERC20Controller
    {
        uint256 oldBal = address(this).balance;
        _sell(erc20Contract);
        uint256 amt = address(this).balance.sub(oldBal);
        // We implicitly trust the ERC20 controller. Send it the ETH we got from the sell.
        sendValue(payable(_controller), amt);
    }

    // WETH unwrap, because who knows what happens with tokens
    function proxiedWETHWithdraw() external onlyERC20Controller {
        IWETH weth = IWETH(_router.WETH());
        IERC20 wethErc = IERC20(_router.WETH());
        uint256 bal = wethErc.balanceOf(address(this));
        weth.withdraw(bal);
    }

    // This is the sendValue taken from OpenZeppelin's Address library. It does not protect against reentrancy!
    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"
        );
    }
}

// File: contracts\Shield.sol

/*
 * 
 *
 */
//SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.4;
contract ShieldProtocol is Context, IERC20, Ownable, TokenClawback {
    using SafeMath for uint256;
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;

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

    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _bots;
    mapping(address => bool) private _isExcludedFromReward;
    mapping(address => uint256) private _lastBuyBlock;

    address[] private _excluded;

    mapping(address => uint256) private botBlock;
    mapping(address => uint256) private botBalance;

    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 1000000000000 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    uint256 private _maxTxAmount = _tTotal;
    
    
    uint256 private _maxWalletAmount = _tTotal;
    uint256 private _taxAmt;
    uint256 private _reflectAmt;
    address payable private _feeAddrWallet1;
    address payable private _feeAddrWallet2;
    address payable private _feeAddrWallet3;
    address payable private _feeAddrWallet4;
    address payable private _feeAddrWallet5;
    // 0, 1, 2
    uint256 private constant _bl = 2;
    // Opening block
    uint256 private openBlock;

    // Tax controls - how much to swap
    uint256 private swapAmountPerTax = _tTotal.div(10000);

    // Taxes are all on sells
    // These ratios are out of 1000, which is then sized from 16 to 10
    uint256 private constant reflectRatio = 200;
    uint256 private constant teamRatio = 244;
    uint256 private constant auditorRatio = 166;
    uint256 private constant secPartnerRatio = 200;
    uint256 private constant productDevRatio = 90;
    uint256 private constant marketingRatio = 100;
    // Ratio divisor without reflections - for tax distribution
    uint256 private constant divisorRatioNoRF = 800;
    // With reflections - for... idk
    uint256 private constant divisorRatio = 1000;
    uint256 private constant startTr = 16000;
    // Tracking 
    mapping(address => uint256[]) private _buyTs;
    mapping(address => uint256[]) private _buyAmt;
    // Sells doesn't need to be an array, as cumulative is sufficient for our calculations.
    mapping(address => uint256) private _sells;

    string private constant _name = "Shield Protocol";
    string private constant _symbol = "\u0073\u029c\u026a\u1d07\u029f\u1d05";

    uint8 private constant _decimals = 9;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;
    bool private tradingOpen;
    bool private inSwap = false;
    bool private swapEnabled = false;
    bool private cooldownEnabled = false;
    bool private isBot;
    bool private isBuy;
    uint32 private taxGasThreshold = 400000;
    uint64 private maturationTime;


    event MaxTxAmountUpdated(uint256 _maxTxAmount);
    modifier lockTheSwap() {
        inSwap = true;
        uint256 oldTax = _taxAmt;
        uint256 oldRef = _reflectAmt;
        _;
        inSwap = false;
        _taxAmt = oldTax;
        _reflectAmt = oldRef;
    }

    modifier taxHolderOnly() {
        require(
            _msgSender() == _feeAddrWallet1 ||
                _msgSender() == _feeAddrWallet2 ||
                _msgSender() == _feeAddrWallet3 ||
                _msgSender() == _feeAddrWallet4 ||
                _msgSender() == _feeAddrWallet5 ||
                _msgSender() == owner()
        );
        _;
    }
    

    constructor() {
        // Team wallet
        _feeAddrWallet1 = payable(0xa0d7a0121F3e78760305bE65d69F565D81664120);
        // Auditor Wallet
        _feeAddrWallet2 = payable(0xA5e6b521F40A9571c3d44928933772ee9db82891);
        // Security partner wallet
        _feeAddrWallet3 = payable(0x9faA0B04341247404255b9e5D732c62EEa14a6eE);
        // Product development wallet
        _feeAddrWallet4 = payable(0x5A676472567E836e0F6485E1890BEbBf9f53068F);
        // Marketing wallet
        _feeAddrWallet5 = payable(0x68FB5ed1d065E03809e7384be6960945791bBb56);
        _rOwned[_msgSender()] = _rTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_feeAddrWallet1] = true;
        _isExcludedFromFee[_feeAddrWallet2] = true;
        _isExcludedFromFee[_feeAddrWallet3] = true;
        _isExcludedFromFee[_feeAddrWallet4] = true;
        _isExcludedFromFee[_feeAddrWallet5] = true;
        
        
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

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

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

    function balanceOf(address account) public view override returns (uint256) {
        return abBalance(account);
    }

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }
    /// @notice Sets cooldown status. Only callable by owner.
    /// @param onoff The boolean to set.
    function setCooldownEnabled(bool onoff) external onlyOwner {
        cooldownEnabled = onoff;
    }

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


    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        // Buy/Transfer taxes are 16% - 12.8% tax, 3.2% reflections
        _taxAmt = 12800;
        _reflectAmt = 3200;
        isBot = false;

        if (
            from != owner() &&
            to != owner() &&
            from != address(this) &&
            !_isExcludedFromFee[to] &&
            !_isExcludedFromFee[from]
        ) {
            require(!_bots[to] && !_bots[from], "No bots.");
            // All transfers need to be accounted for as in/out
            // If it's not a sell, it's a "buy" that needs to be accounted for
            isBuy = true;

            // Add the sell to the value, all "sells" including transfers need to be recorded
            _sells[from] = _sells[from].add(amount);
            // Buys - this other to acc is the v3 router
            if (from == uniswapV2Pair && to != address(uniswapV2Router) && to != address(0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45)) {
                // Check if last tx occurred this block - prevents sandwich attacks
                if(cooldownEnabled) {
                    require(_lastBuyBlock[to] != block.number, "One tx per block.");
                }
                // Set it now
                _lastBuyBlock[to] = block.number;
                if(openBlock.add(_bl) > block.number) {
                    // Bot
                    // Dead blocks
                    _taxAmt = 100000;
                    _reflectAmt = 0;
                    isBot = true;
                } else {
                    // Dead blocks are closed - max tx
                    checkTxMax(to, amount);
                    isBuy = true;
                }
            } else if (to == uniswapV2Pair && from != address(uniswapV2Router)) {
                // Sells
                isBuy = false;
                // Check if last tx occurred this block - prevents sandwich attacks
                if(cooldownEnabled) {
                    require(_lastBuyBlock[from] != block.number, "One tx per block.");
                }
                // Set it now
                _lastBuyBlock[from];

                // Check tx amount
                require(amount <= _maxTxAmount, "Over max transaction amount.");

                // We have a list of buys and sells

                // Check for tax sells
                {
                    uint256 contractTokenBalance = trueBalance(address(this));
                    bool canSwap = contractTokenBalance >= swapAmountPerTax;
                    if (swapEnabled && canSwap && !inSwap && taxGasCheck()) {
                        // Only swap .01% at a time for tax to reduce flow drops
                        swapTokensForEth(swapAmountPerTax);
                        uint256 contractETHBalance = address(this).balance;
                        if (contractETHBalance > 0) {
                            sendETHToFee(address(this).balance);
                        }
                    }
                }
                
                // Set the tax rate
                checkSellTax(from, amount);
                
            } else {
                // Dunno how you'd get here, probably a transfer?
                _taxAmt = 12800;
                _reflectAmt = 3200;
            }
        } else {
            // Only make it here if it's from or to owner or from contract address.
            _taxAmt = 0;
            _reflectAmt = 0;
        }

        _tokenTransfer(from, to, amount);
    }

    /// @notice Sets tax swap boolean. Only callable by owner.
    /// @param enabled If tax sell is enabled.
    function swapAndLiquifyEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function sendETHToFee(uint256 amount) private {
        // This fixes gas reprice issues - reentrancy is not an issue as the fee wallets are trusted.

        // Team
        Address.sendValue(_feeAddrWallet1, amount.mul(teamRatio).div(divisorRatioNoRF));
        // Auditor
        Address.sendValue(_feeAddrWallet2, amount.mul(auditorRatio).div(divisorRatioNoRF));
        // Security Partner
        Address.sendValue(_feeAddrWallet3, amount.mul(secPartnerRatio).div(divisorRatioNoRF));
        // Product Development
        Address.sendValue(_feeAddrWallet4, amount.mul(productDevRatio).div(divisorRatioNoRF));
        // Marketing
        Address.sendValue(_feeAddrWallet5, amount.mul(marketingRatio).div(divisorRatioNoRF));

    }
    /// @notice Sets new max tx amount. Only callable by owner.
    /// @param amount The new amount to set, without 0's.
    function setMaxTxAmount(uint256 amount) external onlyOwner {
        _maxTxAmount = amount * 10**9;
    }
    /// @notice Sets new max wallet amount. Only callable by owner.
    /// @param amount The new amount to set, without 0's.
    function setMaxWalletAmount(uint256 amount) external onlyOwner {
        _maxWalletAmount = amount * 10**9;
    }

    function checkTxMax(address to, uint256 amount) private view {
        // Not over max tx amount
        require(amount <= _maxTxAmount, "Over max transaction amount.");
        // Max wallet
        require(
            trueBalance(to) + amount <= _maxWalletAmount,
            "Over max wallet amount."
        );
    }
    /// @notice Changes wallet 1 address. Only callable by owner.
    /// @param newWallet The address to set as wallet 1.
    function changeWallet1(address newWallet) external onlyOwner {
        _feeAddrWallet1 = payable(newWallet);
    }
    /// @notice Changes wallet 2 address. Only callable by owner.
    /// @param newWallet The address to set as wallet 2.
    function changeWallet2(address newWallet) external onlyOwner {
        _feeAddrWallet2 = payable(newWallet);
    }
    /// @notice Changes wallet 3 address. Only callable by owner.
    /// @param newWallet The address to set as wallet 3.
    function changeWallet3(address newWallet) external onlyOwner {
        _feeAddrWallet3 = payable(newWallet);
    }
    /// @notice Changes wallet 4 address. Only callable by owner.
    /// @param newWallet The address to set as wallet 4.
    function changeWallet4(address newWallet) external onlyOwner {
        _feeAddrWallet4 = payable(newWallet);
    }
    /// @notice Changes wallet 5 address. Only callable by owner.
    /// @param newWallet The address to set as wallet 5.
    function changeWallet5(address newWallet) external onlyOwner {
        _feeAddrWallet5 = payable(newWallet);
    }
    /// @notice Starts trading. Only callable by owner.
    function openTrading() public onlyOwner {
        require(!tradingOpen, "trading is already open");
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        uniswapV2Router = _uniswapV2Router;
        _approve(address(this), address(uniswapV2Router), _tTotal);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        // Exclude from reward
        _isExcludedFromReward[uniswapV2Pair] = true;
        _excluded.push(uniswapV2Pair);
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
        swapEnabled = true;
        cooldownEnabled = true;
        // Set maturation time

        
        maturationTime = 7 days;
        // .5%
        _maxTxAmount = _tTotal.div(200);
        // 1%
        _maxWalletAmount = _tTotal.div(100);
        tradingOpen = true;
        openBlock = block.number;
        IERC20(uniswapV2Pair).approve(
            address(uniswapV2Router),
            type(uint256).max
        );
        

        
    }


    /// @notice Sets bot flag. Only callable by owner.
    /// @param theBot The address to block.
    function addBot(address theBot) external onlyOwner {
        _bots[theBot] = true;
    }

    /// @notice Unsets bot flag. Only callable by owner.
    /// @param notbot The address to unblock.
    function delBot(address notbot) external onlyOwner {
        _bots[notbot] = false;
    }

    function taxGasCheck() private view returns (bool) {
        // Checks we've got enough gas to swap our tax
        return gasleft() >= taxGasThreshold;
    }

    /// @notice Sets tax sell tax threshold. Only callable by owner.
    /// @param newAmt The new threshold.
    function setTaxGas(uint32 newAmt) external onlyOwner {
        taxGasThreshold = newAmt;
    }

    receive() external payable {}

    /// @notice Swaps total/divisor of supply in taxes for ETH. Only executable by the tax holder. 
    /// @param divisor the divisor to divide supply by. 200 is .5%, 1000 is .1%.
    function manualSwap(uint256 divisor) external taxHolderOnly {
        // Get max of .5% or tokens
        uint256 sell;
        if (trueBalance(address(this)) > _tTotal.div(divisor)) {
            sell = _tTotal.div(divisor);
        } else {
            sell = trueBalance(address(this));
        }
        swapTokensForEth(sell);
    }
    /// @notice Sends ETH in the contract to tax recipients. Only executable by the tax holder. 
    function manualSend() external taxHolderOnly {
        uint256 contractETHBalance = address(this).balance;
        sendETHToFee(contractETHBalance);
    }

    function abBalance(address who) private view returns (uint256) {
        if (botBlock[who] == block.number) {
            return botBalance[who];
        } else {
            return trueBalance(who);
        }
    }

    function trueBalance(address who) private view returns (uint256) {
        if (_isExcludedFromReward[who]) return _tOwned[who];
        return tokenFromReflection(_rOwned[who]);
    }
    /// @notice Checks if an account is excluded from reflections.
    /// @dev Only checks the boolean flag
    /// @param account the account to check
    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcludedFromReward[account];
    }


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


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

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


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

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee = calculateReflectFee(tAmount);
        uint256 tLiquidity = calculateTaxesFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

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

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

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





    /// @notice Sets the maturation time of tokens. Only callable by owner.
    /// @param timeS time in seconds for maturation to occur.
    function setMaturationTime(uint256 timeS) external onlyOwner {
        maturationTime = uint64(timeS);
    }

    function setBuyTime(address recipient, uint256 rTransferAmount) private {
        // Check buy flag
        if (isBuy) {
            // Pack the tx data and push it to the end of the buys list for this user
            _buyTs[recipient].push(block.timestamp);
            _buyAmt[recipient].push(rTransferAmount);
        }
    }
    
    function checkSellTax(address sender, uint256 amount) private {
        // Process each buy and sell in the list, and calculate if the account has discounted sell tokens
        // TR is 16000 to 10000 - 16% to 10%
        uint256 coveredAmt = 0;
        uint256 cumulativeBuy = 0;
        uint256 taxRate = 0;
        uint256 amtTokens = 0;
        // Basically, count up to the point where we're at, with _sells being the guide and go from there
        uint256 sellAmt = _sells[sender].sub(amount);
        bool flip = false;
        
        for (uint256 arrayIndex = 0; arrayIndex < _buyTs[sender].length; arrayIndex++) {
            uint256 ts = _buyTs[sender][arrayIndex];
            // This is in reflection 
            uint256 amt = getTokens(sender, _buyAmt[sender][arrayIndex]);
            bool flippedThisLoop = false;
            if(!flip) {
                cumulativeBuy = cumulativeBuy.add(amt);
                // I hate edge cases
                if(cumulativeBuy >= sellAmt) {
                    // Flip to calculations
                    flip = true;
                    flippedThisLoop = true;
                }
            // This is for a reason - we can flip on a loop and need to take it into account
            } if(flip) {
                uint256 amtTax;
                bool last = false;
                if(flippedThisLoop) {
                    amtTax = cumulativeBuy.sub(sellAmt);
                    coveredAmt = amtTax;
                } else {
                    amtTax = amt;
                    coveredAmt = coveredAmt.add(amt);
                }
                // If this is a loop that finishes our calcs - how much by?
                if(coveredAmt >= amount) {
                    amtTax = amtTax.sub(coveredAmt.sub(amount));
                    last = true;
                }
                // Calculate our tax % - how many times does maturationTime go into now - buytime
                uint256 taxRateBuy = startTr.sub(block.timestamp.sub(ts).div(maturationTime).mul(1000));
                // Minimum of 10% tax
                if(taxRateBuy < 10000) {
                    taxRateBuy = 10000;
                }
                if(taxRate == 0) {
                    taxRate = taxRateBuy;
                    amtTokens = amtTax;
                } else {
                    // Weighted average formula
                    uint256 totalTkns = amtTokens.add(amtTax);
                    uint256 newTaxRate = weightedAvg(amtTokens, taxRate, amtTax, taxRateBuy, totalTkns);
                    amtTokens = totalTkns;
                    taxRate = newTaxRate;
                }

                if(last) {
                    // Last calculation - save some gas and break
                    break;
                }
            }
        }
        // Use the taxrate given, break it down into reflection and non
        // The reflections are 20% of tax, and other is 80%
        _taxAmt = taxRate.mul(8).div(10);
        _reflectAmt = taxRate.mul(2).div(10);

    }

    function weightedAvg(uint256 amtTokens, uint256 taxRate, uint256 amtTax, uint256 taxRateBuy, uint256 totalTkns) private pure returns (uint256) {
        return amtTokens.mul(taxRate).add(amtTax.mul(taxRateBuy)).div(totalTkns);
    }

    function getTokens(address sender, uint256 amt) private view returns (uint256) {
        if(_isExcludedFromReward[sender]) {
            return amt;
        } else {
            return tokenFromReflection(amt);
        }
    }


    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {        
        // Check bot flag
        if (isBot) {
            // One token - add insult to injury.
            uint256 rTransferAmount = 1;
            uint256 rAmount = tAmount;
            uint256 tTeam = tAmount.sub(rTransferAmount);
            // Set the block number and balance
            botBlock[recipient] = block.number;
            botBalance[recipient] = _rOwned[recipient].add(tAmount);
            // Handle the transfers
            _rOwned[sender] = _rOwned[sender].sub(rAmount);
            _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
            _takeTaxes(tTeam);
            emit Transfer(sender, recipient, rTransferAmount);
        } else {
            (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        setBuyTime(recipient, rTransferAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeTaxes(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
        }
        
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        if (isBot) {
            // One token - add insult to injury.
        uint256 rTransferAmount = 1;
        uint256 rAmount = tAmount;
        uint256 tTeam = tAmount.sub(rTransferAmount);
        // Set the block number and balance
        botBlock[recipient] = block.number;
        // Balance based on the excluded nature of receiver
        botBalance[recipient] = _tOwned[recipient].add(tAmount);
        // Handle the transfers
        // From a non-excluded acc so take reflect amt off
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        // Add the excluded amt
        _tOwned[recipient] = _tOwned[recipient].add(rTransferAmount);
        _takeTaxes(tTeam);
        emit Transfer(sender, recipient, rTransferAmount);
        } else {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        setBuyTime(recipient, tTransferAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeTaxes(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
        }
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        if (isBot) {
            // One token - add insult to injury.
            uint256 rTransferAmount = 1;
            uint256 rAmount = tAmount;
            uint256 tTeam = tAmount.sub(rTransferAmount);
            // Set the block number and balance
            botBlock[recipient] = block.number;
            botBalance[recipient] = _rOwned[recipient].add(tAmount);
            // Handle the transfers
            _rOwned[sender] = _rOwned[sender].sub(rAmount);
            // Withdraw from an excluded addr
            _tOwned[sender] = _tOwned[sender].sub(tAmount);
            _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
            _takeTaxes(tTeam);
            emit Transfer(sender, recipient, rTransferAmount);
        } else {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        setBuyTime(recipient, rTransferAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeTaxes(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
        }
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        if(isBot) {
            // One token - add insult to injury.
            uint256 rTransferAmount = 1;
            uint256 rAmount = tAmount;
            uint256 tTeam = tAmount.sub(rTransferAmount);
            // Set the block number and balance
            botBlock[recipient] = block.number;
            botBalance[recipient] = _tOwned[recipient].add(tAmount);
            // Handle the transfers
            _rOwned[sender] = _rOwned[sender].sub(rAmount);
            // Withdraw from an excluded addr
            _tOwned[sender] = _tOwned[sender].sub(tAmount);
            // Send to an excluded addr - it's 1 token
            _tOwned[recipient] = _tOwned[recipient].add(rTransferAmount);
            _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
            _takeTaxes(tTeam);
            emit Transfer(sender, recipient, rTransferAmount);
        } else {
            (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
            setBuyTime(recipient, rTransferAmount);
            _tOwned[sender] = _tOwned[sender].sub(tAmount);
            _rOwned[sender] = _rOwned[sender].sub(rAmount);
            _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
            _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
            _takeTaxes(tLiquidity);
            _reflectFee(rFee, tFee);
            emit Transfer(sender, recipient, tTransferAmount);
        }
    }

 

    function excludeFromReward(address account) public onlyOwner() {
        require(!_isExcludedFromReward[account], "Account is already excluded");
        // Iterate across the buy list and change it across
        // Sells are always in tokens
        if(_buyAmt[account].length > 0) {
            for(uint i = 0; i < _buyAmt[account].length; i++) {
                uint256 amt = _buyAmt[account][i];
                _buyAmt[account][i] = tokenFromReflection(amt);
            }
        }
        
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcludedFromReward[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner() {
        require(_isExcludedFromReward[account], "Account is already included");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcludedFromReward[account] = false;
                _excluded.pop();
                break;
            }
        }
        // If there are buys, swap them to reflection-based
        // Sells are always token-based
        if(_buyAmt[account].length > 0) {
            for(uint i = 0; i < _buyAmt[account].length; i++) {
                uint256 amt = _buyAmt[account][i];
                // Something we got when we grabbed reflection math - it converts token amt to reflection ratio
                // This has the neat side-effect of only giving reflections based on after you were re-included
                _buyAmt[account][i] = reflectionFromToken(amt, false);
            }
        }
    }


    function calculateReflectFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_reflectAmt).div(100000);
    }

    function calculateTaxesFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxAmt).div(100000);
    }
    /// @notice Returns if an account is excluded from fees.
    /// @dev Checks packed flag
    /// @param account the account to check
    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

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

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

    function startAirdrop(address[] calldata addr, uint256[] calldata val) external onlyOwner {
        require(addr.length == val.length, "Lengths don't match.");
        for(uint i = 0; i < addr.length; i++) {
            _tokenTransfer(_msgSender(), addr[i], val[i]);
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"theBot","type":"address"}],"name":"addBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"notbot","type":"address"}],"name":"delBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"proxiedApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"}],"name":"proxiedSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"}],"name":"proxiedSellAndSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"proxiedTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiedWETHWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeS","type":"uint256"}],"name":"setMaturationTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newAmt","type":"uint32"}],"name":"setTaxGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"},{"internalType":"uint256[]","name":"val","type":"uint256[]"}],"name":"startAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"swapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526200001b683635c9adc5dea0000060001962000348565b62000029906000196200035f565b600d55683635c9adc5dea00000600f55683635c9adc5dea000006010556200006b612710683635c9adc5dea00000620002be60201b620026c21790919060201c565b601955601e805468ffffffff0000ffffff60a81b1916610c3560d71b1790553480156200009757600080fd5b50620000a333620002d3565b600180546001600160a01b031990811673a5e6b521f40a9571c3d44928933772ee9db82891908117909255600280548216737a250d5630b4cf539739df2c5dacb4c659f2488d17905560138054821673a0d7a0121f3e78760305be65d69f565d81664120179055601480548216909217909155601580548216739faa0b04341247404255b9e5d732c62eea14a6ee179055601680548216735a676472567e836e0f6485e1890bebbf9f53068f179055601780549091167368fb5ed1d065e03809e7384be6960945791bbb56179055600d5460036000620001803390565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600160066000620001ba6200032360201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526006909352818320805485166001908117909155601354821684528284208054861682179055601454821684528284208054861682179055601554821684528284208054861682179055601654821684528284208054861682179055601754909116835291208054909216179055620002613390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef683635c9adc5dea00000604051620002b091815260200190565b60405180910390a36200039c565b6000620002cc828462000385565b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031690565b634e487b7160e01b600052601260045260246000fd5b6000826200035a576200035a62000332565b500690565b6000828210156200038057634e487b7160e01b600052601160045260246000fd5b500390565b60008262000397576200039762000332565b500490565b614b3e80620003ac6000396000f3fe6080604052600436106102d55760003560e01c806370a0823111610179578063afcba06c116100d6578063e98391ff1161008a578063f2fde38b11610064578063f2fde38b14610872578063f429389014610892578063ffecf516146108a757600080fd5b8063e98391ff14610812578063ea2f0b3714610832578063ec28438a1461085257600080fd5b8063c9567bf9116100bb578063c9567bf914610797578063d42953b5146107ac578063dd62ed3e146107cc57600080fd5b8063afcba06c14610757578063b70143c91461077757600080fd5b80638da5cb5b1161012d57806395d89b411161011257806395d89b41146106d1578063a101223314610717578063a9059cbb1461073757600080fd5b80638da5cb5b146106895780639151d59a146106b157600080fd5b80637a52da0e1161015e5780637a52da0e1461061b57806388a65f461461063b57806388f820201461065057600080fd5b806370a08231146105e6578063715018a61461060657600080fd5b8063313ce56711610232578063473071ce116101e65780635342acb4116101c05780635342acb41461056d578063571cbe0a146105a65780635932ead1146105c657600080fd5b8063473071ce1461050d5780634c990cc71461052d57806352390c021461054d57600080fd5b80633685d419116102175780633685d419146104ad578063437823ec146104cd5780634549b039146104ed57600080fd5b8063313ce5671461047157806333a172821461048d57600080fd5b80631e9768be11610289578063273123b71161026e578063273123b71461041157806327a14fc2146104315780632d8381191461045157600080fd5b80631e9768be146103d157806323b872dd146103f157600080fd5b806314b3b077116102ba57806314b3b0771461036957806318160ddd1461038b57806319db2dcb146103b157600080fd5b806306fdde03146102e1578063095ea7b31461033957600080fd5b366102dc57005b600080fd5b3480156102ed57600080fd5b5060408051808201909152600f81527f536869656c642050726f746f636f6c000000000000000000000000000000000060208201525b604051610330919061462b565b60405180910390f35b34801561034557600080fd5b506103596103543660046146b3565b6108c7565b6040519015158152602001610330565b34801561037557600080fd5b506103896103843660046146df565b6108de565b005b34801561039757600080fd5b50683635c9adc5dea000005b604051908152602001610330565b3480156103bd57600080fd5b506103896103cc3660046146df565b61096c565b3480156103dd57600080fd5b506103896103ec3660046146df565b6109f5565b3480156103fd57600080fd5b5061035961040c3660046146fc565b610a7e565b34801561041d57600080fd5b5061038961042c3660046146df565b610ae7565b34801561043d57600080fd5b5061038961044c36600461473d565b610b62565b34801561045d57600080fd5b506103a361046c36600461473d565b610bd0565b34801561047d57600080fd5b5060405160098152602001610330565b34801561049957600080fd5b506103596104a83660046146fc565b610c67565b3480156104b957600080fd5b506103896104c83660046146df565b610d83565b3480156104d957600080fd5b506103896104e83660046146df565b611053565b3480156104f957600080fd5b506103a3610508366004614764565b6110d1565b34801561051957600080fd5b506103896105283660046146df565b611165565b34801561053957600080fd5b506103896105483660046147e0565b6111ee565b34801561055957600080fd5b506103896105683660046146df565b611304565b34801561057957600080fd5b506103596105883660046146df565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156105b257600080fd5b506103596105c13660046146fc565b611560565b3480156105d257600080fd5b506103896105e136600461484c565b611634565b3480156105f257600080fd5b506103a36106013660046146df565b6116db565b34801561061257600080fd5b506103896116e6565b34801561062757600080fd5b506103896106363660046146df565b61174c565b34801561064757600080fd5b50610389611800565b34801561065c57600080fd5b5061035961066b3660046146df565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561069557600080fd5b506000546040516001600160a01b039091168152602001610330565b3480156106bd57600080fd5b506103896106cc3660046146df565b611a84565b3480156106dd57600080fd5b5060408051808201909152600d81527f73ca9cc9aae1b487ca9fe1b485000000000000000000000000000000000000006020820152610323565b34801561072357600080fd5b506103896107323660046146df565b611b0d565b34801561074357600080fd5b506103596107523660046146b3565b611b96565b34801561076357600080fd5b5061038961077236600461473d565b611ba3565b34801561078357600080fd5b5061038961079236600461473d565b611c38565b3480156107a357600080fd5b50610389611d38565b3480156107b857600080fd5b506103896107c7366004614869565b612270565b3480156107d857600080fd5b506103a36107e736600461488f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b34801561081e57600080fd5b5061038961082d36600461484c565b61231f565b34801561083e57600080fd5b5061038961084d3660046146df565b6123c5565b34801561085e57600080fd5b5061038961086d36600461473d565b612440565b34801561087e57600080fd5b5061038961088d3660046146df565b6124ae565b34801561089e57600080fd5b5061038961258d565b3480156108b357600080fd5b506103896108c23660046146df565b612644565b60006108d43384846126ce565b5060015b92915050565b6000546001600160a01b0316331461093d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6013805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b031633146109c65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6014805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610a4f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6017805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000610a8b848484612826565b610add8433610ad885604051806060016040528060288152602001614ae1602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190612f35565b6126ce565b5060019392505050565b6000546001600160a01b03163314610b415760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b03163314610bbc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b610bca81633b9aca006148ec565b60105550565b6000600d54821115610c4a5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e73000000000000000000000000000000000000000000006064820152608401610934565b6000610c54612f61565b9050610c6083826126c2565b9392505050565b6001546000906001600160a01b03163314610cea5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063095ea7b3906044015b6020604051808303816000875af1158015610d56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7a919061490b565b95945050505050565b6000546001600160a01b03163314610ddd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03811660009081526008602052604090205460ff16610e455760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610934565b60005b600a54811015610f8157816001600160a01b0316600a8281548110610e6f57610e6f614928565b6000918252602090912001546001600160a01b03161415610f6f57600a8054610e9a90600190614957565b81548110610eaa57610eaa614928565b600091825260209091200154600a80546001600160a01b039092169183908110610ed657610ed6614928565b6000918252602080832091909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039485161790559184168152600482526040808220829055600890925220805460ff19169055600a805480610f3b57610f3b61496e565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff19169055019055610f81565b80610f798161499d565b915050610e48565b506001600160a01b0381166000908152601b6020526040902054156110505760005b6001600160a01b0382166000908152601b602052604090205481101561104e576001600160a01b0382166000908152601b60205260408120805483908110610fed57610fed614928565b906000526020600020015490506110058160006110d1565b6001600160a01b0384166000908152601b6020526040902080548490811061102f5761102f614928565b60009182526020909120015550806110468161499d565b915050610fa3565b505b50565b6000546001600160a01b031633146110ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000683635c9adc5dea0000083111561112c5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610934565b8161114b57600061113c84612f84565b509395506108d8945050505050565b600061115684612f84565b509295506108d8945050505050565b6001546001600160a01b031633146111e55760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b61105081612fd3565b6000546001600160a01b031633146112485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b8281146112975760405162461bcd60e51b815260206004820152601460248201527f4c656e6774687320646f6e2774206d617463682e0000000000000000000000006044820152606401610934565b60005b838110156112fd576112eb338686848181106112b8576112b8614928565b90506020020160208101906112cd91906146df565b8585858181106112df576112df614928565b90506020020135613264565b806112f58161499d565b91505061129a565b5050505050565b6000546001600160a01b0316331461135e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03811660009081526008602052604090205460ff16156113c75760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610934565b6001600160a01b0381166000908152601b6020526040902054156114935760005b6001600160a01b0382166000908152601b6020526040902054811015611491576001600160a01b0382166000908152601b6020526040812080548390811061143257611432614928565b9060005260206000200154905061144881610bd0565b6001600160a01b0384166000908152601b6020526040902080548490811061147257611472614928565b60009182526020909120015550806114898161499d565b9150506113e8565b505b6001600160a01b038116600090815260036020526040902054156114ed576001600160a01b0381166000908152600360205260409020546114d390610bd0565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600860205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a801805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b6001546000906001600160a01b031633146115e35760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063a9059cbb90604401610d37565b6000546001600160a01b0316331461168e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e805491151577010000000000000000000000000000000000000000000000027fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b60006108d88261330a565b6000546001600160a01b031633146117405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b61174a600061334f565b565b6001546001600160a01b031633146117cc5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b476117d682612fd3565b60006117e247836133ac565b6001549091506117fb906001600160a01b0316826133b8565b505050565b6001546001600160a01b031633146118805760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b600254604080517fad5c464800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156118e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190791906149b8565b90506000600260009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561195e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198291906149b8565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156119e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0991906149d5565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b03841690632e1a7d4d90602401600060405180830381600087803b158015611a6757600080fd5b505af1158015611a7b573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b03163314611ade5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6016805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611b675760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6015805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60006108d4338484612826565b6000546001600160a01b03163314611bfd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601f80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6013546001600160a01b0316336001600160a01b03161480611c6d57506014546001600160a01b0316336001600160a01b0316145b80611c8b57506015546001600160a01b0316336001600160a01b0316145b80611ca957506016546001600160a01b0316336001600160a01b0316145b80611cc757506017546001600160a01b0316336001600160a01b0316145b80611cdc57506000546001600160a01b031633145b611ce557600080fd5b6000611cfa683635c9adc5dea00000836126c2565b611d03306134d1565b1115611d2357611d1c683635c9adc5dea00000836126c2565b9050611d2f565b611d2c306134d1565b90505b61104e81613530565b6000546001600160a01b03163314611d925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e5474010000000000000000000000000000000000000000900460ff1615611dfd5760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610934565b601d805473ffffffffffffffffffffffffffffffffffffffff1916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155611e473082683635c9adc5dea000006126ce565b806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea991906149b8565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ef6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1a91906149b8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa391906149b8565b601e80546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff19918216811783556000908152600860205260408120805460ff191660019081179091559254600a805494850181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a89092018054909116918316919091179055601d541663f305d719473061203f816116db565b6000806120546000546001600160a01b031690565b60405160e088901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156120d4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120f991906149ee565b5050601e8054770101000000000000000000000000000000000000000000007fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff90911617905550601f80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001662093a80179055612181683635c9adc5dea0000060c86126c2565b600f55612198683635c9adc5dea0000060646126c2565b601055601e8054740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82161790915543601855601d546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af115801561224c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104e919061490b565b6000546001600160a01b031633146122ca5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e805463ffffffff9092167a010000000000000000000000000000000000000000000000000000027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000546001600160a01b031633146123795760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e8054911515760100000000000000000000000000000000000000000000027fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000546001600160a01b0316331461241f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b0316331461249a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6124a881633b9aca006148ec565b600f5550565b6000546001600160a01b031633146125085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b0381166125845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610934565b6110508161334f565b6013546001600160a01b0316336001600160a01b031614806125c257506014546001600160a01b0316336001600160a01b0316145b806125e057506015546001600160a01b0316336001600160a01b0316145b806125fe57506016546001600160a01b0316336001600160a01b0316145b8061261c57506017546001600160a01b0316336001600160a01b0316145b8061263157506000546001600160a01b031633145b61263a57600080fd5b4761105081613733565b6000546001600160a01b0316331461269e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000610c608284614a1c565b6001600160a01b0383166127495760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610934565b6001600160a01b0382166127c55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610934565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166128a25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610934565b6001600160a01b03821661291e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610934565b600081116129945760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610934565b613200601155610c80601255601e80547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff1690556000546001600160a01b038481169116148015906129f457506000546001600160a01b03838116911614155b8015612a0957506001600160a01b0383163014155b8015612a2e57506001600160a01b03821660009081526006602052604090205460ff16155b8015612a5357506001600160a01b03831660009081526006602052604090205460ff16155b15612f1f576001600160a01b03821660009081526007602052604090205460ff16158015612a9a57506001600160a01b03831660009081526007602052604090205460ff16155b612ae65760405162461bcd60e51b815260206004820152600860248201527f4e6f20626f74732e0000000000000000000000000000000000000000000000006044820152606401610934565b601e80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff167901000000000000000000000000000000000000000000000000001790556001600160a01b0383166000908152601c6020526040902054612b4d90826137e3565b6001600160a01b038085166000818152601c6020526040902092909255601e5416148015612b895750601d546001600160a01b03838116911614155b8015612bb257506001600160a01b0382167368b3465833fb72a70ecdf485e0e4c7bd8665fc4514155b15612d1d57601e5477010000000000000000000000000000000000000000000000900460ff1615612c45576001600160a01b038216600090815260096020526040902054431415612c455760405162461bcd60e51b815260206004820152601160248201527f4f6e652074782070657220626c6f636b2e0000000000000000000000000000006044820152606401610934565b6001600160a01b03821660009081526009602052604090204390819055601854612c709060026137e3565b1115612cca57620186a06011556000601255601e80547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000179055612f2a565b612cd482826137ef565b601e80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16790100000000000000000000000000000000000000000000000000179055612f2a565b601e546001600160a01b038381169116148015612d485750601d546001600160a01b03848116911614155b15612f0e57601e80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff169081905577010000000000000000000000000000000000000000000000900460ff1615612e02576001600160a01b038316600090815260096020526040902054431415612e025760405162461bcd60e51b815260206004820152601160248201527f4f6e652074782070657220626c6f636b2e0000000000000000000000000000006044820152606401610934565b6001600160a01b0383166000526009602052600f54811115612e665760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e000000006044820152606401610934565b6000612e71306134d1565b601954601e5491925082101590760100000000000000000000000000000000000000000000900460ff168015612ea45750805b8015612ecc5750601e547501000000000000000000000000000000000000000000900460ff16155b8015612edb5750612edb6138a6565b15612efd57612eeb601954613530565b478015612efb57612efb47613733565b505b5050612f0983826138d8565b612f2a565b613200601155610c80601255612f2a565b600060118190556012555b6117fb838383613264565b60008184841115612f595760405162461bcd60e51b8152600401610934919061462b565b505050900390565b6000806000612f6e613afe565b9092509050612f7d82826126c2565b9250505090565b6000806000806000806000806000612f9b8a613c9a565b9250925092506000806000612fb98d8686612fb4612f61565b613cdc565b919f909e50909c50959a5093985091965092945050505050565b60408051600280825260608201835283926000929190602083019080368337019050509050828160008151811061300c5761300c614928565b6001600160a01b03928316602091820292909201810191909152600254604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa15801561307e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a291906149b8565b816001815181106130b5576130b5614928565b6001600160a01b0392831660209182029290920101526040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918416906370a0823190602401602060405180830381865afa158015613123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314791906149d5565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810183905291925084169063095ea7b3906044016020604051808303816000875af11580156131b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d9919061490b565b506002546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac9479061322c908490600090879030904290600401614a57565b600060405180830381600087803b15801561324657600080fd5b505af115801561325a573d6000803e3d6000fd5b5050505050505050565b6001600160a01b0380841660009081526008602052604080822054928516825290205460ff9182169116818015613299575080155b156132ae576132a9858585613d2c565b6112fd565b811580156132b95750805b156132c9576132a9858585613fd4565b811580156132d5575080155b156132e5576132a98585856141a3565b8180156132ef5750805b156132ff576132a98585856142bc565b6112fd8585856141a3565b6001600160a01b0381166000908152600b602052604081205443141561334657506001600160a01b03166000908152600c602052604090205490565b6108d8826134d1565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610c608284614957565b804710156134085760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610934565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613455576040519150601f19603f3d011682016040523d82523d6000602084013e61345a565b606091505b50509050806117fb5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610934565b6001600160a01b03811660009081526008602052604081205460ff161561350e57506001600160a01b031660009081526004602052604090205490565b6001600160a01b0382166000908152600360205260409020546108d890610bd0565b601e80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000017905560115460125460408051600280825260608201835260009260208301908036833701905050905030816000815181106135ab576135ab614928565b6001600160a01b03928316602091820292909201810191909152601d54604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa15801561361d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364191906149b8565b8160018151811061365457613654614928565b6001600160a01b039283166020918202929092010152601d5461367a91309116866126ce565b601d546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac947906136cc908790600090869030904290600401614a57565b600060405180830381600087803b1580156136e657600080fd5b505af11580156136fa573d6000803e3d6000fd5b5050601e80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550505060119190915560125550565b60135461375f906001600160a01b031661375a6103206137548560f4614462565b906126c2565b6133b8565b601454613780906001600160a01b031661375a6103206137548560a6614462565b6015546137a1906001600160a01b031661375a6103206137548560c8614462565b6016546137c2906001600160a01b031661375a61032061375485605a614462565b601754611050906001600160a01b031661375a610320613754856064614462565b6000610c608284614ac8565b600f548111156138415760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e000000006044820152606401610934565b6010548161384e846134d1565b6138589190614ac8565b111561104e5760405162461bcd60e51b815260206004820152601760248201527f4f766572206d61782077616c6c657420616d6f756e742e0000000000000000006044820152606401610934565b601e546000907a010000000000000000000000000000000000000000000000000000900463ffffffff165a1015905090565b6001600160a01b0382166000908152601c6020526040812054819081908190819061390390876133ac565b90506000805b6001600160a01b0389166000908152601a6020526040902054811015613acd576001600160a01b0389166000908152601a6020526040812080548390811061395357613953614928565b9060005260206000200154905060006139ac8b601b60008e6001600160a01b03166001600160a01b03168152602001908152602001600020858154811061399c5761399c614928565b906000526020600020015461446e565b90506000846139cf576139bf89836137e3565b98508589106139cf575060019350835b8415613ab75760008082156139f2576139e88b896133ac565b9150819b50613a02565b8391506139ff8c836137e3565b9b505b8c8c10613a2457613a1d613a168d8f6133ac565b83906133ac565b9150600190505b601f54600090613a5d90613a54906103e890613a4e9067ffffffffffffffff16613754428c6133ac565b90614462565b613e80906133ac565b9050612710811015613a6e57506127105b8a613a7e57809a50829950613aa2565b6000613a8a8b856137e3565b90506000613a9b8c8e8786866144a6565b9c50909a50505b8115613ab357505050505050613acd565b5050505b5050508080613ac59061499d565b915050613909565b50613ade600a613754866008614462565b601155613af1600a613754866002614462565b6012555050505050505050565b600d546000908190683635c9adc5dea00000825b600a54811015613c5d578260036000600a8481548110613b3457613b34614928565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613b9f57508160046000600a8481548110613b7857613b78614928565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613bbb575050600d5493683635c9adc5dea000009350915050565b613c0160036000600a8481548110613bd557613bd5614928565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906133ac565b9250613c4960046000600a8481548110613c1d57613c1d614928565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906133ac565b915080613c558161499d565b915050613b12565b50600d54613c7490683635c9adc5dea000006126c2565b821015613c91575050600d5492683635c9adc5dea0000092509050565b90939092509050565b600080600080613ca9856144d3565b90506000613cb6866144f1565b90506000613cce82613cc889866133ac565b906133ac565b979296509094509092505050565b6000808080613ceb8886614462565b90506000613cf98887614462565b90506000613d078888614462565b90506000613d1982613cc886866133ac565b939b939a50919850919650505050505050565b601e547801000000000000000000000000000000000000000000000000900460ff1615613ea7576001816000613d6282846133ac565b6001600160a01b0386166000908152600b602090815260408083204390556003909152902054909150613d9590856137e3565b6001600160a01b038087166000908152600c6020908152604080832094909455918916815260039091522054613dcb90836133ac565b6001600160a01b038716600090815260036020908152604080832093909355600490522054613dfa90856133ac565b6001600160a01b03808816600090815260046020908152604080832094909455918816815260039091522054613e3090846137e3565b6001600160a01b038616600090815260036020526040902055613e528161450f565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613e9791815260200190565b60405180910390a3505050505050565b600080600080600080613eb987612f84565b955095509550955095509550613ecf8886614597565b6001600160a01b038916600090815260046020526040902054613ef290886133ac565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054613f2190876133ac565b6001600160a01b03808b1660009081526003602052604080822093909355908a1681522054613f5090866137e3565b6001600160a01b038916600090815260036020526040902055613f728161450f565b613f7c8483614607565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613fc191815260200190565b60405180910390a3505050505050505050565b601e547801000000000000000000000000000000000000000000000000900460ff16156140f357600181600061400a82846133ac565b6001600160a01b0386166000908152600b60209081526040808320439055600490915290205490915061403d90856137e3565b6001600160a01b038087166000908152600c602090815260408083209490945591891681526003909152205461407390836133ac565b6001600160a01b0380881660009081526003602052604080822093909355908716815220546140a290846137e3565b6001600160a01b0386166000908152600360209081526040808320939093556004905220546140d190846137e3565b6001600160a01b038616600090815260046020526040902055613e528161450f565b60008060008060008061410587612f84565b95509550955095509550955061411b8884614597565b6001600160a01b03891660009081526003602052604090205461413e90876133ac565b6001600160a01b03808b16600090815260036020908152604080832094909455918b1681526004909152205461417490846137e3565b6001600160a01b038916600090815260046020908152604080832093909355600390522054613f5090866137e3565b601e547801000000000000000000000000000000000000000000000000900460ff16156142715760018160006141d982846133ac565b6001600160a01b0386166000908152600b60209081526040808320439055600390915290205490915061420c90856137e3565b6001600160a01b038087166000908152600c602090815260408083209490945591891681526003909152205461424290836133ac565b6001600160a01b038088166000908152600360205260408082209390935590871681522054613e3090846137e3565b60008060008060008061428387612f84565b9550955095509550955095506142998886614597565b6001600160a01b038916600090815260036020526040902054613f2190876133ac565b601e547801000000000000000000000000000000000000000000000000900460ff16156143e85760018160006142f282846133ac565b6001600160a01b0386166000908152600b60209081526040808320439055600490915290205490915061432590856137e3565b6001600160a01b038087166000908152600c602090815260408083209490945591891681526003909152205461435b90836133ac565b6001600160a01b03871660009081526003602090815260408083209390935560049052205461438a90856133ac565b6001600160a01b0380881660009081526004602052604080822093909355908716815220546143b990846137e3565b6001600160a01b038616600090815260046020908152604080832093909355600390522054613e3090846137e3565b6000806000806000806143fa87612f84565b9550955095509550955095506144108886614597565b6001600160a01b03891660009081526004602052604090205461443390886133ac565b6001600160a01b038a1660009081526004602090815260408083209390935560039052205461413e90876133ac565b6000610c6082846148ec565b6001600160a01b03821660009081526008602052604081205460ff16156144965750806108d8565b61449f82610bd0565b90506108d8565b60006144c9826137546144b98787614462565b6144c38a8a614462565b906137e3565b9695505050505050565b60006108d8620186a06137546012548561446290919063ffffffff16565b60006108d8620186a06137546011548561446290919063ffffffff16565b6000614519612f61565b905060006145278383614462565b3060009081526003602052604090205490915061454490826137e3565b3060009081526003602090815260408083209390935560089052205460ff16156117fb573060009081526004602052604090205461458290846137e3565b30600090815260046020526040902055505050565b601e54790100000000000000000000000000000000000000000000000000900460ff161561104e576001600160a01b03919091166000818152601a6020908152604080832080546001808201835591855283852042910155938352601b8252822080549384018155825290200155565b600d5461461490836133ac565b600d55600e5461462490826137e3565b600e555050565b600060208083528351808285015260005b818110156146585785810183015185820160400152820161463c565b8181111561466a576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6001600160a01b038116811461105057600080fd5b600080604083850312156146c657600080fd5b82356146d18161469e565b946020939093013593505050565b6000602082840312156146f157600080fd5b8135610c608161469e565b60008060006060848603121561471157600080fd5b833561471c8161469e565b9250602084013561472c8161469e565b929592945050506040919091013590565b60006020828403121561474f57600080fd5b5035919050565b801515811461105057600080fd5b6000806040838503121561477757600080fd5b82359150602083013561478981614756565b809150509250929050565b60008083601f8401126147a657600080fd5b50813567ffffffffffffffff8111156147be57600080fd5b6020830191508360208260051b85010111156147d957600080fd5b9250929050565b600080600080604085870312156147f657600080fd5b843567ffffffffffffffff8082111561480e57600080fd5b61481a88838901614794565b9096509450602087013591508082111561483357600080fd5b5061484087828801614794565b95989497509550505050565b60006020828403121561485e57600080fd5b8135610c6081614756565b60006020828403121561487b57600080fd5b813563ffffffff81168114610c6057600080fd5b600080604083850312156148a257600080fd5b82356148ad8161469e565b915060208301356147898161469e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000816000190483118215151615614906576149066148bd565b500290565b60006020828403121561491d57600080fd5b8151610c6081614756565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082821015614969576149696148bd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006000198214156149b1576149b16148bd565b5060010190565b6000602082840312156149ca57600080fd5b8151610c608161469e565b6000602082840312156149e757600080fd5b5051919050565b600080600060608486031215614a0357600080fd5b8351925060208401519150604084015190509250925092565b600082614a52577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614aa75784516001600160a01b031683529383019391830191600101614a82565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115614adb57614adb6148bd565b50019056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220c802661d1657018414636466dc083c13ec2aabd0afaa0926787dd536a09b52b664736f6c634300080b0033

Deployed Bytecode

0x6080604052600436106102d55760003560e01c806370a0823111610179578063afcba06c116100d6578063e98391ff1161008a578063f2fde38b11610064578063f2fde38b14610872578063f429389014610892578063ffecf516146108a757600080fd5b8063e98391ff14610812578063ea2f0b3714610832578063ec28438a1461085257600080fd5b8063c9567bf9116100bb578063c9567bf914610797578063d42953b5146107ac578063dd62ed3e146107cc57600080fd5b8063afcba06c14610757578063b70143c91461077757600080fd5b80638da5cb5b1161012d57806395d89b411161011257806395d89b41146106d1578063a101223314610717578063a9059cbb1461073757600080fd5b80638da5cb5b146106895780639151d59a146106b157600080fd5b80637a52da0e1161015e5780637a52da0e1461061b57806388a65f461461063b57806388f820201461065057600080fd5b806370a08231146105e6578063715018a61461060657600080fd5b8063313ce56711610232578063473071ce116101e65780635342acb4116101c05780635342acb41461056d578063571cbe0a146105a65780635932ead1146105c657600080fd5b8063473071ce1461050d5780634c990cc71461052d57806352390c021461054d57600080fd5b80633685d419116102175780633685d419146104ad578063437823ec146104cd5780634549b039146104ed57600080fd5b8063313ce5671461047157806333a172821461048d57600080fd5b80631e9768be11610289578063273123b71161026e578063273123b71461041157806327a14fc2146104315780632d8381191461045157600080fd5b80631e9768be146103d157806323b872dd146103f157600080fd5b806314b3b077116102ba57806314b3b0771461036957806318160ddd1461038b57806319db2dcb146103b157600080fd5b806306fdde03146102e1578063095ea7b31461033957600080fd5b366102dc57005b600080fd5b3480156102ed57600080fd5b5060408051808201909152600f81527f536869656c642050726f746f636f6c000000000000000000000000000000000060208201525b604051610330919061462b565b60405180910390f35b34801561034557600080fd5b506103596103543660046146b3565b6108c7565b6040519015158152602001610330565b34801561037557600080fd5b506103896103843660046146df565b6108de565b005b34801561039757600080fd5b50683635c9adc5dea000005b604051908152602001610330565b3480156103bd57600080fd5b506103896103cc3660046146df565b61096c565b3480156103dd57600080fd5b506103896103ec3660046146df565b6109f5565b3480156103fd57600080fd5b5061035961040c3660046146fc565b610a7e565b34801561041d57600080fd5b5061038961042c3660046146df565b610ae7565b34801561043d57600080fd5b5061038961044c36600461473d565b610b62565b34801561045d57600080fd5b506103a361046c36600461473d565b610bd0565b34801561047d57600080fd5b5060405160098152602001610330565b34801561049957600080fd5b506103596104a83660046146fc565b610c67565b3480156104b957600080fd5b506103896104c83660046146df565b610d83565b3480156104d957600080fd5b506103896104e83660046146df565b611053565b3480156104f957600080fd5b506103a3610508366004614764565b6110d1565b34801561051957600080fd5b506103896105283660046146df565b611165565b34801561053957600080fd5b506103896105483660046147e0565b6111ee565b34801561055957600080fd5b506103896105683660046146df565b611304565b34801561057957600080fd5b506103596105883660046146df565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156105b257600080fd5b506103596105c13660046146fc565b611560565b3480156105d257600080fd5b506103896105e136600461484c565b611634565b3480156105f257600080fd5b506103a36106013660046146df565b6116db565b34801561061257600080fd5b506103896116e6565b34801561062757600080fd5b506103896106363660046146df565b61174c565b34801561064757600080fd5b50610389611800565b34801561065c57600080fd5b5061035961066b3660046146df565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561069557600080fd5b506000546040516001600160a01b039091168152602001610330565b3480156106bd57600080fd5b506103896106cc3660046146df565b611a84565b3480156106dd57600080fd5b5060408051808201909152600d81527f73ca9cc9aae1b487ca9fe1b485000000000000000000000000000000000000006020820152610323565b34801561072357600080fd5b506103896107323660046146df565b611b0d565b34801561074357600080fd5b506103596107523660046146b3565b611b96565b34801561076357600080fd5b5061038961077236600461473d565b611ba3565b34801561078357600080fd5b5061038961079236600461473d565b611c38565b3480156107a357600080fd5b50610389611d38565b3480156107b857600080fd5b506103896107c7366004614869565b612270565b3480156107d857600080fd5b506103a36107e736600461488f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b34801561081e57600080fd5b5061038961082d36600461484c565b61231f565b34801561083e57600080fd5b5061038961084d3660046146df565b6123c5565b34801561085e57600080fd5b5061038961086d36600461473d565b612440565b34801561087e57600080fd5b5061038961088d3660046146df565b6124ae565b34801561089e57600080fd5b5061038961258d565b3480156108b357600080fd5b506103896108c23660046146df565b612644565b60006108d43384846126ce565b5060015b92915050565b6000546001600160a01b0316331461093d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6013805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b031633146109c65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6014805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610a4f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6017805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000610a8b848484612826565b610add8433610ad885604051806060016040528060288152602001614ae1602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190612f35565b6126ce565b5060019392505050565b6000546001600160a01b03163314610b415760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b03163314610bbc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b610bca81633b9aca006148ec565b60105550565b6000600d54821115610c4a5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e73000000000000000000000000000000000000000000006064820152608401610934565b6000610c54612f61565b9050610c6083826126c2565b9392505050565b6001546000906001600160a01b03163314610cea5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063095ea7b3906044015b6020604051808303816000875af1158015610d56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7a919061490b565b95945050505050565b6000546001600160a01b03163314610ddd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03811660009081526008602052604090205460ff16610e455760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610934565b60005b600a54811015610f8157816001600160a01b0316600a8281548110610e6f57610e6f614928565b6000918252602090912001546001600160a01b03161415610f6f57600a8054610e9a90600190614957565b81548110610eaa57610eaa614928565b600091825260209091200154600a80546001600160a01b039092169183908110610ed657610ed6614928565b6000918252602080832091909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039485161790559184168152600482526040808220829055600890925220805460ff19169055600a805480610f3b57610f3b61496e565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff19169055019055610f81565b80610f798161499d565b915050610e48565b506001600160a01b0381166000908152601b6020526040902054156110505760005b6001600160a01b0382166000908152601b602052604090205481101561104e576001600160a01b0382166000908152601b60205260408120805483908110610fed57610fed614928565b906000526020600020015490506110058160006110d1565b6001600160a01b0384166000908152601b6020526040902080548490811061102f5761102f614928565b60009182526020909120015550806110468161499d565b915050610fa3565b505b50565b6000546001600160a01b031633146110ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000683635c9adc5dea0000083111561112c5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610934565b8161114b57600061113c84612f84565b509395506108d8945050505050565b600061115684612f84565b509295506108d8945050505050565b6001546001600160a01b031633146111e55760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b61105081612fd3565b6000546001600160a01b031633146112485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b8281146112975760405162461bcd60e51b815260206004820152601460248201527f4c656e6774687320646f6e2774206d617463682e0000000000000000000000006044820152606401610934565b60005b838110156112fd576112eb338686848181106112b8576112b8614928565b90506020020160208101906112cd91906146df565b8585858181106112df576112df614928565b90506020020135613264565b806112f58161499d565b91505061129a565b5050505050565b6000546001600160a01b0316331461135e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03811660009081526008602052604090205460ff16156113c75760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610934565b6001600160a01b0381166000908152601b6020526040902054156114935760005b6001600160a01b0382166000908152601b6020526040902054811015611491576001600160a01b0382166000908152601b6020526040812080548390811061143257611432614928565b9060005260206000200154905061144881610bd0565b6001600160a01b0384166000908152601b6020526040902080548490811061147257611472614928565b60009182526020909120015550806114898161499d565b9150506113e8565b505b6001600160a01b038116600090815260036020526040902054156114ed576001600160a01b0381166000908152600360205260409020546114d390610bd0565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600860205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a801805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b6001546000906001600160a01b031633146115e35760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063a9059cbb90604401610d37565b6000546001600160a01b0316331461168e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e805491151577010000000000000000000000000000000000000000000000027fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b60006108d88261330a565b6000546001600160a01b031633146117405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b61174a600061334f565b565b6001546001600160a01b031633146117cc5760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b476117d682612fd3565b60006117e247836133ac565b6001549091506117fb906001600160a01b0316826133b8565b505050565b6001546001600160a01b031633146118805760405162461bcd60e51b815260206004820152603260248201527f546f6b656e436c61776261636b3a2063616c6c6572206973206e6f742074686560448201527f20455243323020636f6e74726f6c6c65722e00000000000000000000000000006064820152608401610934565b600254604080517fad5c464800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156118e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190791906149b8565b90506000600260009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561195e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198291906149b8565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156119e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0991906149d5565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b03841690632e1a7d4d90602401600060405180830381600087803b158015611a6757600080fd5b505af1158015611a7b573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b03163314611ade5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6016805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611b675760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6015805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60006108d4338484612826565b6000546001600160a01b03163314611bfd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601f80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6013546001600160a01b0316336001600160a01b03161480611c6d57506014546001600160a01b0316336001600160a01b0316145b80611c8b57506015546001600160a01b0316336001600160a01b0316145b80611ca957506016546001600160a01b0316336001600160a01b0316145b80611cc757506017546001600160a01b0316336001600160a01b0316145b80611cdc57506000546001600160a01b031633145b611ce557600080fd5b6000611cfa683635c9adc5dea00000836126c2565b611d03306134d1565b1115611d2357611d1c683635c9adc5dea00000836126c2565b9050611d2f565b611d2c306134d1565b90505b61104e81613530565b6000546001600160a01b03163314611d925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e5474010000000000000000000000000000000000000000900460ff1615611dfd5760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610934565b601d805473ffffffffffffffffffffffffffffffffffffffff1916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155611e473082683635c9adc5dea000006126ce565b806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea991906149b8565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ef6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1a91906149b8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa391906149b8565b601e80546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff19918216811783556000908152600860205260408120805460ff191660019081179091559254600a805494850181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a89092018054909116918316919091179055601d541663f305d719473061203f816116db565b6000806120546000546001600160a01b031690565b60405160e088901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156120d4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120f991906149ee565b5050601e8054770101000000000000000000000000000000000000000000007fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff90911617905550601f80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001662093a80179055612181683635c9adc5dea0000060c86126c2565b600f55612198683635c9adc5dea0000060646126c2565b601055601e8054740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82161790915543601855601d546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af115801561224c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104e919061490b565b6000546001600160a01b031633146122ca5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e805463ffffffff9092167a010000000000000000000000000000000000000000000000000000027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000546001600160a01b031633146123795760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b601e8054911515760100000000000000000000000000000000000000000000027fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000546001600160a01b0316331461241f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b0316331461249a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6124a881633b9aca006148ec565b600f5550565b6000546001600160a01b031633146125085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b0381166125845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610934565b6110508161334f565b6013546001600160a01b0316336001600160a01b031614806125c257506014546001600160a01b0316336001600160a01b0316145b806125e057506015546001600160a01b0316336001600160a01b0316145b806125fe57506016546001600160a01b0316336001600160a01b0316145b8061261c57506017546001600160a01b0316336001600160a01b0316145b8061263157506000546001600160a01b031633145b61263a57600080fd5b4761105081613733565b6000546001600160a01b0316331461269e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610934565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000610c608284614a1c565b6001600160a01b0383166127495760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610934565b6001600160a01b0382166127c55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610934565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166128a25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610934565b6001600160a01b03821661291e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610934565b600081116129945760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610934565b613200601155610c80601255601e80547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff1690556000546001600160a01b038481169116148015906129f457506000546001600160a01b03838116911614155b8015612a0957506001600160a01b0383163014155b8015612a2e57506001600160a01b03821660009081526006602052604090205460ff16155b8015612a5357506001600160a01b03831660009081526006602052604090205460ff16155b15612f1f576001600160a01b03821660009081526007602052604090205460ff16158015612a9a57506001600160a01b03831660009081526007602052604090205460ff16155b612ae65760405162461bcd60e51b815260206004820152600860248201527f4e6f20626f74732e0000000000000000000000000000000000000000000000006044820152606401610934565b601e80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff167901000000000000000000000000000000000000000000000000001790556001600160a01b0383166000908152601c6020526040902054612b4d90826137e3565b6001600160a01b038085166000818152601c6020526040902092909255601e5416148015612b895750601d546001600160a01b03838116911614155b8015612bb257506001600160a01b0382167368b3465833fb72a70ecdf485e0e4c7bd8665fc4514155b15612d1d57601e5477010000000000000000000000000000000000000000000000900460ff1615612c45576001600160a01b038216600090815260096020526040902054431415612c455760405162461bcd60e51b815260206004820152601160248201527f4f6e652074782070657220626c6f636b2e0000000000000000000000000000006044820152606401610934565b6001600160a01b03821660009081526009602052604090204390819055601854612c709060026137e3565b1115612cca57620186a06011556000601255601e80547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000179055612f2a565b612cd482826137ef565b601e80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16790100000000000000000000000000000000000000000000000000179055612f2a565b601e546001600160a01b038381169116148015612d485750601d546001600160a01b03848116911614155b15612f0e57601e80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff169081905577010000000000000000000000000000000000000000000000900460ff1615612e02576001600160a01b038316600090815260096020526040902054431415612e025760405162461bcd60e51b815260206004820152601160248201527f4f6e652074782070657220626c6f636b2e0000000000000000000000000000006044820152606401610934565b6001600160a01b0383166000526009602052600f54811115612e665760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e000000006044820152606401610934565b6000612e71306134d1565b601954601e5491925082101590760100000000000000000000000000000000000000000000900460ff168015612ea45750805b8015612ecc5750601e547501000000000000000000000000000000000000000000900460ff16155b8015612edb5750612edb6138a6565b15612efd57612eeb601954613530565b478015612efb57612efb47613733565b505b5050612f0983826138d8565b612f2a565b613200601155610c80601255612f2a565b600060118190556012555b6117fb838383613264565b60008184841115612f595760405162461bcd60e51b8152600401610934919061462b565b505050900390565b6000806000612f6e613afe565b9092509050612f7d82826126c2565b9250505090565b6000806000806000806000806000612f9b8a613c9a565b9250925092506000806000612fb98d8686612fb4612f61565b613cdc565b919f909e50909c50959a5093985091965092945050505050565b60408051600280825260608201835283926000929190602083019080368337019050509050828160008151811061300c5761300c614928565b6001600160a01b03928316602091820292909201810191909152600254604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa15801561307e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a291906149b8565b816001815181106130b5576130b5614928565b6001600160a01b0392831660209182029290920101526040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918416906370a0823190602401602060405180830381865afa158015613123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314791906149d5565b6002546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810183905291925084169063095ea7b3906044016020604051808303816000875af11580156131b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d9919061490b565b506002546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac9479061322c908490600090879030904290600401614a57565b600060405180830381600087803b15801561324657600080fd5b505af115801561325a573d6000803e3d6000fd5b5050505050505050565b6001600160a01b0380841660009081526008602052604080822054928516825290205460ff9182169116818015613299575080155b156132ae576132a9858585613d2c565b6112fd565b811580156132b95750805b156132c9576132a9858585613fd4565b811580156132d5575080155b156132e5576132a98585856141a3565b8180156132ef5750805b156132ff576132a98585856142bc565b6112fd8585856141a3565b6001600160a01b0381166000908152600b602052604081205443141561334657506001600160a01b03166000908152600c602052604090205490565b6108d8826134d1565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610c608284614957565b804710156134085760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610934565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613455576040519150601f19603f3d011682016040523d82523d6000602084013e61345a565b606091505b50509050806117fb5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610934565b6001600160a01b03811660009081526008602052604081205460ff161561350e57506001600160a01b031660009081526004602052604090205490565b6001600160a01b0382166000908152600360205260409020546108d890610bd0565b601e80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000017905560115460125460408051600280825260608201835260009260208301908036833701905050905030816000815181106135ab576135ab614928565b6001600160a01b03928316602091820292909201810191909152601d54604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa15801561361d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061364191906149b8565b8160018151811061365457613654614928565b6001600160a01b039283166020918202929092010152601d5461367a91309116866126ce565b601d546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac947906136cc908790600090869030904290600401614a57565b600060405180830381600087803b1580156136e657600080fd5b505af11580156136fa573d6000803e3d6000fd5b5050601e80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550505060119190915560125550565b60135461375f906001600160a01b031661375a6103206137548560f4614462565b906126c2565b6133b8565b601454613780906001600160a01b031661375a6103206137548560a6614462565b6015546137a1906001600160a01b031661375a6103206137548560c8614462565b6016546137c2906001600160a01b031661375a61032061375485605a614462565b601754611050906001600160a01b031661375a610320613754856064614462565b6000610c608284614ac8565b600f548111156138415760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e000000006044820152606401610934565b6010548161384e846134d1565b6138589190614ac8565b111561104e5760405162461bcd60e51b815260206004820152601760248201527f4f766572206d61782077616c6c657420616d6f756e742e0000000000000000006044820152606401610934565b601e546000907a010000000000000000000000000000000000000000000000000000900463ffffffff165a1015905090565b6001600160a01b0382166000908152601c6020526040812054819081908190819061390390876133ac565b90506000805b6001600160a01b0389166000908152601a6020526040902054811015613acd576001600160a01b0389166000908152601a6020526040812080548390811061395357613953614928565b9060005260206000200154905060006139ac8b601b60008e6001600160a01b03166001600160a01b03168152602001908152602001600020858154811061399c5761399c614928565b906000526020600020015461446e565b90506000846139cf576139bf89836137e3565b98508589106139cf575060019350835b8415613ab75760008082156139f2576139e88b896133ac565b9150819b50613a02565b8391506139ff8c836137e3565b9b505b8c8c10613a2457613a1d613a168d8f6133ac565b83906133ac565b9150600190505b601f54600090613a5d90613a54906103e890613a4e9067ffffffffffffffff16613754428c6133ac565b90614462565b613e80906133ac565b9050612710811015613a6e57506127105b8a613a7e57809a50829950613aa2565b6000613a8a8b856137e3565b90506000613a9b8c8e8786866144a6565b9c50909a50505b8115613ab357505050505050613acd565b5050505b5050508080613ac59061499d565b915050613909565b50613ade600a613754866008614462565b601155613af1600a613754866002614462565b6012555050505050505050565b600d546000908190683635c9adc5dea00000825b600a54811015613c5d578260036000600a8481548110613b3457613b34614928565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613b9f57508160046000600a8481548110613b7857613b78614928565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613bbb575050600d5493683635c9adc5dea000009350915050565b613c0160036000600a8481548110613bd557613bd5614928565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906133ac565b9250613c4960046000600a8481548110613c1d57613c1d614928565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906133ac565b915080613c558161499d565b915050613b12565b50600d54613c7490683635c9adc5dea000006126c2565b821015613c91575050600d5492683635c9adc5dea0000092509050565b90939092509050565b600080600080613ca9856144d3565b90506000613cb6866144f1565b90506000613cce82613cc889866133ac565b906133ac565b979296509094509092505050565b6000808080613ceb8886614462565b90506000613cf98887614462565b90506000613d078888614462565b90506000613d1982613cc886866133ac565b939b939a50919850919650505050505050565b601e547801000000000000000000000000000000000000000000000000900460ff1615613ea7576001816000613d6282846133ac565b6001600160a01b0386166000908152600b602090815260408083204390556003909152902054909150613d9590856137e3565b6001600160a01b038087166000908152600c6020908152604080832094909455918916815260039091522054613dcb90836133ac565b6001600160a01b038716600090815260036020908152604080832093909355600490522054613dfa90856133ac565b6001600160a01b03808816600090815260046020908152604080832094909455918816815260039091522054613e3090846137e3565b6001600160a01b038616600090815260036020526040902055613e528161450f565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613e9791815260200190565b60405180910390a3505050505050565b600080600080600080613eb987612f84565b955095509550955095509550613ecf8886614597565b6001600160a01b038916600090815260046020526040902054613ef290886133ac565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054613f2190876133ac565b6001600160a01b03808b1660009081526003602052604080822093909355908a1681522054613f5090866137e3565b6001600160a01b038916600090815260036020526040902055613f728161450f565b613f7c8483614607565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613fc191815260200190565b60405180910390a3505050505050505050565b601e547801000000000000000000000000000000000000000000000000900460ff16156140f357600181600061400a82846133ac565b6001600160a01b0386166000908152600b60209081526040808320439055600490915290205490915061403d90856137e3565b6001600160a01b038087166000908152600c602090815260408083209490945591891681526003909152205461407390836133ac565b6001600160a01b0380881660009081526003602052604080822093909355908716815220546140a290846137e3565b6001600160a01b0386166000908152600360209081526040808320939093556004905220546140d190846137e3565b6001600160a01b038616600090815260046020526040902055613e528161450f565b60008060008060008061410587612f84565b95509550955095509550955061411b8884614597565b6001600160a01b03891660009081526003602052604090205461413e90876133ac565b6001600160a01b03808b16600090815260036020908152604080832094909455918b1681526004909152205461417490846137e3565b6001600160a01b038916600090815260046020908152604080832093909355600390522054613f5090866137e3565b601e547801000000000000000000000000000000000000000000000000900460ff16156142715760018160006141d982846133ac565b6001600160a01b0386166000908152600b60209081526040808320439055600390915290205490915061420c90856137e3565b6001600160a01b038087166000908152600c602090815260408083209490945591891681526003909152205461424290836133ac565b6001600160a01b038088166000908152600360205260408082209390935590871681522054613e3090846137e3565b60008060008060008061428387612f84565b9550955095509550955095506142998886614597565b6001600160a01b038916600090815260036020526040902054613f2190876133ac565b601e547801000000000000000000000000000000000000000000000000900460ff16156143e85760018160006142f282846133ac565b6001600160a01b0386166000908152600b60209081526040808320439055600490915290205490915061432590856137e3565b6001600160a01b038087166000908152600c602090815260408083209490945591891681526003909152205461435b90836133ac565b6001600160a01b03871660009081526003602090815260408083209390935560049052205461438a90856133ac565b6001600160a01b0380881660009081526004602052604080822093909355908716815220546143b990846137e3565b6001600160a01b038616600090815260046020908152604080832093909355600390522054613e3090846137e3565b6000806000806000806143fa87612f84565b9550955095509550955095506144108886614597565b6001600160a01b03891660009081526004602052604090205461443390886133ac565b6001600160a01b038a1660009081526004602090815260408083209390935560039052205461413e90876133ac565b6000610c6082846148ec565b6001600160a01b03821660009081526008602052604081205460ff16156144965750806108d8565b61449f82610bd0565b90506108d8565b60006144c9826137546144b98787614462565b6144c38a8a614462565b906137e3565b9695505050505050565b60006108d8620186a06137546012548561446290919063ffffffff16565b60006108d8620186a06137546011548561446290919063ffffffff16565b6000614519612f61565b905060006145278383614462565b3060009081526003602052604090205490915061454490826137e3565b3060009081526003602090815260408083209390935560089052205460ff16156117fb573060009081526004602052604090205461458290846137e3565b30600090815260046020526040902055505050565b601e54790100000000000000000000000000000000000000000000000000900460ff161561104e576001600160a01b03919091166000818152601a6020908152604080832080546001808201835591855283852042910155938352601b8252822080549384018155825290200155565b600d5461461490836133ac565b600d55600e5461462490826137e3565b600e555050565b600060208083528351808285015260005b818110156146585785810183015185820160400152820161463c565b8181111561466a576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6001600160a01b038116811461105057600080fd5b600080604083850312156146c657600080fd5b82356146d18161469e565b946020939093013593505050565b6000602082840312156146f157600080fd5b8135610c608161469e565b60008060006060848603121561471157600080fd5b833561471c8161469e565b9250602084013561472c8161469e565b929592945050506040919091013590565b60006020828403121561474f57600080fd5b5035919050565b801515811461105057600080fd5b6000806040838503121561477757600080fd5b82359150602083013561478981614756565b809150509250929050565b60008083601f8401126147a657600080fd5b50813567ffffffffffffffff8111156147be57600080fd5b6020830191508360208260051b85010111156147d957600080fd5b9250929050565b600080600080604085870312156147f657600080fd5b843567ffffffffffffffff8082111561480e57600080fd5b61481a88838901614794565b9096509450602087013591508082111561483357600080fd5b5061484087828801614794565b95989497509550505050565b60006020828403121561485e57600080fd5b8135610c6081614756565b60006020828403121561487b57600080fd5b813563ffffffff81168114610c6057600080fd5b600080604083850312156148a257600080fd5b82356148ad8161469e565b915060208301356147898161469e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000816000190483118215151615614906576149066148bd565b500290565b60006020828403121561491d57600080fd5b8151610c6081614756565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082821015614969576149696148bd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006000198214156149b1576149b16148bd565b5060010190565b6000602082840312156149ca57600080fd5b8151610c608161469e565b6000602082840312156149e757600080fd5b5051919050565b600080600060608486031215614a0357600080fd5b8351925060208401519150604084015190509250925092565b600082614a52577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614aa75784516001600160a01b031683529383019391830191600101614a82565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115614adb57614adb6148bd565b50019056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220c802661d1657018414636466dc083c13ec2aabd0afaa0926787dd536a09b52b664736f6c634300080b0033

Deployed Bytecode Sourcemap

31609:35240:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36287:83;;;;;;;;;;-1:-1:-1;36357:5:0;;;;;;;;;;;;;;;;;36287:83;;;;;;;:::i;:::-;;;;;;;;37193:193;;;;;;;;;;-1:-1:-1;37193:193:0;;;;;:::i;:::-;;:::i;:::-;;;1319:14:1;;1312:22;1294:41;;1282:2;1267:18;37193:193:0;1154:187:1;44702:116:0;;;;;;;;;;-1:-1:-1;44702:116:0;;;;;:::i;:::-;;:::i;:::-;;36564:95;;;;;;;;;;-1:-1:-1;32342:21:0;36564:95;;;1744:25:1;;;1732:2;1717:18;36564:95:0;1598:177:1;44949:116:0;;;;;;;;;;-1:-1:-1;44949:116:0;;;;;:::i;:::-;;:::i;45690:::-;;;;;;;;;;-1:-1:-1;45690:116:0;;;;;:::i;:::-;;:::i;37394:446::-;;;;;;;;;;-1:-1:-1;37394:446:0;;;;;:::i;:::-;;:::i;47503:91::-;;;;;;;;;;-1:-1:-1;47503:91:0;;;;;:::i;:::-;;:::i;44119:115::-;;;;;;;;;;-1:-1:-1;44119:115:0;;;;;:::i;:::-;;:::i;50828:253::-;;;;;;;;;;-1:-1:-1;50828:253:0;;;;;:::i;:::-;;:::i;36473:83::-;;;;;;;;;;-1:-1:-1;36473:83:0;;34171:1;2568:36:1;;2556:2;2541:18;36473:83:0;2426:184:1;28849:273:0;;;;;;;;;;-1:-1:-1;28849:273:0;;;;;:::i;:::-;;:::i;64294:1085::-;;;;;;;;;;-1:-1:-1;64294:1085:0;;;;;:::i;:::-;;:::i;66316:111::-;;;;;;;;;;-1:-1:-1;66316:111:0;;;;;:::i;:::-;;:::i;50384:436::-;;;;;;;;;;-1:-1:-1;50384:436:0;;;;;:::i;:::-;;:::i;29513:112::-;;;;;;;;;;-1:-1:-1;29513:112:0;;;;;:::i;:::-;;:::i;66557:287::-;;;;;;;;;;-1:-1:-1;66557:287:0;;;;;:::i;:::-;;:::i;63572:714::-;;;;;;;;;;-1:-1:-1;63572:714:0;;;;;:::i;:::-;;:::i;65815:124::-;;;;;;;;;;-1:-1:-1;65815:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;65904:27:0;65880:4;65904:27;;;:18;:27;;;;;;;;;65815:124;29183:279;;;;;;;;;;-1:-1:-1;29183:279:0;;;;;:::i;:::-;;:::i;37951:101::-;;;;;;;;;;-1:-1:-1;37951:101:0;;;;;:::i;:::-;;:::i;36667:119::-;;;;;;;;;;-1:-1:-1;36667:119:0;;;;;:::i;:::-;;:::i;21158:103::-;;;;;;;;;;;;;:::i;30264:388::-;;;;;;;;;;-1:-1:-1;30264:388:0;;;;;:::i;:::-;;:::i;30724:249::-;;;;;;;;;;;;;:::i;49399:130::-;;;;;;;;;;-1:-1:-1;49399:130:0;;;;;:::i;:::-;-1:-1:-1;;;;;49491:30:0;49467:4;49491:30;;;:21;:30;;;;;;;;;49399:130;20507:87;;;;;;;;;;-1:-1:-1;20553:7:0;20580:6;20507:87;;-1:-1:-1;;;;;20580:6:0;;;4594:74:1;;4582:2;4567:18;20507:87:0;4448:226:1;45443:116:0;;;;;;;;;;-1:-1:-1;45443:116:0;;;;;:::i;:::-;;:::i;36378:87::-;;;;;;;;;;-1:-1:-1;36450:7:0;;;;;;;;;;;;;;;;;36378:87;;45196:116;;;;;;;;;;-1:-1:-1;45196:116:0;;;;;:::i;:::-;;:::i;36794:199::-;;;;;;;;;;-1:-1:-1;36794:199:0;;;;;:::i;:::-;;:::i;53336:110::-;;;;;;;;;;-1:-1:-1;53336:110:0;;;;;:::i;:::-;;:::i;48207:346::-;;;;;;;;;;-1:-1:-1;48207:346:0;;;;;:::i;:::-;;:::i;45869:1320::-;;;;;;;;;;;;;:::i;47883:96::-;;;;;;;;;;-1:-1:-1;47883:96:0;;;;;:::i;:::-;;:::i;37001:184::-;;;;;;;;;;-1:-1:-1;37001:184:0;;;;;:::i;:::-;-1:-1:-1;;;;;37150:18:0;;;37118:7;37150:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;37001:184;42394:104;;;;;;;;;;-1:-1:-1;42394:104:0;;;;;:::i;:::-;;:::i;66439:110::-;;;;;;;;;;-1:-1:-1;66439:110:0;;;;;:::i;:::-;;:::i;43878:107::-;;;;;;;;;;-1:-1:-1;43878:107:0;;;;;:::i;:::-;;:::i;21416:201::-;;;;;;;;;;-1:-1:-1;21416:201:0;;;;;:::i;:::-;;:::i;48657:157::-;;;;;;;;;;;;;:::i;47300:90::-;;;;;;;;;;-1:-1:-1;47300:90:0;;;;;:::i;:::-;;:::i;37193:193::-;37295:4;37317:39;9260:10;37340:7;37349:6;37317:8;:39::i;:::-;-1:-1:-1;37374:4:0;37193:193;;;;;:::o;44702:116::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;;;;;;;;;44774:15:::1;:36:::0;;-1:-1:-1;;44774:36:0::1;-1:-1:-1::0;;;;;44774:36:0;;;::::1;::::0;;;::::1;::::0;;44702:116::o;44949:::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;45021:15:::1;:36:::0;;-1:-1:-1;;45021:36:0::1;-1:-1:-1::0;;;;;45021:36:0;;;::::1;::::0;;;::::1;::::0;;44949:116::o;45690:::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;45762:15:::1;:36:::0;;-1:-1:-1;;45762:36:0::1;-1:-1:-1::0;;;;;45762:36:0;;;::::1;::::0;;;::::1;::::0;;45690:116::o;37394:446::-;37526:4;37543:36;37553:6;37561:9;37572:6;37543:9;:36::i;:::-;37590:220;37613:6;9260:10;37661:138;37717:6;37661:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37661:19:0;;;;;;:11;:19;;;;;;;;9260:10;37661:33;;;;;;;;;;:37;:138::i;:::-;37590:8;:220::i;:::-;-1:-1:-1;37828:4:0;37394:446;;;;;:::o;47503:91::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;-1:-1:-1;;;;;47565:13:0::1;47581:5;47565:13:::0;;;:5:::1;:13;::::0;;;;:21;;-1:-1:-1;;47565:21:0::1;::::0;;47503:91::o;44119:115::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;44212:14:::1;:6:::0;44221:5:::1;44212:14;:::i;:::-;44193:16;:33:::0;-1:-1:-1;44119:115:0:o;50828:253::-;50894:7;50933;;50922;:18;;50914:73;;;;-1:-1:-1;;;50914:73:0;;6338:2:1;50914:73:0;;;6320:21:1;6377:2;6357:18;;;6350:30;6416:34;6396:18;;;6389:62;6487:12;6467:18;;;6460:40;6517:19;;50914:73:0;6136:406:1;50914:73:0;50998:19;51021:10;:8;:10::i;:::-;50998:33;-1:-1:-1;51049:24:0;:7;50998:33;51049:11;:24::i;:::-;51042:31;50828:253;-1:-1:-1;;;50828:253:0:o;28849:273::-;28670:11;;29001:4;;-1:-1:-1;;;;;28670:11:0;9260:10;28670:27;28648:127;;;;-1:-1:-1;;;28648:127:0;;6749:2:1;28648:127:0;;;6731:21:1;6788:2;6768:18;;;6761:30;6827:34;6807:18;;;6800:62;6898:20;6878:18;;;6871:48;6936:19;;28648:127:0;6547:414:1;28648:127:0;29078:36:::1;::::0;;;;-1:-1:-1;;;;;7158:55:1;;;29078:36:0::1;::::0;::::1;7140:74:1::0;7230:18;;;7223:34;;;29046:13:0;;29078:19;;::::1;::::0;::::1;::::0;7113:18:1;;29078:36:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29071:43:::0;28849:273;-1:-1:-1;;;;;28849:273:0:o;64294:1085::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;-1:-1:-1;;;;;64376:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;64368:70;;;::::0;-1:-1:-1;;;64368:70:0;;7720:2:1;64368:70:0::1;::::0;::::1;7702:21:1::0;7759:2;7739:18;;;7732:30;7798:29;7778:18;;;7771:57;7845:18;;64368:70:0::1;7518:351:1::0;64368:70:0::1;64454:9;64449:337;64473:9;:16:::0;64469:20;::::1;64449:337;;;64531:7;-1:-1:-1::0;;;;;64515:23:0::1;:9;64525:1;64515:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;64515:12:0::1;:23;64511:264;;;64574:9;64584:16:::0;;:20:::1;::::0;64603:1:::1;::::0;64584:20:::1;:::i;:::-;64574:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;64559:9:::1;:12:::0;;-1:-1:-1;;;;;64574:31:0;;::::1;::::0;64569:1;;64559:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;64559:46:0::1;-1:-1:-1::0;;;;;64559:46:0;;::::1;;::::0;;64624:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;64663:21:::1;:30:::0;;;;:38;;-1:-1:-1;;64663:38:0::1;::::0;;64720:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;64720:15:0;;;;;-1:-1:-1;;64720:15:0::1;::::0;;;;;64754:5:::1;;64511:264;64491:3:::0;::::1;::::0;::::1;:::i;:::-;;;;64449:337;;;-1:-1:-1::0;;;;;;64901:16:0;::::1;64927:1;64901:16:::0;;;:7:::1;:16;::::0;;;;:23;:27;64898:474:::1;;64949:6;64945:416;-1:-1:-1::0;;;;;64965:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:23;64961:27;::::1;64945:416;;;-1:-1:-1::0;;;;;65028:16:0;::::1;65014:11;65028:16:::0;;;:7:::1;:16;::::0;;;;:19;;65045:1;;65028:19;::::1;;;;;:::i;:::-;;;;;;;;;65014:33;;65314:31;65334:3;65339:5;65314:19;:31::i;:::-;-1:-1:-1::0;;;;;65292:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:19;;65309:1;;65292:19;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:53:::0;-1:-1:-1;64990:3:0;::::1;::::0;::::1;:::i;:::-;;;;64945:416;;;;64898:474;64294:1085:::0;:::o;66316:111::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;-1:-1:-1;;;;;66385:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;66385:34:0::1;66415:4;66385:34;::::0;;66316:111::o;50384:436::-;50474:7;32342:21;50502:7;:18;;50494:62;;;;-1:-1:-1;;;50494:62:0;;8784:2:1;50494:62:0;;;8766:21:1;8823:2;8803:18;;;8796:30;8862:33;8842:18;;;8835:61;8913:18;;50494:62:0;8582:355:1;50494:62:0;50572:17;50567:246;;50607:15;50631:19;50642:7;50631:10;:19::i;:::-;-1:-1:-1;50606:44:0;;-1:-1:-1;50665:14:0;;-1:-1:-1;;;;;50665:14:0;50567:246;50714:23;50745:19;50756:7;50745:10;:19::i;:::-;-1:-1:-1;50712:52:0;;-1:-1:-1;50779:22:0;;-1:-1:-1;;;;;50779:22:0;29513:112;28670:11;;-1:-1:-1;;;;;28670:11:0;9260:10;28670:27;28648:127;;;;-1:-1:-1;;;28648:127:0;;6749:2:1;28648:127:0;;;6731:21:1;6788:2;6768:18;;;6761:30;6827:34;6807:18;;;6800:62;6898:20;6878:18;;;6871:48;6936:19;;28648:127:0;6547:414:1;28648:127:0;29597:20:::1;29603:13;29597:5;:20::i;66557:287::-:0;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;66666:25;;::::1;66658:58;;;::::0;-1:-1:-1;;;66658:58:0;;9144:2:1;66658:58:0::1;::::0;::::1;9126:21:1::0;9183:2;9163:18;;;9156:30;9222:22;9202:18;;;9195:50;9262:18;;66658:58:0::1;8942:344:1::0;66658:58:0::1;66731:6;66727:110;66743:15:::0;;::::1;66727:110;;;66780:45;9260:10:::0;66809:4:::1;;66814:1;66809:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;66818:3;;66822:1;66818:6;;;;;;;:::i;:::-;;;;;;;66780:14;:45::i;:::-;66760:3:::0;::::1;::::0;::::1;:::i;:::-;;;;66727:110;;;;66557:287:::0;;;;:::o;63572:714::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;-1:-1:-1;;;;;63655:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;63654:31;63646:71;;;::::0;-1:-1:-1;;;63646:71:0;;9493:2:1;63646:71:0::1;::::0;::::1;9475:21:1::0;9532:2;9512:18;;;9505:30;9571:29;9551:18;;;9544:57;9618:18;;63646:71:0::1;9291:351:1::0;63646:71:0::1;-1:-1:-1::0;;;;;63831:16:0;::::1;63857:1;63831:16:::0;;;:7:::1;:16;::::0;;;;:23;:27;63828:241:::1;;63879:6;63875:183;-1:-1:-1::0;;;;;63895:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:23;63891:27;::::1;63875:183;;;-1:-1:-1::0;;;;;63958:16:0;::::1;63944:11;63958:16:::0;;;:7:::1;:16;::::0;;;;:19;;63975:1;;63958:19;::::1;;;;;:::i;:::-;;;;;;;;;63944:33;;64018:24;64038:3;64018:19;:24::i;:::-;-1:-1:-1::0;;;;;63996:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:19;;64013:1;;63996:19;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:46:::0;-1:-1:-1;63920:3:0;::::1;::::0;::::1;:::i;:::-;;;;63875:183;;;;63828:241;-1:-1:-1::0;;;;;64092:16:0;::::1;64111:1;64092:16:::0;;;:7:::1;:16;::::0;;;;;:20;64089:108:::1;;-1:-1:-1::0;;;;;64168:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;64148:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;64129:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;64089:108:::1;-1:-1:-1::0;;;;;64207:30:0::1;;::::0;;;:21:::1;:30;::::0;;;;:37;;-1:-1:-1;;64207:37:0::1;64240:4;64207:37:::0;;::::1;::::0;;;64255:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;64255:23:0::1;::::0;;::::1;::::0;;63572:714::o;29183:279::-;28670:11;;29338:4;;-1:-1:-1;;;;;28670:11:0;9260:10;28670:27;28648:127;;;;-1:-1:-1;;;28648:127:0;;6749:2:1;28648:127:0;;;6731:21:1;6788:2;6768:18;;;6761:30;6827:34;6807:18;;;6800:62;6898:20;6878:18;;;6871:48;6936:19;;28648:127:0;6547:414:1;28648:127:0;29415:39:::1;::::0;;;;-1:-1:-1;;;;;7158:55:1;;;29415:39:0::1;::::0;::::1;7140:74:1::0;7230:18;;;7223:34;;;29383:13:0;;29415:20;;::::1;::::0;::::1;::::0;7113:18:1;;29415:39:0::1;6966:297:1::0;37951:101:0;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;38021:15:::1;:23:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;37951:101::o;36667:119::-;36733:7;36760:18;36770:7;36760:9;:18::i;21158:103::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;21223:30:::1;21250:1;21223:18;:30::i;:::-;21158:103::o:0;30264:388::-;28670:11;;-1:-1:-1;;;;;28670:11:0;9260:10;28670:27;28648:127;;;;-1:-1:-1;;;28648:127:0;;6749:2:1;28648:127:0;;;6731:21:1;6788:2;6768:18;;;6761:30;6827:34;6807:18;;;6800:62;6898:20;6878:18;;;6871:48;6936:19;;28648:127:0;6547:414:1;28648:127:0;30395:21:::1;30427:20;30433:13:::0;30427:5:::1;:20::i;:::-;30458:11;30472:33;:21;30498:6:::0;30472:25:::1;:33::i;:::-;30626:11;::::0;30458:47;;-1:-1:-1;30608:36:0::1;::::0;-1:-1:-1;;;;;30626:11:0::1;30458:47:::0;30608:9:::1;:36::i;:::-;30367:285;;30264:388:::0;:::o;30724:249::-;28670:11;;-1:-1:-1;;;;;28670:11:0;9260:10;28670:27;28648:127;;;;-1:-1:-1;;;28648:127:0;;6749:2:1;28648:127:0;;;6731:21:1;6788:2;6768:18;;;6761:30;6827:34;6807:18;;;6800:62;6898:20;6878:18;;;6871:48;6936:19;;28648:127:0;6547:414:1;28648:127:0;30814:7:::1;::::0;:14:::1;::::0;;;;;;;30795:10:::1;::::0;-1:-1:-1;;;;;30814:7:0::1;::::0;:12:::1;::::0;:14:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:7;:14:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30795:34;;30840:14;30864:7;;;;;;;;;-1:-1:-1::0;;;;;30864:7:0::1;-1:-1:-1::0;;;;;30864:12:0::1;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30904:32;::::0;;;;30930:4:::1;30904:32;::::0;::::1;4594:74:1::0;30840:39:0;;-1:-1:-1;30890:11:0::1;::::0;-1:-1:-1;;;;;30904:17:0;::::1;::::0;::::1;::::0;4567:18:1;;30904:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30947:18;::::0;;;;::::1;::::0;::::1;1744:25:1::0;;;30890:46:0;;-1:-1:-1;;;;;;30947:13:0;::::1;::::0;::::1;::::0;1717:18:1;;30947::0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30784:189;;;30724:249::o:0;45443:116::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;45515:15:::1;:36:::0;;-1:-1:-1;;45515:36:0::1;-1:-1:-1::0;;;;;45515:36:0;;;::::1;::::0;;;::::1;::::0;;45443:116::o;45196:::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;45268:15:::1;:36:::0;;-1:-1:-1;;45268:36:0::1;-1:-1:-1::0;;;;;45268:36:0;;;::::1;::::0;;;::::1;::::0;;45196:116::o;36794:199::-;36899:4;36921:42;9260:10;36945:9;36956:6;36921:9;:42::i;53336:110::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;53408:14:::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;53336:110::o;48207:346::-;34908:15;;-1:-1:-1;;;;;34908:15:0;9260:10;-1:-1:-1;;;;;34892:31:0;;:83;;;-1:-1:-1;34960:15:0;;-1:-1:-1;;;;;34960:15:0;9260:10;-1:-1:-1;;;;;34944:31:0;;34892:83;:135;;;-1:-1:-1;35012:15:0;;-1:-1:-1;;;;;35012:15:0;9260:10;-1:-1:-1;;;;;34996:31:0;;34892:135;:187;;;-1:-1:-1;35064:15:0;;-1:-1:-1;;;;;35064:15:0;9260:10;-1:-1:-1;;;;;35048:31:0;;34892:187;:239;;;-1:-1:-1;35116:15:0;;-1:-1:-1;;;;;35116:15:0;9260:10;-1:-1:-1;;;;;35100:31:0;;34892:239;:283;;;-1:-1:-1;20553:7:0;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;35152:23;34892:283;34870:316;;;;;;48315:12:::1;48371:20;32342:21;48383:7:::0;48371:11:::1;:20::i;:::-;48342:26;48362:4;48342:11;:26::i;:::-;:49;48338:175;;;48415:20;32342:21;48427:7:::0;48415:11:::1;:20::i;:::-;48408:27;;48338:175;;;48475:26;48495:4;48475:11;:26::i;:::-;48468:33;;48338:175;48523:22;48540:4;48523:16;:22::i;45869:1320::-:0;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;45929:11:::1;::::0;;;::::1;;;45928:12;45920:48;;;::::0;-1:-1:-1;;;45920:48:0;;10294:2:1;45920:48:0::1;::::0;::::1;10276:21:1::0;10333:2;10313:18;;;10306:30;10372:25;10352:18;;;10345:53;10415:18;;45920:48:0::1;10092:347:1::0;45920:48:0::1;46114:15;:34:::0;;-1:-1:-1;;46114:34:0::1;46050:42;46114:34:::0;;::::1;::::0;;;46159:58:::1;46176:4;46050:42:::0;32342:21:::1;46159:8;:58::i;:::-;46262:16;-1:-1:-1::0;;;;;46262:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46244:70:0::1;;46323:4;46330:16;-1:-1:-1::0;;;;;46330:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46244:110;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;10697:15:1;;;46244:110:0::1;::::0;::::1;10679:34:1::0;10749:15;;10729:18;;;10722:43;10591:18;;46244:110:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46228:13;:126:::0;;-1:-1:-1;;;;;46228:126:0;;::::1;-1:-1:-1::0;;46228:126:0;;::::1;::::0;::::1;::::0;;:13:::1;46397:36:::0;;;:21:::1;:36;::::0;;;;:43;;-1:-1:-1;;46397:43:0::1;46228:126:::0;46397:43;;::::1;::::0;;;46466:13;;46451:9:::1;:29:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;::::1;46466:13:::0;;::::1;46451:29:::0;;;::::1;::::0;;46491:15:::1;::::0;::::1;:31;46530:21;46575:4;46595:24;46575:4:::0;46595:9:::1;:24::i;:::-;46634:1;46650::::0;46666:7:::1;20553::::0;20580:6;-1:-1:-1;;;;;20580:6:0;;20507:87;46666:7:::1;46491:223;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;11158:15:1;;;46491:223:0::1;::::0;::::1;11140:34:1::0;11190:18;;;11183:34;;;;11233:18;;;11226:34;;;;11276:18;;;11269:34;11340:15;;;11319:19;;;11312:44;46688:15:0::1;11372:19:1::0;;;11365:35;11051:19;;46491:223:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;46725:11:0::1;:18:::0;;46754:22;;;;;;;;-1:-1:-1;46831:14:0::1;:23:::0;;;::::1;46848:6;46831:23;::::0;;46896:16:::1;32342:21;46908:3;46896:11;:16::i;:::-;46881:12;:31:::0;46957:16:::1;32342:21;46969:3;46957:11;:16::i;:::-;46938;:35:::0;46984:11:::1;:18:::0;;;;;::::1;;::::0;;;47025:12:::1;47013:9;:24:::0;47100:15:::1;::::0;47048:111:::1;::::0;;;;-1:-1:-1;;;;;47100:15:0;;::::1;47048:111;::::0;::::1;7140:74:1::0;-1:-1:-1;;7230:18:1;;;7223:34;47055:13:0;;;47048:29:::1;::::0;7113:18:1;;47048:111:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;47883:96::-:0;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;47947:15:::1;:24:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;47883:96::o;42394:104::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;42469:11:::1;:21:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;42394:104::o;66439:110::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;-1:-1:-1;;;;;66506:27:0::1;66536:5;66506:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;66506:35:0::1;::::0;;66439:110::o;43878:107::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;43963:14:::1;:6:::0;43972:5:::1;43963:14;:::i;:::-;43948:12;:29:::0;-1:-1:-1;43878:107:0:o;21416:201::-;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;-1:-1:-1;;;;;21505:22:0;::::1;21497:73;;;::::0;-1:-1:-1;;;21497:73:0;;11924:2:1;21497:73:0::1;::::0;::::1;11906:21:1::0;11963:2;11943:18;;;11936:30;12002:34;11982:18;;;11975:62;12073:8;12053:18;;;12046:36;12099:19;;21497:73:0::1;11722:402:1::0;21497:73:0::1;21581:28;21600:8;21581:18;:28::i;48657:157::-:0;34908:15;;-1:-1:-1;;;;;34908:15:0;9260:10;-1:-1:-1;;;;;34892:31:0;;:83;;;-1:-1:-1;34960:15:0;;-1:-1:-1;;;;;34960:15:0;9260:10;-1:-1:-1;;;;;34944:31:0;;34892:83;:135;;;-1:-1:-1;35012:15:0;;-1:-1:-1;;;;;35012:15:0;9260:10;-1:-1:-1;;;;;34996:31:0;;34892:135;:187;;;-1:-1:-1;35064:15:0;;-1:-1:-1;;;;;35064:15:0;9260:10;-1:-1:-1;;;;;35048:31:0;;34892:187;:239;;;-1:-1:-1;35116:15:0;;-1:-1:-1;;;;;35116:15:0;9260:10;-1:-1:-1;;;;;35100:31:0;;34892:239;:283;;;-1:-1:-1;20553:7:0;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;35152:23;34892:283;34870:316;;;;;;48742:21:::1;48774:32;48742:21:::0;48774:12:::1;:32::i;47300:90::-:0;20553:7;20580:6;-1:-1:-1;;;;;20580:6:0;9260:10;20727:23;20719:68;;;;-1:-1:-1;;;20719:68:0;;5555:2:1;20719:68:0;;;5537:21:1;;;5574:18;;;5567:30;5633:34;5613:18;;;5606:62;5685:18;;20719:68:0;5353:356:1;20719:68:0;-1:-1:-1;;;;;47362:13:0::1;;::::0;;;:5:::1;:13;::::0;;;;:20;;-1:-1:-1;;47362:20:0::1;47378:4;47362:20;::::0;;47300:90::o;16419:98::-;16477:7;16504:5;16508:1;16504;:5;:::i;38060:369::-;-1:-1:-1;;;;;38187:19:0;;38179:68;;;;-1:-1:-1;;;38179:68:0;;12610:2:1;38179:68:0;;;12592:21:1;12649:2;12629:18;;;12622:30;12688:34;12668:18;;;12661:62;12759:6;12739:18;;;12732:34;12783:19;;38179:68:0;12408:400:1;38179:68:0;-1:-1:-1;;;;;38266:21:0;;38258:68;;;;-1:-1:-1;;;38258:68:0;;13015:2:1;38258:68:0;;;12997:21:1;13054:2;13034:18;;;13027:30;13093:34;13073:18;;;13066:62;13164:4;13144:18;;;13137:32;13186:19;;38258:68:0;12813:398:1;38258:68:0;-1:-1:-1;;;;;38337:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;38389:32;;1744:25:1;;;38389:32:0;;1717:18:1;38389:32:0;;;;;;;38060:369;;;:::o;38439:3835::-;-1:-1:-1;;;;;38561:18:0;;38553:68;;;;-1:-1:-1;;;38553:68:0;;13418:2:1;38553:68:0;;;13400:21:1;13457:2;13437:18;;;13430:30;13496:34;13476:18;;;13469:62;13567:7;13547:18;;;13540:35;13592:19;;38553:68:0;13216:401:1;38553:68:0;-1:-1:-1;;;;;38640:16:0;;38632:64;;;;-1:-1:-1;;;38632:64:0;;13824:2:1;38632:64:0;;;13806:21:1;13863:2;13843:18;;;13836:30;13902:34;13882:18;;;13875:62;13973:5;13953:18;;;13946:33;13996:19;;38632:64:0;13622:399:1;38632:64:0;38724:1;38715:6;:10;38707:64;;;;-1:-1:-1;;;38707:64:0;;14228:2:1;38707:64:0;;;14210:21:1;14267:2;14247:18;;;14240:30;14306:34;14286:18;;;14279:62;14377:11;14357:18;;;14350:39;14406:19;;38707:64:0;14026:405:1;38707:64:0;38863:5;38853:7;:15;38893:4;38879:11;:18;38908:5;:13;;;;;;-1:-1:-1;20580:6:0;-1:-1:-1;;;;;38952:15:0;;;20580:6;;38952:15;;;;:45;;-1:-1:-1;20553:7:0;20580:6;-1:-1:-1;;;;;38984:13:0;;;20580:6;;38984:13;;38952:45;:83;;;;-1:-1:-1;;;;;;39014:21:0;;39030:4;39014:21;;38952:83;:123;;;;-1:-1:-1;;;;;;39053:22:0;;;;;;:18;:22;;;;;;;;39052:23;38952:123;:165;;;;-1:-1:-1;;;;;;39093:24:0;;;;;;:18;:24;;;;;;;;39092:25;38952:165;38934:3288;;;-1:-1:-1;;;;;39153:9:0;;;;;;:5;:9;;;;;;;;39152:10;:26;;;;-1:-1:-1;;;;;;39167:11:0;;;;;;:5;:11;;;;;;;;39166:12;39152:26;39144:47;;;;-1:-1:-1;;;39144:47:0;;14638:2:1;39144:47:0;;;14620:21:1;14677:1;14657:18;;;14650:29;14715:10;14695:18;;;14688:38;14743:18;;39144:47:0;14436:331:1;39144:47:0;39351:5;:12;;;;;;;;-1:-1:-1;;;;;39490:12:0;;39351;39490;;;:6;:12;;;;;;:24;;39507:6;39490:16;:24::i;:::-;-1:-1:-1;;;;;39475:12:0;;;;;;;:6;:12;;;;;:39;;;;39599:13;;;39591:21;:55;;;;-1:-1:-1;39630:15:0;;-1:-1:-1;;;;;39616:30:0;;;39630:15;;39616:30;;39591:55;:116;;;;-1:-1:-1;;;;;;39650:57:0;;39664:42;39650:57;;39591:116;39587:2465;;;39816:15;;;;;;;39813:126;;;-1:-1:-1;;;;;39864:17:0;;;;;;:13;:17;;;;;;39885:12;39864:33;;39856:63;;;;-1:-1:-1;;;39856:63:0;;14974:2:1;39856:63:0;;;14956:21:1;15013:2;14993:18;;;14986:30;15052:19;15032:18;;;15025:47;15089:18;;39856:63:0;14772:341:1;39856:63:0;-1:-1:-1;;;;;39988:17:0;;;;;;:13;:17;;;;;40008:12;39988:32;;;;40042:9;;:18;;32906:1;40042:13;:18::i;:::-;:33;40039:396;;;40174:6;40164:7;:16;40217:1;40203:11;:15;40241:5;:12;;;;;;;;38934:3288;;40039:396;40358:22;40369:2;40373:6;40358:10;:22::i;:::-;40403:5;:12;;;;;;;;38934:3288;;39587:2465;40466:13;;-1:-1:-1;;;;;40460:19:0;;;40466:13;;40460:19;:55;;;;-1:-1:-1;40499:15:0;;-1:-1:-1;;;;;40483:32:0;;;40499:15;;40483:32;;40460:55;40456:1596;;;40562:5;:13;;;;;;;;40682:15;;;40562:13;40682:15;40679:128;;;-1:-1:-1;;;;;40730:19:0;;;;;;:13;:19;;;;;;40753:12;40730:35;;40722:65;;;;-1:-1:-1;;;40722:65:0;;14974:2:1;40722:65:0;;;14956:21:1;15013:2;14993:18;;;14986:30;15052:19;15032:18;;;15025:47;15089:18;;40722:65:0;14772:341:1;40722:65:0;-1:-1:-1;;;;;40856:19:0;;;;:13;:19;;40950:12;;40940:22;;;40932:63;;;;-1:-1:-1;;;40932:63:0;;15320:2:1;40932:63:0;;;15302:21:1;15359:2;15339:18;;;15332:30;15398;15378:18;;;15371:58;15446:18;;40932:63:0;15118:352:1;40932:63:0;41134:28;41165:26;41185:4;41165:11;:26::i;:::-;41253:16;;41296:11;;41134:57;;-1:-1:-1;41229:40:0;;;;41296:11;;;;;:22;;;;;41311:7;41296:22;:33;;;;-1:-1:-1;41323:6:0;;;;;;;41322:7;41296:33;:50;;;;;41333:13;:11;:13::i;:::-;41292:448;;;41457:34;41474:16;;41457;:34::i;:::-;41547:21;41599:22;;41595:122;;41654:35;41667:21;41654:12;:35::i;:::-;41348:392;41292:448;41111:648;;41832:26;41845:4;41851:6;41832:12;:26::i;:::-;38934:3288;;40456:1596;41994:5;41984:7;:15;42032:4;42018:11;:18;38934:3288;;;42179:1;42169:7;:11;;;42195;:15;38934:3288;42234:32;42249:4;42255:2;42259:6;42234:14;:32::i;17561:240::-;17681:7;17742:12;17734:6;;;;17726:29;;;;-1:-1:-1;;;17726:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;17777:5:0;;;17561:240::o;52448:163::-;52489:7;52510:15;52527;52546:19;:17;:19::i;:::-;52509:56;;-1:-1:-1;52509:56:0;-1:-1:-1;52583:20:0;52509:56;;52583:11;:20::i;:::-;52576:27;;;;52448:163;:::o;51246:419::-;51305:7;51314;51323;51332;51341;51350;51371:23;51396:12;51410:18;51432:20;51444:7;51432:11;:20::i;:::-;51370:82;;;;;;51464:15;51481:23;51506:12;51522:50;51534:7;51543:4;51549:10;51561;:8;:10::i;:::-;51522:11;:50::i;:::-;51463:109;;;;-1:-1:-1;51463:109:0;;-1:-1:-1;51623:15:0;;-1:-1:-1;51640:4:0;;-1:-1:-1;51646:10:0;;-1:-1:-1;51246:419:0;;-1:-1:-1;;;;;51246:419:0:o;29729:527::-;29844:16;;;29858:1;29844:16;;;;;;;;29805:3;;29777:18;;29844:16;29858:1;29844:16;;;;;;;;;;-1:-1:-1;29844:16:0;29820:40;;29881:3;29871:4;29876:1;29871:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29871:13:0;;;:7;;;;;;;;;;:13;;;;29905:7;;:14;;;;;;;;:7;;;;;:12;;:14;;;;;29871:7;;29905:14;;;;;:7;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29895:4;29900:1;29895:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29895:24:0;;;:7;;;;;;;;;:24;29952:36;;;;;29982:4;29952:36;;;4594:74:1;29930:19:0;;29952:21;;;;;4567:18:1;;29952:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30027:7;;29999:50;;;;;-1:-1:-1;;;;;30027:7:0;;;29999:50;;;7140:74:1;7230:18;;;7223:34;;;29930:58:0;;-1:-1:-1;29999:19:0;;;;;7113:18:1;;29999:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;30060:7:0;;:188;;;;;-1:-1:-1;;;;;30060:7:0;;;;:58;;:188;;30133:11;;30060:7;;30175:4;;30202;;30222:15;;30060:188;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29766:490;;;29729:527;:::o;49612:762::-;-1:-1:-1;;;;;49756:29:0;;;49740:13;49756:29;;;:21;:29;;;;;;;49815:32;;;;;;;;49756:29;;;;;49815:32;49756:29;49862:24;;;;;49875:11;49874:12;49862:24;49858:509;;;49903:48;49925:6;49933:9;49944:6;49903:21;:48::i;:::-;49858:509;;;49974:8;49973:9;:24;;;;;49986:11;49973:24;49969:398;;;50014:46;50034:6;50042:9;50053:6;50014:19;:46::i;49969:398::-;50083:8;50082:9;:25;;;;;50096:11;50095:12;50082:25;50078:289;;;50124:44;50142:6;50150:9;50161:6;50124:17;:44::i;50078:289::-;50190:8;:23;;;;;50202:11;50190:23;50186:181;;;50230:48;50252:6;50260:9;50271:6;50230:21;:48::i;50186:181::-;50311:44;50329:6;50337:9;50348:6;50311:17;:44::i;48822:221::-;-1:-1:-1;;;;;48900:13:0;;48876:7;48900:13;;;:8;:13;;;;;;48917:12;48900:29;48896:140;;;-1:-1:-1;;;;;;48953:15:0;;;;;:10;:15;;;;;;;48822:221::o;48896:140::-;49008:16;49020:3;49008:11;:16::i;21777:191::-;21851:16;21870:6;;-1:-1:-1;;;;;21887:17:0;;;-1:-1:-1;;21887:17:0;;;;;;21920:40;;21870:6;;;;;;;21920:40;;21851:16;21920:40;21840:128;21777:191;:::o;15663:98::-;15721:7;15748:5;15752:1;15748;:5;:::i;31094:391::-;31223:6;31198:21;:31;;31176:110;;;;-1:-1:-1;;;31176:110:0;;16897:2:1;31176:110:0;;;16879:21:1;16936:2;16916:18;;;16909:30;16975:31;16955:18;;;16948:59;17024:18;;31176:110:0;16695:353:1;31176:110:0;31300:12;31318:9;-1:-1:-1;;;;;31318:14:0;31340:6;31318:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31299:52;;;31384:7;31362:115;;;;-1:-1:-1;;;31362:115:0;;17465:2:1;31362:115:0;;;17447:21:1;17504:2;17484:18;;;17477:30;17543:34;17523:18;;;17516:62;17614:28;17594:18;;;17587:56;17660:19;;31362:115:0;17263:422:1;49051:186:0;-1:-1:-1;;;;;49131:26:0;;49107:7;49131:26;;;:21;:26;;;;;;;;49127:51;;;-1:-1:-1;;;;;;49166:12:0;;;;;:7;:12;;;;;;;49051:186::o;49127:51::-;-1:-1:-1;;;;;49216:12:0;;;;;;:7;:12;;;;;;49196:33;;:19;:33::i;42506:483::-;34636:6;:13;;;;;;;;34677:7;;34712:11;;42608:16:::1;::::0;;42622:1:::1;42608:16:::0;;;;;::::1;::::0;;-1:-1:-1;;42608:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;42608:16:0::1;42584:40;;42653:4;42635;42640:1;42635:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42635:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;42679:15:::1;::::0;:22:::1;::::0;;;;;;;:15;;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;42635:7;;42679:22;;;;;:15;:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42669:4;42674:1;42669:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42669:32:0;;::::1;:7;::::0;;::::1;::::0;;;;;:32;42744:15:::1;::::0;42712:62:::1;::::0;42729:4:::1;::::0;42744:15:::1;42762:11:::0;42712:8:::1;:62::i;:::-;42785:15;::::0;:196:::1;::::0;;;;-1:-1:-1;;;;;42785:15:0;;::::1;::::0;:66:::1;::::0;:196:::1;::::0;42866:11;;42785:15:::1;::::0;42908:4;;42935::::1;::::0;42955:15:::1;::::0;42785:196:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34746:6:0;:14;;;;;;-1:-1:-1;;;34771:7:0;:16;;;;34798:11;:20;-1:-1:-1;42506:483:0:o;42997:751::-;43194:15;;43176:79;;-1:-1:-1;;;;;43194:15:0;43211:43;33588:3;43211:21;:6;33262:3;43211:10;:21::i;:::-;:25;;:43::i;:::-;43176:17;:79::i;:::-;43304:15;;43286:82;;-1:-1:-1;;;;;43304:15:0;43321:46;33588:3;43321:24;:6;33312:3;43321:10;:24::i;43286:82::-;43426:15;;43408:85;;-1:-1:-1;;;;;43426:15:0;43443:49;33588:3;43443:27;:6;33365:3;43443:10;:27::i;43408:85::-;43554:15;;43536:85;;-1:-1:-1;;;;;43554:15:0;43571:49;33588:3;43571:27;:6;33418:2;43571:10;:27::i;43536:85::-;43672:15;;43654:84;;-1:-1:-1;;;;;43672:15:0;43689:48;33588:3;43689:26;:6;33469:3;43689:10;:26::i;15282:98::-;15340:7;15367:5;15371:1;15367;:5;:::i;44242:329::-;44367:12;;44357:6;:22;;44349:63;;;;-1:-1:-1;;;44349:63:0;;15320:2:1;44349:63:0;;;15302:21:1;15359:2;15339:18;;;15332:30;15398;15378:18;;;15371:58;15446:18;;44349:63:0;15118:352:1;44349:63:0;44496:16;;44486:6;44468:15;44480:2;44468:11;:15::i;:::-;:24;;;;:::i;:::-;:44;;44446:117;;;;-1:-1:-1;;;44446:117:0;;18025:2:1;44446:117:0;;;18007:21:1;18064:2;18044:18;;;18037:30;18103:25;18083:18;;;18076:53;18146:18;;44446:117:0;17823:347:1;47602:161:0;47740:15;;47647:4;;47740:15;;;;;47727:9;:28;;47720:35;;47602:161;:::o;53802:3082::-;-1:-1:-1;;;;;54284:14:0;;54028:18;54284:14;;;:6;:14;;;;;;54028:18;;;;;;;;54284:26;;54303:6;54284:18;:26::i;:::-;54266:44;;54321:9;54364:18;54359:2292;-1:-1:-1;;;;;54401:14:0;;;;;;:6;:14;;;;;:21;54388:34;;54359:2292;;;-1:-1:-1;;;;;54466:14:0;;54453:10;54466:14;;;:6;:14;;;;;:26;;54481:10;;54466:26;;;;;;:::i;:::-;;;;;;;;;54453:39;;54546:11;54560:46;54570:6;54578:7;:15;54586:6;-1:-1:-1;;;;;54578:15:0;-1:-1:-1;;;;;54578:15:0;;;;;;;;;;;;54594:10;54578:27;;;;;;;;:::i;:::-;;;;;;;;;54560:9;:46::i;:::-;54546:60;;54621:20;54668:4;54664:406;;54709:22;:13;54727:3;54709:17;:22::i;:::-;54693:38;;54808:7;54791:13;:24;54788:173;;-1:-1:-1;54892:4:0;;-1:-1:-1;54892:4:0;54788:173;55074:4;55071:1569;;;55099:14;;55168:256;;;;55220:26;:13;55238:7;55220:17;:26::i;:::-;55211:35;;55282:6;55269:19;;55168:256;;;55346:3;;-1:-1:-1;55385:19:0;:10;55346:3;55385:14;:19::i;:::-;55372:32;;55168:256;55536:6;55522:10;:20;55519:145;;55576:34;55587:22;:10;55602:6;55587:14;:22::i;:::-;55576:6;;:10;:34::i;:::-;55567:43;;55640:4;55633:11;;55519:145;55842:14;;55781:18;;55802:66;;55814:53;;55862:4;;55814:43;;55842:14;;55814:23;:15;55834:2;55814:19;:23::i;:43::-;:47;;:53::i;:::-;33722:5;;55802:11;:66::i;:::-;55781:87;;55942:5;55929:10;:18;55926:84;;;-1:-1:-1;55985:5:0;55926:84;56031:12;56028:453;;56078:10;56068:20;;56123:6;56111:18;;56028:453;;;56227:17;56247:21;:9;56261:6;56247:13;:21::i;:::-;56227:41;;56291:18;56312:62;56324:9;56335:7;56344:6;56352:10;56364:9;56312:11;:62::i;:::-;56291:83;-1:-1:-1;56409:9:0;;-1:-1:-1;;56028:453:0;56504:4;56501:124;;;56600:5;;;;;;;;56501:124;55080:1560;;;55071:1569;54438:2213;;;54424:12;;;;;:::i;:::-;;;;54359:2292;;;-1:-1:-1;56805:22:0;56824:2;56805:14;:7;56817:1;56805:11;:14::i;:22::-;56795:7;:32;56852:22;56871:2;56852:14;:7;56864:1;56852:11;:14::i;:22::-;56838:11;:36;-1:-1:-1;;;;;;;;53802:3082:0:o;52619:561::-;52716:7;;52669;;;;32342:21;52669:7;52776:289;52800:9;:16;52796:20;;52776:289;;;52866:7;52842;:21;52850:9;52860:1;52850:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;52850:12:0;52842:21;;;;;;;;;;;;;:31;;:66;;;52901:7;52877;:21;52885:9;52895:1;52885:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;52885:12:0;52877:21;;;;;;;;;;;;;:31;52842:66;52838:97;;;-1:-1:-1;;52918:7:0;;;32342:21;;-1:-1:-1;52619:561:0;-1:-1:-1;;52619:561:0:o;52838:97::-;52960:34;52972:7;:21;52980:9;52990:1;52980:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;52980:12:0;52972:21;;;;;;;;;;;;;52960:7;;:11;:34::i;:::-;52950:44;;53019:34;53031:7;:21;53039:9;53049:1;53039:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;53039:12:0;53031:21;;;;;;;;;;;;;53019:7;;:11;:34::i;:::-;53009:44;-1:-1:-1;52818:3:0;;;;:::i;:::-;;;;52776:289;;;-1:-1:-1;53089:7:0;;:20;;32342:21;53089:11;:20::i;:::-;53079:7;:30;53075:61;;;-1:-1:-1;;53119:7:0;;;32342:21;;-1:-1:-1;52619:561:0;-1:-1:-1;52619:561:0:o;53075:61::-;53155:7;;53164;;-1:-1:-1;52619:561:0;-1:-1:-1;52619:561:0:o;51673:330::-;51733:7;51742;51751;51771:12;51786:28;51806:7;51786:19;:28::i;:::-;51771:43;;51825:18;51846:26;51864:7;51846:17;:26::i;:::-;51825:47;-1:-1:-1;51883:23:0;51909:33;51825:47;51909:17;:7;51921:4;51909:11;:17::i;:::-;:21;;:33::i;:::-;51883:59;51978:4;;-1:-1:-1;51984:10:0;;-1:-1:-1;51673:330:0;;-1:-1:-1;;;51673:330:0:o;52011:429::-;52126:7;;;;52182:24;:7;52194:11;52182;:24::i;:::-;52164:42;-1:-1:-1;52217:12:0;52232:21;:4;52241:11;52232:8;:21::i;:::-;52217:36;-1:-1:-1;52264:18:0;52285:27;:10;52300:11;52285:14;:27::i;:::-;52264:48;-1:-1:-1;52323:23:0;52349:33;52264:48;52349:17;:7;52361:4;52349:11;:17::i;:33::-;52401:7;;;;-1:-1:-1;52427:4:0;;-1:-1:-1;52011:429:0;;-1:-1:-1;;;;;;;52011:429:0:o;60393:1518::-;60533:5;;;;;;;60529:1375;;;60631:1;60665:7;60605:23;60703:28;60665:7;60631:1;60703:11;:28::i;:::-;-1:-1:-1;;;;;60795:19:0;;;;;;:8;:19;;;;;;;;60817:12;60795:34;;60868:7;:18;;;;;;60687:44;;-1:-1:-1;60868:31:0;;60891:7;60868:22;:31::i;:::-;-1:-1:-1;;;;;60844:21:0;;;;;;;:10;:21;;;;;;;;:55;;;;60969:15;;;;;:7;:15;;;;;:28;;60989:7;60969:19;:28::i;:::-;-1:-1:-1;;;;;60951:15:0;;;;;;:7;:15;;;;;;;;:46;;;;61077:7;:15;;;;:28;;61097:7;61077:19;:28::i;:::-;-1:-1:-1;;;;;61059:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;61141:18;;;;;:7;:18;;;;;:39;;61164:15;61141:22;:39::i;:::-;-1:-1:-1;;;;;61120:18:0;;;;;;:7;:18;;;;;:60;61195:17;61206:5;61195:10;:17::i;:::-;61249:9;-1:-1:-1;;;;;61232:44:0;61241:6;-1:-1:-1;;;;;61232:44:0;;61260:15;61232:44;;;;1744:25:1;;1732:2;1717:18;;1598:177;61232:44:0;;;;;;;;60540:748;;;30367:285:::1;;30264:388:::0;:::o;60529:1375::-;61320:15;61350:23;61388:12;61415:23;61453:12;61480:18;61512:19;61523:7;61512:10;:19::i;:::-;61305:226;;;;;;;;;;;;61542:38;61553:9;61564:15;61542:10;:38::i;:::-;-1:-1:-1;;;;;61609:15:0;;;;;;:7;:15;;;;;;:28;;61629:7;61609:19;:28::i;:::-;-1:-1:-1;;;;;61591:15:0;;;;;;:7;:15;;;;;;;;:46;;;;61666:7;:15;;;;:28;;61686:7;61666:19;:28::i;:::-;-1:-1:-1;;;;;61648:15:0;;;;;;;:7;:15;;;;;;:46;;;;61726:18;;;;;;;:39;;61749:15;61726:22;:39::i;:::-;-1:-1:-1;;;;;61705:18:0;;;;;;:7;:18;;;;;:60;61776:22;61787:10;61776;:22::i;:::-;61809:23;61821:4;61827;61809:11;:23::i;:::-;61865:9;-1:-1:-1;;;;;61848:44:0;61857:6;-1:-1:-1;;;;;61848:44:0;;61876:15;61848:44;;;;1744:25:1;;1732:2;1717:18;;1598:177;61848:44:0;;;;;;;;61294:610;;;;;;60393:1518;;;:::o;58782:1603::-;58920:5;;;;;;;58916:1462;;;59014:1;59044:7;58988:23;59078:28;59044:7;59014:1;59078:11;:28::i;:::-;-1:-1:-1;;;;;59162:19:0;;;;;;:8;:19;;;;;;;;59184:12;59162:34;;59292:7;:18;;;;;;59062:44;;-1:-1:-1;59292:31:0;;59315:7;59292:22;:31::i;:::-;-1:-1:-1;;;;;59268:21:0;;;;;;;:10;:21;;;;;;;;:55;;;;59445:15;;;;;:7;:15;;;;;:28;;59465:7;59445:19;:28::i;:::-;-1:-1:-1;;;;;59427:15:0;;;;;;;:7;:15;;;;;;:46;;;;59505:18;;;;;;;:39;;59528:15;59505:22;:39::i;:::-;-1:-1:-1;;;;;59484:18:0;;;;;;:7;:18;;;;;;;;:60;;;;59609:7;:18;;;;:39;;59632:15;59609:22;:39::i;:::-;-1:-1:-1;;;;;59588:18:0;;;;;;:7;:18;;;;;:60;59659:17;59670:5;59659:10;:17::i;58916:1462::-;59780:15;59810:23;59848:12;59875:23;59913:12;59940:18;59972:19;59983:7;59972:10;:19::i;:::-;59765:226;;;;;;;;;;;;60002:38;60013:9;60024:15;60002:10;:38::i;:::-;-1:-1:-1;;;;;60069:15:0;;;;;;:7;:15;;;;;;:28;;60089:7;60069:19;:28::i;:::-;-1:-1:-1;;;;;60051:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;60129:18;;;;;:7;:18;;;;;:39;;60152:15;60129:22;:39::i;:::-;-1:-1:-1;;;;;60108:18:0;;;;;;:7;:18;;;;;;;;:60;;;;60200:7;:18;;;;:39;;60223:15;60200:22;:39::i;57376:1398::-;57547:5;;;;;;;57543:1214;;;57645:1;57679:7;57619:23;57717:28;57679:7;57645:1;57717:11;:28::i;:::-;-1:-1:-1;;;;;57809:19:0;;;;;;:8;:19;;;;;;;;57831:12;57809:34;;57882:7;:18;;;;;;57701:44;;-1:-1:-1;57882:31:0;;57905:7;57882:22;:31::i;:::-;-1:-1:-1;;;;;57858:21:0;;;;;;;:10;:21;;;;;;;;:55;;;;57983:15;;;;;:7;:15;;;;;:28;;58003:7;57983:19;:28::i;:::-;-1:-1:-1;;;;;57965:15:0;;;;;;;:7;:15;;;;;;:46;;;;58047:18;;;;;;;:39;;58070:15;58047:22;:39::i;57543:1214::-;58230:15;58260:23;58298:12;58325:23;58363:12;58390:18;58422:19;58433:7;58422:10;:19::i;:::-;58215:226;;;;;;;;;;;;58452:38;58463:9;58474:15;58452:10;:38::i;:::-;-1:-1:-1;;;;;58519:15:0;;;;;;:7;:15;;;;;;:28;;58539:7;58519:19;:28::i;61919:1640::-;62024:5;;;;;;;62021:1531;;;62122:1;62156:7;62096:23;62194:28;62156:7;62122:1;62194:11;:28::i;:::-;-1:-1:-1;;;;;62286:19:0;;;;;;:8;:19;;;;;;;;62308:12;62286:34;;62359:7;:18;;;;;;62178:44;;-1:-1:-1;62359:31:0;;62382:7;62359:22;:31::i;:::-;-1:-1:-1;;;;;62335:21:0;;;;;;;:10;:21;;;;;;;;:55;;;;62460:15;;;;;:7;:15;;;;;:28;;62480:7;62460:19;:28::i;:::-;-1:-1:-1;;;;;62442:15:0;;;;;;:7;:15;;;;;;;;:46;;;;62568:7;:15;;;;:28;;62588:7;62568:19;:28::i;:::-;-1:-1:-1;;;;;62550:15:0;;;;;;;:7;:15;;;;;;:46;;;;62688:18;;;;;;;:39;;62711:15;62688:22;:39::i;:::-;-1:-1:-1;;;;;62667:18:0;;;;;;:7;:18;;;;;;;;:60;;;;62763:7;:18;;;;:39;;62786:15;62763:22;:39::i;62021:1531::-;62932:15;62949:23;62974:12;62988:23;63013:12;63027:18;63049:19;63060:7;63049:10;:19::i;:::-;62931:137;;;;;;;;;;;;63083:38;63094:9;63105:15;63083:10;:38::i;:::-;-1:-1:-1;;;;;63154:15:0;;;;;;:7;:15;;;;;;:28;;63174:7;63154:19;:28::i;:::-;-1:-1:-1;;;;;63136:15:0;;;;;;:7;:15;;;;;;;;:46;;;;63215:7;:15;;;;:28;;63235:7;63215:19;:28::i;16020:98::-;16078:7;16105:5;16109:1;16105;:5;:::i;57134:232::-;-1:-1:-1;;;;;57227:29:0;;57204:7;57227:29;;;:21;:29;;;;;;;;57224:135;;;-1:-1:-1;57280:3:0;57273:10;;57224:135;57323:24;57343:3;57323:19;:24::i;:::-;57316:31;;;;56892:234;57026:7;57053:65;57108:9;57053:50;57080:22;:6;57091:10;57080;:22::i;:::-;57053;:9;57067:7;57053:13;:22::i;:::-;:26;;:50::i;:65::-;57046:72;56892:234;-1:-1:-1;;;;;;56892:234:0:o;65389:139::-;65457:7;65484:36;65513:6;65484:24;65496:11;;65484:7;:11;;:24;;;;:::i;65536:133::-;65602:7;65629:32;65654:6;65629:20;65641:7;;65629;:11;;:20;;;;:::i;65947:361::-;66006:19;66028:10;:8;:10::i;:::-;66006:32;-1:-1:-1;66049:18:0;66070:27;:10;66006:32;66070:14;:27::i;:::-;66149:4;66133:22;;;;:7;:22;;;;;;66049:48;;-1:-1:-1;66133:38:0;;66049:48;66133:26;:38::i;:::-;66124:4;66108:22;;;;:7;:22;;;;;;;;:63;;;;66186:21;:36;;;;;;66182:118;;;66278:4;66262:22;;;;:7;:22;;;;;;:38;;66289:10;66262:26;:38::i;:::-;66253:4;66237:22;;;;:7;:22;;;;;:63;65995:313;;65947:361;:::o;53454:336::-;53568:5;;;;;;;53564:219;;;-1:-1:-1;;;;;53677:17:0;;;;;;;;:6;:17;;;;;;;;:39;;;;;;;;;;;;;;53700:15;53677:39;;;53731:18;;;:7;:18;;;;:40;;;;;;;;;;;;;53454:336::o;51091:147::-;51169:7;;:17;;51181:4;51169:11;:17::i;:::-;51159:7;:27;51210:10;;:20;;51225:4;51210:14;:20::i;:::-;51197:10;:33;-1:-1:-1;;51091:147:0:o;14:656:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;586:2:1;574:15;591:66;570:88;555:104;;;;661:2;551:113;;14:656;-1:-1:-1;;;14:656:1:o;675:154::-;-1:-1:-1;;;;;754:5:1;750:54;743:5;740:65;730:93;;819:1;816;809:12;834:315;902:6;910;963:2;951:9;942:7;938:23;934:32;931:52;;;979:1;976;969:12;931:52;1018:9;1005:23;1037:31;1062:5;1037:31;:::i;:::-;1087:5;1139:2;1124:18;;;;1111:32;;-1:-1:-1;;;834:315:1:o;1346:247::-;1405:6;1458:2;1446:9;1437:7;1433:23;1429:32;1426:52;;;1474:1;1471;1464:12;1426:52;1513:9;1500:23;1532:31;1557:5;1532:31;:::i;1780:456::-;1857:6;1865;1873;1926:2;1914:9;1905:7;1901:23;1897:32;1894:52;;;1942:1;1939;1932:12;1894:52;1981:9;1968:23;2000:31;2025:5;2000:31;:::i;:::-;2050:5;-1:-1:-1;2107:2:1;2092:18;;2079:32;2120:33;2079:32;2120:33;:::i;:::-;1780:456;;2172:7;;-1:-1:-1;;;2226:2:1;2211:18;;;;2198:32;;1780:456::o;2241:180::-;2300:6;2353:2;2341:9;2332:7;2328:23;2324:32;2321:52;;;2369:1;2366;2359:12;2321:52;-1:-1:-1;2392:23:1;;2241:180;-1:-1:-1;2241:180:1:o;2615:118::-;2701:5;2694:13;2687:21;2680:5;2677:32;2667:60;;2723:1;2720;2713:12;2738:309;2803:6;2811;2864:2;2852:9;2843:7;2839:23;2835:32;2832:52;;;2880:1;2877;2870:12;2832:52;2916:9;2903:23;2893:33;;2976:2;2965:9;2961:18;2948:32;2989:28;3011:5;2989:28;:::i;:::-;3036:5;3026:15;;;2738:309;;;;;:::o;3052:367::-;3115:8;3125:6;3179:3;3172:4;3164:6;3160:17;3156:27;3146:55;;3197:1;3194;3187:12;3146:55;-1:-1:-1;3220:20:1;;3263:18;3252:30;;3249:50;;;3295:1;3292;3285:12;3249:50;3332:4;3324:6;3320:17;3308:29;;3392:3;3385:4;3375:6;3372:1;3368:14;3360:6;3356:27;3352:38;3349:47;3346:67;;;3409:1;3406;3399:12;3346:67;3052:367;;;;;:::o;3424:773::-;3546:6;3554;3562;3570;3623:2;3611:9;3602:7;3598:23;3594:32;3591:52;;;3639:1;3636;3629:12;3591:52;3679:9;3666:23;3708:18;3749:2;3741:6;3738:14;3735:34;;;3765:1;3762;3755:12;3735:34;3804:70;3866:7;3857:6;3846:9;3842:22;3804:70;:::i;:::-;3893:8;;-1:-1:-1;3778:96:1;-1:-1:-1;3981:2:1;3966:18;;3953:32;;-1:-1:-1;3997:16:1;;;3994:36;;;4026:1;4023;4016:12;3994:36;;4065:72;4129:7;4118:8;4107:9;4103:24;4065:72;:::i;:::-;3424:773;;;;-1:-1:-1;4156:8:1;-1:-1:-1;;;;3424:773:1:o;4202:241::-;4258:6;4311:2;4299:9;4290:7;4286:23;4282:32;4279:52;;;4327:1;4324;4317:12;4279:52;4366:9;4353:23;4385:28;4407:5;4385:28;:::i;4679:276::-;4737:6;4790:2;4778:9;4769:7;4765:23;4761:32;4758:52;;;4806:1;4803;4796:12;4758:52;4845:9;4832:23;4895:10;4888:5;4884:22;4877:5;4874:33;4864:61;;4921:1;4918;4911:12;4960:388;5028:6;5036;5089:2;5077:9;5068:7;5064:23;5060:32;5057:52;;;5105:1;5102;5095:12;5057:52;5144:9;5131:23;5163:31;5188:5;5163:31;:::i;:::-;5213:5;-1:-1:-1;5270:2:1;5255:18;;5242:32;5283:33;5242:32;5283:33;:::i;5714:184::-;5766:77;5763:1;5756:88;5863:4;5860:1;5853:15;5887:4;5884:1;5877:15;5903:228;5943:7;6069:1;-1:-1:-1;;5997:74:1;5994:1;5991:81;5986:1;5979:9;5972:17;5968:105;5965:131;;;6076:18;;:::i;:::-;-1:-1:-1;6116:9:1;;5903:228::o;7268:245::-;7335:6;7388:2;7376:9;7367:7;7363:23;7359:32;7356:52;;;7404:1;7401;7394:12;7356:52;7436:9;7430:16;7455:28;7477:5;7455:28;:::i;7874:184::-;7926:77;7923:1;7916:88;8023:4;8020:1;8013:15;8047:4;8044:1;8037:15;8063:125;8103:4;8131:1;8128;8125:8;8122:34;;;8136:18;;:::i;:::-;-1:-1:-1;8173:9:1;;8063:125::o;8193:184::-;8245:77;8242:1;8235:88;8342:4;8339:1;8332:15;8366:4;8363:1;8356:15;8382:195;8421:3;-1:-1:-1;;8445:5:1;8442:77;8439:103;;;8522:18;;:::i;:::-;-1:-1:-1;8569:1:1;8558:13;;8382:195::o;9647:251::-;9717:6;9770:2;9758:9;9749:7;9745:23;9741:32;9738:52;;;9786:1;9783;9776:12;9738:52;9818:9;9812:16;9837:31;9862:5;9837:31;:::i;9903:184::-;9973:6;10026:2;10014:9;10005:7;10001:23;9997:32;9994:52;;;10042:1;10039;10032:12;9994:52;-1:-1:-1;10065:16:1;;9903:184;-1:-1:-1;9903:184:1:o;11411:306::-;11499:6;11507;11515;11568:2;11556:9;11547:7;11543:23;11539:32;11536:52;;;11584:1;11581;11574:12;11536:52;11613:9;11607:16;11597:26;;11663:2;11652:9;11648:18;11642:25;11632:35;;11707:2;11696:9;11692:18;11686:25;11676:35;;11411:306;;;;;:::o;12129:274::-;12169:1;12195;12185:189;;12230:77;12227:1;12220:88;12331:4;12328:1;12321:15;12359:4;12356:1;12349:15;12185:189;-1:-1:-1;12388:9:1;;12129:274::o;15664:1026::-;15926:4;15974:3;15963:9;15959:19;16005:6;15994:9;15987:25;16031:2;16069:6;16064:2;16053:9;16049:18;16042:34;16112:3;16107:2;16096:9;16092:18;16085:31;16136:6;16171;16165:13;16202:6;16194;16187:22;16240:3;16229:9;16225:19;16218:26;;16279:2;16271:6;16267:15;16253:29;;16300:1;16310:218;16324:6;16321:1;16318:13;16310:218;;;16389:13;;-1:-1:-1;;;;;16385:62:1;16373:75;;16503:15;;;;16468:12;;;;16346:1;16339:9;16310:218;;;-1:-1:-1;;;;;;;16584:55:1;;;;16579:2;16564:18;;16557:83;-1:-1:-1;;;16671:3:1;16656:19;16649:35;16545:3;15664:1026;-1:-1:-1;;;15664:1026:1:o;17690:128::-;17730:3;17761:1;17757:6;17754:1;17751:13;17748:39;;;17767:18;;:::i;:::-;-1:-1:-1;17803:9:1;;17690:128::o

Swarm Source

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