ETH Price: $2,450.67 (-0.87%)

Token

BAPE (BAPE)
 

Overview

Max Total Supply

1,023,751,500 BAPE

Holders

293

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
5,566.20858533 BAPE

Value
$0.00
0x3F416066e0A127D3173439D4a241A476bdF58c6E
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:
BAPE

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: openzeppelin\contracts\utils\introspection\IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: openzeppelin\contracts\token\ERC721\IERC721.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);
    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);
    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;
    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);
    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;
    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}
// File: openzeppelin\contracts\token\ERC721\extensions\IERC721Enumerable.sol
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);
    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: openzeppelin\contracts\token\ERC721\IERC721Receiver.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)
/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
// File: openzeppelin\contracts\security\ReentrancyGuard.sol
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.
    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;
    constructor() {
        _status = _NOT_ENTERED;
    }
    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
        _;
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
// File: bapestoken.sol

interface IBEP20 {
  function totalSupply() external view returns (uint256);
  function decimals() external view returns (uint8);
  function symbol() external view returns (string memory);
  function name() external view returns (string memory);
  function getOwner() external view returns (address);
  function balanceOf(address account) external view returns (uint256);
  function transfer(address recipient, uint256 amount) external returns (bool);
  function allowance(address _owner, address spender) external view returns (uint256);
  function approve(address spender, uint256 amount) external returns (bool);
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}
interface IPancakeERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);
    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}
interface IPancakeFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}
interface IPancakeRouter01 {
    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 factory() external pure returns (address);
    function WETH() external pure returns (address);
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getamountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getamountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getamountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getamountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
interface IPancakeRouter02 is IPancakeRouter01 {
    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;
}
/**
 * @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 {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }
    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == msg.sender, "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 onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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 onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.
        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");
        // solhint-disable-next-line avoid-low-level-calls
        (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");
        // solhint-disable-next-line avoid-low-level-calls
        (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");
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.
    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }
    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }
    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];
        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;
            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
            bytes32 lastvalue = set._values[lastIndex];
            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            // Delete the slot where the moved value was stored
            set._values.pop();
            // Delete the index for the deleted slot
            delete set._indexes[value];
            return true;
        } else {
            return false;
        }
    }
    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }
    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }
   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }
    // Bytes32Set
    struct Bytes32Set {
        Set _inner;
    }
    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }
    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }
    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }
    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }
   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }
    // AddressSet
    struct AddressSet {
        Set _inner;
    }
    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }
    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }
    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }
    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }
   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }
    // UintSet
    struct UintSet {
        Set _inner;
    }
    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }
    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }
    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }
    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }
   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//BallerX Contract ////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
contract BAPE is IBEP20, Ownable, IERC721Receiver, ReentrancyGuard
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    EnumerableSet.AddressSet private _excluded;
    //Token Info 
    string private constant _name = 'BAPE';
    string private constant _symbol = 'BAPE';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 1 * 10**9 * 10**_decimals;
    uint256 swapLimit = 5 * 10**6 * 10**_decimals; // 0,5%
    bool isSwapPegged = false;
    //Divider for the buyLimit based on circulating Supply (1%)
    uint16 public constant BuyLimitDivider=1;
    //Divider for the MaxBalance based on circulating Supply (1.5%)
    uint8 public constant BalanceLimitDivider=1;
    //Divider for the Whitelist MaxBalance based on initial Supply(1.5%)
    uint16 public constant WhiteListBalanceLimitDivider=1;
    //Divider for sellLimit based on circulating Supply (1%)
    uint16 public constant SellLimitDivider=100;
    // Chef address
    address public chefAddress = 0x000000000000000000000000000000000000dEaD;
    // Limits control 
    bool sellLimitActive = true;
    bool buyLimitActive = true;
    bool balanceLimitActive = true;
    // Team control switch
    bool _teamEnabled = true;
    // Team wallets
    address public constant marketingWallet=0xECB1C6fa4fAea49047Fa0748B0a1d30136Baa73F;
    address public constant developmentWallet=0x4223b10d22bF8634d5128F588600C65F854cd20c;
    address public constant charityWallet=0x65685081E64FCBD2377C95E5ccb6167ff5f503d3;
    // Uniswap v2 Router
    address private constant PancakeRouter=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    // Cooldown vars 
    bool cooldown = true;
    mapping(address => bool) hasTraded;
    mapping(address => uint256) lastTrade;
    uint256 cooldownTime = 1 seconds;
    //variables that track balanceLimit and sellLimit,
    //can be updated based on circulating supply and Sell- and BalanceLimitDividers
    uint256 private _circulatingSupply =InitialSupply;
    uint256 public  balanceLimit = _circulatingSupply;
    uint256 public  sellLimit = _circulatingSupply;
    uint256 public  buyLimit = _circulatingSupply;
    address[] public triedToDump;
    //Limits max tax, only gets applied for tax changes, doesn't affect inital Tax
    uint8 public constant MaxTax=49;
    // claim Settings
    uint256 public claimFrequency = 86400 seconds;
    mapping(address => uint256) private _nftHolderLastTransferTimestamp;
    mapping(uint256 => uint256) private _nftStakeTime;
    mapping(uint256 => uint256) private _nftStakePeriod;
    bool public claimEnabled = true;
    bool public checkTxSigner = true;
    bool public checkClaimFrequency = true;
    bool public checkTxMsgSigner = true;
    address private passwordSigner = 0x81bEE9fF7f8d1D9c32B7BB5714A4236e078E9eCC;
    mapping(uint256 => bool) private _txMsgSigner;
    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint8 private _buyTax;
    uint8 private _sellTax;
    uint8 private _transferTax;
    uint8 private _liquidityTax;
    uint8 private _distributedTax;
    bool isTokenSwapManual = true;
    address private _pancakePairAddress; 
    IPancakeRouter02 private  _pancakeRouter;
    //modifier for functions only the team can call
    modifier onlyTeam() {
        require(_isTeam(msg.sender), "Caller not in Team");
        _;
    }
    modifier onlyChef() {
        require(_isChef(msg.sender), "Caller is not chef");
        _;
    }
    //Checks if address is in Team, is needed to give Team access even if contract is renounced
    //Team doesn't have access to critical Functions that could turn this into a Rugpull(Exept liquidity unlocks)
    function _isTeam(address addr) private view returns (bool){
        if(!_teamEnabled) {
            return false;
        }
        return addr==owner()||addr==marketingWallet||addr==charityWallet||addr==developmentWallet;
    }
    function _isChef(address addr) private view returns (bool) {
        return addr==chefAddress;
    }
    //erc1155 receiver
    //addresses 
    using EnumerableSet for EnumerableSet.UintSet; 
    address nullAddress = 0x0000000000000000000000000000000000000000;
    address public bapesNftAddress;
        // mappings 
    mapping(address => EnumerableSet.UintSet) private _deposits;
    bool public _addBackLiquidity = false;
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Constructor///////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    constructor () {
        //contract creator gets 90% of the token to create LP-Pair
        uint256 deployerBalance=_circulatingSupply*9/10;
        _balances[msg.sender] = deployerBalance;
        emit Transfer(address(0), msg.sender, deployerBalance);
        //contract gets 10% of the token to generate LP token and Marketing Budget fase
        //contract will sell token over the first 200 sells to generate maximum LP and BNB
        uint256 injectBalance=_circulatingSupply-deployerBalance;
        _balances[address(this)]=injectBalance;
       emit Transfer(address(0), address(this),injectBalance);
        // Pancake Router
        _pancakeRouter = IPancakeRouter02(PancakeRouter);
        //Creates a Pancake Pair
        _pancakePairAddress = IPancakeFactory(_pancakeRouter.factory()).createPair(address(this), _pancakeRouter.WETH());
        //Sets Buy/Sell limits
        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;
        buyLimit=InitialSupply/BuyLimitDivider;
        _buyTax=8;
        _sellTax=10;
        _transferTax=0;
        _distributedTax=100;
        _liquidityTax=0;
        //Team wallet and deployer are excluded from Taxes
        _excluded.add(charityWallet);
        _excluded.add(developmentWallet);
        _excluded.add(marketingWallet);
        _excluded.add(developmentWallet);
        _excluded.add(msg.sender);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Transfer functionality////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //transfer function, every transfer runs through this function
    function _transfer(address sender, address recipient, uint256 amount) private{
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");
        //Manually Excluded adresses are transfering tax and lock free
        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));
        //Transactions from and to the contract are always tax and lock free
        bool isContractTransfer=(sender==address(this) || recipient==address(this));
        //transfers between PancakeRouter and PancakePair are tax and lock free
        address pancakeRouter=address(_pancakeRouter);
        bool isLiquidityTransfer = ((sender == _pancakePairAddress && recipient == pancakeRouter) 
        || (recipient == _pancakePairAddress && sender == pancakeRouter));
        //differentiate between buy/sell/transfer to apply different taxes/restrictions
        bool isBuy=sender==_pancakePairAddress|| sender == pancakeRouter;
        bool isSell=recipient==_pancakePairAddress|| recipient == pancakeRouter;
        //Pick transfer
        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        } else{
            require(tradingEnabled, "Trading is disabled");
            // Cooldown logic (excluded people have no cooldown and contract too) 
            if(cooldown) {
                if (hasTraded[msg.sender]) {
                    lastTrade[msg.sender] = block.timestamp;
                    require(block.timestamp < (lastTrade[msg.sender] + cooldownTime));
                } else {
                    hasTraded[msg.sender] = true;
                }
            }
            _taxedTransfer(sender,recipient,amount,isBuy,isSell);                  
        }
    }
    //applies taxes, checks for limits, locks generates autoLP and stakingBNB, and autostakes
    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        swapLimit = sellLimit/2;
        uint8 tax;
        if(isSell){
            if (sellLimitActive) {
                require(amount<=sellLimit,"Dump protection");
            }
            tax=_sellTax;
        } else if(isBuy){
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            if (balanceLimitActive) {
                require(recipientBalance+amount<=(balanceLimit*2),"whale protection");
            }
            if (buyLimitActive) {
                require(amount<=buyLimit, "whale protection");
            }
            tax=_buyTax;
        } else {//Transfer
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            //Transfers are disabled in sell lock, this doesn't stop someone from transfering before
            //selling, but there is no satisfying solution for that, and you would need to pax additional tax
            tax=_transferTax;
        }     
        //Swapping AutoLP and MarketingBNB is only possible if sender is not pancake pair, 
        //if its not manually disabled, if its not already swapping and if its a Sell to avoid
        // people from causing a large price impact from repeatedly transfering when theres a large backlog of Tokens
        if((sender!=_pancakePairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier))
            _swapContractToken(amount);
        //staking and liquidity Tax get treated the same, only during conversion they get split
        uint256 contractToken=_calculateFee(amount, tax, _distributedTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-(contractToken);
        //Removes token and handles staking
        _removeToken(sender,amount);
        //Adds the taxed tokens to the contract wallet
        _balances[address(this)] += contractToken;
        //Adds token and handles staking
        _addToken(recipient, taxedAmount);
        emit Transfer(sender,recipient,taxedAmount);
    }
    //Feeless transfer only transfers and autostakes
    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        //Removes token and handles staking
        _removeToken(sender,amount);
        //Adds token and handles staking
        _addToken(recipient, amount);
        emit Transfer(sender,recipient,amount);
    }
    //Calculates the token that should be taxed
    function _calculateFee(uint256 amount, uint8 tax, uint8 taxPercent) private pure returns (uint256) {
        return (amount*tax*taxPercent) / 10000;
    }
    //removes Token, adds BNB to the toBePaid mapping and resets staking
    function _removeToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]-amount;
        _balances[address(this)] += amount;
        _balances[addr]=newAmount;
        emit Transfer(addr, address(this), amount); 
    }
    //lock for the withdraw
    bool private _isTokenSwaping;
    //the total reward distributed through staking, for tracking purposes
    uint256 public totalTokenSwapGenerated;
    //the total payout through staking, for tracking purposes
    uint256 public totalPayouts;
    //marketing share of the TokenSwap tax
    uint8 public _marketingShare=40;
    //marketing share of the TokenSwap tax
    uint8 public _charityShare=20;
    //marketing share of the TokenSwap tax
    uint8 public _developmentShare=40;
    //balance that is claimable by the team
    uint256 public marketingBalance;
    uint256 public developmentBalance;
    uint256 public charityBalance;
    //Mapping of shares that are reserved for payout
    mapping(address => uint256) private toBePaid;
    //distributes bnb between marketing, development and charity
    function _distributeFeesBNB(uint256 BNBamount) private {
        // Deduct marketing Tax
        uint256 marketingSplit = (BNBamount * _marketingShare) / 100;
        uint256 charitySplit = (BNBamount * _charityShare) / 100;
        uint256 developmentSplit = (BNBamount * _developmentShare) / 100;
        // Safety check to avoid solidity division imprecision
        if ((marketingSplit+charitySplit+developmentSplit) > address(this).balance) {
            uint256 toRemove = (marketingSplit+charitySplit+developmentSplit) - address(this).balance;
            developmentSplit -= toRemove; 
        }
        // Updating balances
        marketingBalance+=marketingSplit;
        charityBalance+=charitySplit;
        developmentBalance += developmentSplit;
    }
    function _addToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]+amount;
        _balances[addr]=newAmount;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Swap Contract Tokens//////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //tracks auto generated BNB, useful for ticker etc
    uint256 public totalLPBNB;
    //Locks the swap if already swapping
    bool private _isSwappingContractModifier;
    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }
    //swaps the token on the contract for Marketing BNB and LP Token.
    //always swaps the sellLimit of token to avoid a large price impact
    function _swapContractToken(uint256 totalMax) private lockTheSwap{
        uint256 contractBalance=_balances[address(this)];
        uint16 totalTax=_liquidityTax+_distributedTax;
        uint256 tokenToSwap=swapLimit;
        if(tokenToSwap > totalMax) {
            if(isSwapPegged) {
                tokenToSwap = totalMax;
            }
        }
        //only swap if contractBalance is larger than tokenToSwap, and totalTax is unequal to 0
        if(contractBalance<tokenToSwap||totalTax==0){
            return;
        }
        //splits the token in TokenForLiquidity and tokenForMarketing
        uint256 tokenForLiquidity=(tokenToSwap*_liquidityTax)/totalTax;
        uint256 tokenLeft = tokenToSwap - tokenForLiquidity;
        //splits tokenForLiquidity in 2 halves
        uint256 liqToken=tokenForLiquidity/2;
        uint256 liqBNBToken=tokenForLiquidity-liqToken;
        //swaps fees tokens and the liquidity token half for BNB
        uint256 swapToken=liqBNBToken+tokenLeft;
        //Gets the initial BNB balance, so swap won't touch any other BNB
        uint256 initialBNBBalance = address(this).balance;
        _swapTokenForBNB(swapToken);
        uint256 newBNB=(address(this).balance - initialBNBBalance);
        //calculates the amount of BNB belonging to the LP-Pair and converts them to LP
        if(_addBackLiquidity)
        {
            uint256 liqBNB = (newBNB*liqBNBToken)/swapToken;
            _addLiquidity(liqToken, liqBNB);
        }
        //Get the BNB balance after LP generation to get the
        //exact amount of bnb left to distribute
        uint256 generatedBNB=(address(this).balance - initialBNBBalance);
        //distributes remaining BNB between stakers and Marketing
        _distributeFeesBNB(generatedBNB);
    }
    //swaps tokens on the contract for BNB
    function _swapTokenForBNB(uint256 amount) private {
        _approve(address(this), address(_pancakeRouter), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _pancakeRouter.WETH();
        _pancakeRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    //Adds Liquidity directly to the contract where LP are locked
    function _addLiquidity(uint256 tokenamount, uint256 bnbamount) private {
        totalLPBNB+=bnbamount;
        _approve(address(this), address(_pancakeRouter), tokenamount);
        _pancakeRouter.addLiquidityETH{value: bnbamount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Settings//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    bool public sellLockDisabled;
    uint256 public sellLockTime;
    bool public manualConversion;
    function mint(uint256 qty) public onlyChef {
        _circulatingSupply = _circulatingSupply + qty;
        _balances[chefAddress] = _balances[chefAddress] + qty;
        emit Transfer(address(0), chefAddress, qty);
    }
    function mintClaim(address account,uint256 qty) internal {
        _circulatingSupply = _circulatingSupply + qty;
        _balances[account] = _balances[account] + qty;
        emit Transfer(address(0), account, qty);
    }
    function burn(uint256 qty) public onlyChef {
        _circulatingSupply = _circulatingSupply + qty;
        _balances[chefAddress] = _balances[chefAddress] - qty;
        emit Transfer(address(0), chefAddress, qty);
    }
    // Cooldown control 
    function isCooldownEnabled(bool booly) public onlyTeam {
        cooldown = booly;
    }
    function setCooldownTime(uint256 time) public onlyTeam {
        cooldownTime = time;
    }
    // This will DISABLE every control from the team 
    function renounceTeam() public onlyTeam {
        _teamEnabled = false;
    }
    function TeamSetChef(address addy) public onlyTeam {
        chefAddress = addy;
    }
    function TeamIsActiveSellLimit(bool booly) public onlyTeam {
        sellLimitActive = booly;
    }
    function TeamIsActiveBuyLimit(bool booly) public onlyTeam {
        buyLimitActive = booly;
    }
    function TeamIsActiveBalanceLimit(bool booly) public onlyTeam {
        balanceLimitActive = booly;
    }
    function TeamEnableTrading() public onlyTeam {
        tradingEnabled = true;
    }
    function TeamWithdrawMarketingBNB() public onlyTeam{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        (bool sent,) =marketingWallet.call{value: (amount)}("");
        require(sent,"withdraw failed");
    } 
    function TeamWithdrawCharityBNB() public onlyTeam{
        uint256 amount=charityBalance;
        charityBalance=0;
        (bool sent,) =charityWallet.call{value: (amount)}("");
        require(sent,"withdraw failed");
    } 
    function TeamWithdrawDevelopmentBNB() public onlyTeam{
        uint256 amount=developmentBalance;
        developmentBalance=0;
        (bool sent,) =developmentWallet.call{value: (amount)}("");
        require(sent,"withdraw failed");
    } 
    //switches autoLiquidity and marketing BNB generation during transfers
    function TeamSwitchManualBNBConversion(bool manual) public onlyTeam{
        manualConversion=manual;
    }
    //Sets Taxes, is limited by MaxTax(49%) to make it impossible to create honeypot
    function TeamSetTaxes(uint8 distributedTaxes, uint8 liquidityTaxes,uint8 buyTax, uint8 sellTax, uint8 transferTax) public onlyTeam{
        uint8 totalTax=liquidityTaxes+distributedTaxes;
        require(totalTax==100, "liq+distributed needs to equal 100%");
        require(buyTax<=MaxTax&&sellTax<=MaxTax&&transferTax<=MaxTax,"taxes higher than max tax");
        _liquidityTax=liquidityTaxes;
        _distributedTax=distributedTaxes;
        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;
    }
    //manually converts contract token to LP and staking BNB
    function TeamManualGenerateTokenSwapBalance(uint256 _qty) public onlyTeam{
    _swapContractToken(_qty * 10**9);
    }
    //Exclude/Include account from fees (eg. CEX)
    function TeamExcludeAccountFromFees(address account) public onlyTeam {
        _excluded.add(account);
    }
    function TeamIncludeAccountToFees(address account) public onlyTeam {
        _excluded.remove(account);
    }
     //Limits need to be at least 0.5%, to avoid setting value to 0(avoid potential Honeypot)
    function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) public onlyTeam{
        uint256 minimumLimit = 5 * 10**6;
        //Adds decimals to limits
        newBalanceLimit=newBalanceLimit*10**_decimals;
        newSellLimit=newSellLimit*10**_decimals;
        require(newBalanceLimit>=minimumLimit && newSellLimit>=minimumLimit, "Limit protection");
        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;     
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    bool public tradingEnabled=false;
    address private _liquidityTokenAddress;
    //Enables whitelist trading and locks Liquidity for a short time
    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) public onlyTeam{
        _liquidityTokenAddress=liquidityTokenAddress;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //external//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    receive() external payable {}
    fallback() external payable {}
    // IBEP20
    function getOwner() external view override returns (address) {
        return owner();
    }
    function name() external pure override returns (string memory) {
        return _name;
    }
    function symbol() external pure override returns (string memory) {
        return _symbol;
    }
    function decimals() external pure override returns (uint8) {
        return _decimals;
    }
    function totalSupply() external view override returns (uint256) {
        return _circulatingSupply;
    }
    function balanceOf(address account) external view override returns (uint256) {
        return _balances[account];
    }
    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }
    function allowance(address _owner, address spender) external view override returns (uint256) {
        return _allowances[_owner][spender];
    }
    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "Approve from zero");
        require(spender != address(0), "Approve to zero");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);
        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "Transfer > allowance");
        _approve(sender, msg.sender, currentAllowance - amount);
        return true;
    }
    // IBEP20 - Helpers
    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }
    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 currentAllowance = _allowances[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "<0 allowance");
        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }
    function checkLastClaim(address to)  public view returns (uint256 )
    {
        return _nftHolderLastTransferTimestamp[to];
    }
    function gethash(address to,uint nid,uint nonce)  public pure  returns (bytes memory )
    {
        return abi.encodePacked(to, nid,nonce);
    }
    function getKeccak(address to,uint nid,uint nonce)  public pure  returns (bytes32)
    {
        return keccak256(gethash(to, nid,nonce));
    }
    function getKeccakHashed(address to,uint nid,uint nonce)  public pure  returns (bytes32)
    {
        return getEthSignedMessageHash(keccak256(gethash(to, nid,nonce)));
    }
   /* function checkSignature(address to,uint256 nid,uint256 nonce, bytes memory signature) public view returns (bool) {
        bytes32 messageHash = keccak256(abi.encode(to, nid,nonce));
        bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);
        return recoverSigner(ethSignedMessageHash, signature) == passwordSigner;
    }
    */
    function claimTokens(address to,uint256 amount,uint256 nounce,  bytes memory signature) public  {
       require(claimEnabled, "Claim Disabled");
       if(checkTxSigner)
       {
            require(verify(to, amount,nounce,signature), "Invalid Signature");
       }
        if(checkClaimFrequency)
        {
            require(block.timestamp > _nftHolderLastTransferTimestamp[to] + claimFrequency, "Not the Claim time.");
        }
        if(checkTxMsgSigner)
        {
            require(!_txMsgSigner[nounce], "Invalid Claim");
            _txMsgSigner[nounce] = true;
            _nftHolderLastTransferTimestamp[to] = block.timestamp;
        }
        _feelessTransfer(owner(), to, amount*10**9);
    }
     function getMessageHash(
        address _to,
        uint _amount,
        uint _nonce
    ) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(_to, _amount, _nonce));
    }
       function getEthSignedMessageHash(bytes32 _messageHash)
        public
        pure
        returns (bytes32)
    {
        /*
        Signature is produced by signing a keccak256 hash with the following format:
        "\x19Ethereum Signed Message\n" + len(msg) + msg
        */
        return
            keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash)
            );
    }
    function verify(
        address _to,
        uint _amount,
        uint _nonce,
        bytes memory signature
    ) public view returns (bool) {
        bytes32 messageHash = getMessageHash(_to, _amount,  _nonce);
        bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);
        return recoverSigner(ethSignedMessageHash, signature) == passwordSigner;
    }
    function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature)
        public
        pure
        returns (address)
    {
        (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);
        return ecrecover(_ethSignedMessageHash, v, r, s);
    }
    function splitSignature(bytes memory sig)
        public
        pure
        returns (
            bytes32 r,
            bytes32 s,
            uint8 v
        )
    {
        require(sig.length == 65, "invalid signature length");
        assembly {
            /*
            First 32 bytes stores the length of the signature
            add(sig, 32) = pointer of sig + 32
            effectively, skips first 32 bytes of signature
            mload(p) loads next 32 bytes starting at the memory address p into memory
            */
            // first 32 bytes, after the length prefix
            r := mload(add(sig, 32))
            // second 32 bytes
            s := mload(add(sig, 64))
            // final byte (first byte of the next 32 bytes)
            v := byte(0, mload(add(sig, 96)))
        }
        // implicitly return (r, s, v)
    }
    function setnftClaimSettings(address _passwordSigner,uint256 _claimFrequency, bool _Enabled,bool _checkTxSigner,bool _checkTxMsgSigner,bool _checkClaimFrequency) external onlyOwner {
        require(_claimFrequency >= 600, "cannot set clain more often than every 10 minutes");
        claimFrequency = _claimFrequency;
        passwordSigner = _passwordSigner;
        claimEnabled = _Enabled;
        checkTxSigner = _checkTxSigner;
        checkClaimFrequency = _checkClaimFrequency;
        checkTxMsgSigner = _checkTxMsgSigner;
    }
    //=======================erc1155 receiving
    //alter rate and expiration 
    function updateNftAddress(address payable newFundsTo,bool addBackLiquidity) public onlyOwner {
        bapesNftAddress = newFundsTo;
        _addBackLiquidity = addBackLiquidity;
    }
    //check deposit amount. 
    function depositsOf(address account)
      external 
      view 
      returns (uint256[] memory)
    {
      EnumerableSet.UintSet storage depositSet = _deposits[account];
      uint256[] memory tokenIds = new uint256[] (depositSet.length());
      for (uint256 i; i<depositSet.length(); i++) {
        tokenIds[i] = depositSet.at(i);
      }
      return tokenIds;
    }
        //deposit function. 
    function deposit(uint256[] calldata tokenIds,uint256 prd) external {
        //claimRewards(tokenIds);
        for (uint256 i; i < tokenIds.length; i++) {
            _nftStakeTime[tokenIds[i]] = block.timestamp;
            _nftStakePeriod[tokenIds[i]] = prd;
            IERC721(bapesNftAddress).safeTransferFrom(
                msg.sender,
                address(this),
                tokenIds[i],
                ''
            );
            _deposits[msg.sender].add(tokenIds[i]);
        }
    }
    function getNftStakeTime(uint256 tid) public view returns (uint256)
    {
        return _nftStakeTime[tid];
    }
    function getNftStakePeriod(uint256 tid) public view returns (uint256)
    {
        return _nftStakePeriod[tid];
    }
    //withdrawal function.
    function withdraw(address to,uint256 amount,uint256 nounce,  bytes memory signature,uint256[] calldata tokenIds) external nonReentrant() {
       // claimRewards(tokenIds);
       if(amount>0)
       {
            require(verify(to, amount,nounce,signature), "Invalid Signature");
            require(!_txMsgSigner[nounce], "Invalid Claim");
            _txMsgSigner[nounce] = true;
            //_nftHolderLastTransferTimestamp[to] = block.timestamp;
       }
        for (uint256 i; i < tokenIds.length; i++) {
            require(
                _deposits[msg.sender].contains(tokenIds[i]),
                'Staking: token not deposited'
            );
            _nftStakeTime[tokenIds[i]] = 0;
            _deposits[msg.sender].remove(tokenIds[i]);
            IERC721(bapesNftAddress).safeTransferFrom(
                address(this),
                msg.sender,
                tokenIds[i],
                ''
            );
        }
        if(amount>0)
       {
        mintClaim(to, amount*10**9);
       }
       // _feelessTransfer(owner(), to, amount*10**9);
    }
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external pure override returns (bytes4) {
        return IERC721Receiver.onERC721Received.selector;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BuyLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamExcludeAccountFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"TeamIncludeAccountToFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamIsActiveBalanceLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamIsActiveBuyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"TeamIsActiveSellLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"TeamManualGenerateTokenSwapBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"TeamSetChef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"distributedTaxes","type":"uint8"},{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"TeamSetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"TeamSwitchManualBNBConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"TeamUpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamWithdrawCharityBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamWithdrawDevelopmentBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamWithdrawMarketingBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WhiteListBalanceLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_addBackLiquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_charityShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_developmentShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bapesNftAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkClaimFrequency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"checkLastClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkTxMsgSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkTxSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chefAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nounce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"prd","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositsOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developmentBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_messageHash","type":"bytes32"}],"name":"getEthSignedMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nid","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"getKeccak","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nid","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"getKeccakHashed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"getMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tid","type":"uint256"}],"name":"getNftStakePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tid","type":"uint256"}],"name":"getNftStakeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nid","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"gethash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"isCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_ethSignedMessageHash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setCooldownTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_passwordSigner","type":"address"},{"internalType":"uint256","name":"_claimFrequency","type":"uint256"},{"internalType":"bool","name":"_Enabled","type":"bool"},{"internalType":"bool","name":"_checkTxSigner","type":"bool"},{"internalType":"bool","name":"_checkTxMsgSigner","type":"bool"},{"internalType":"bool","name":"_checkClaimFrequency","type":"bool"}],"name":"setnftClaimSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"splitSignature","outputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalLPBNB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokenSwapGenerated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"triedToDump","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newFundsTo","type":"address"},{"internalType":"bool","name":"addBackLiquidity","type":"bool"}],"name":"updateNftAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nounce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a62000688565b6200002190624c4b4062000747565b600655600780546001600160d01b031916790101010101000000000000000000000000000000000000dead001790556001600a908155620000659060099062000688565b6200007590633b9aca0062000747565b600b819055600c819055600d819055600e5562015180601055601480546001600160c01b0319167781bee9ff7f8d1d9c32b7bb5714a4236e078e9ecc01010101179055601680546501000000000060ff60281b19909116179055601880546001600160a01b0319169055601b805460ff19169055601e805462ffffff1916622814281790556026805461ff00191690553480156200011257600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055600b54600090600a906200016e90600962000747565b6200017a91906200061c565b336000818152600260205260408082208490555192935090916000805160206200477383398151915290620001b29085815260200190565b60405180910390a3600081600b54620001cc919062000769565b306000818152600260205260408082208490555192935090916000805160206200477383398151915290620002049085815260200190565b60405180910390a3601780546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b1580156200026c57600080fd5b505afa15801562000281573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a79190620005ea565b6001600160a01b031663c9c6539630601760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200030557600080fd5b505afa1580156200031a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003409190620005ea565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200038957600080fd5b505af11580156200039e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c49190620005ea565b601680546001600160a01b0392909216660100000000000002600160301b600160d01b03199092169190911790556001620004026009600a62000688565b6200041290633b9aca0062000747565b6200041e91906200061c565b600c556064620004316009600a62000688565b6200044190633b9aca0062000747565b6200044d91906200061c565b600d556001620004606009600a62000688565b6200047090633b9aca0062000747565b6200047c91906200061c565b600e5560168054646400000a0864ffffffffff19909116179055620004c360047365685081e64fcbd2377c95e5ccb6167ff5f503d362000578602090811b6200257117901c565b50620004f3734223b10d22bf8634d5128f588600c65f854cd20c60046200057860201b620025711790919060201c565b506200052373ecb1c6fa4faea49047fa0748b0a1d30136baa73f60046200057860201b620025711790919060201c565b5062000553734223b10d22bf8634d5128f588600c65f854cd20c60046200057860201b620025711790919060201c565b506200056f3360046200057860201b620025711790919060201c565b50505062000799565b60006200058f836001600160a01b03841662000598565b90505b92915050565b6000818152600183016020526040812054620005e15750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000592565b50600062000592565b600060208284031215620005fd57600080fd5b81516001600160a01b03811681146200061557600080fd5b9392505050565b6000826200063a57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b808511156200068057816000190482111562000664576200066462000783565b808516156200067257918102915b93841c939080029062000644565b509250929050565b60006200058f60ff841683600082620006a45750600162000592565b81620006b35750600062000592565b8160018114620006cc5760028114620006d757620006f7565b600191505062000592565b60ff841115620006eb57620006eb62000783565b50506001821b62000592565b5060208310610133831016604e8410600b84101617156200071c575081810a62000592565b6200072883836200063f565b80600019048211156200073f576200073f62000783565b029392505050565b600081600019048311821515161562000764576200076462000783565b500290565b6000828210156200077e576200077e62000783565b500390565b634e487b7160e01b600052601160045260246000fd5b613fca80620007a96000396000f3fe6080604052600436106104945760003560e01c8063843abdd01161025e578063b3da7ef511610143578063e4762a93116100bb578063f2fde38b11610082578063f2fde38b14610ea5578063f4f8c16614610ec5578063f88b0e4614610ee6578063f8f08eee14610efc578063fa54080114610f1c578063faf0a26f14610f3c57005b8063e4762a9314610dfe578063ea0eac6914610e2b578063eb25952314610e4b578063eb8e886314610e6b578063ec521be414610e8057005b8063d2b0737b1161010a578063d2b0737b14610d16578063d9a431b314610d36578063dd62ed3e14610d4b578063dff6bcbf14610d91578063e18802ca14610db1578063e3a9db1a14610dd157005b8063b3da7ef514610c62578063ba2cb23714610c82578063c04a541414610ca2578063c2cf92e814610cca578063d1262f5514610ce957005b806395d89b41116101d6578063a0dd80401161019d578063a0dd804014610b84578063a457c2d714610ba4578063a7bb580314610bc4578063a8bee36814610c02578063a9059cbb14610c22578063b20c6fc114610c4257005b806395d89b41146104d057806397aba7f914610b0e57806399b8a3f014610b2e5780639fa62d5f14610b44578063a0712d6814610b6457005b8063893d20e811610225578063893d20e814610a845780638b3b5bb314610aa25780638d060d7714610ab85780638d2c503914610ace5780638da5cb5b14610a8457806393ab98f214610aee57005b8063843abdd014610a0b57806386d0ada814610a2b57806386f51cea14610a455780638724cc721461060c578063887c60fb14610a6557005b80634089b1701161038457806358eaa1ea116102fc57806370a08231116102c357806370a082311461092d578063715018a61461096357806375f0a87414610978578063762bb282146109b85780637b208769146109ce5780637f919373146109f657005b806358eaa1ea14610899578063595d5d30146108b95780635dc55f2f146108d357806361a23c69146108f35780636ff732011461090d57005b80634ada218b1161034b5780634ada218b146107f85780634cdaf0ae146108175780634f91e48c14610837578063588aeaf21461084d578063589210d91461086d57806358e553651461088357005b80634089b1701461076c578063414916e51461078257806342966c68146107a25780634607e692146107c257806348e907b7146107e257005b806323b872dd1161041757806330f6f1ef116103de57806330f6f1ef146106a5578063311a8697146106c5578063313ce567146106ec578063340e578914610700578063370c325214610716578063395093511461074c57005b806323b872dd14610621578063255d3ddf146106415780632866ed21146106615780632c02c26a1461067b5780632cb88ba41461069057005b8063150b7a021161045b578063150b7a021461057e57806316828728146105c357806318160ddd146105e25780631eb25d13146105f75780631f8b845e1461060c57005b80630201ecde1461049d57806306fdde03146104d0578063095ea7b3146105065780630deea608146105365780630fd99e161461055657005b3661049b57005b005b3480156104a957600080fd5b506104bd6104b83660046138f0565b610f51565b6040519081526020015b60405180910390f35b3480156104dc57600080fd5b506040805180820190915260048152634241504560e01b60208201525b6040516104c79190613c5a565b34801561051257600080fd5b50610526610521366004613855565b610f75565b60405190151581526020016104c7565b34801561054257600080fd5b50610526610551366004613925565b610f8c565b34801561056257600080fd5b5061056b606481565b60405161ffff90911681526020016104c7565b34801561058a57600080fd5b506105aa6105993660046137b6565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016104c7565b3480156105cf57600080fd5b5060145461052690610100900460ff1681565b3480156105ee57600080fd5b50600b546104bd565b34801561060357600080fd5b506104bd610fdd565b34801561061857600080fd5b5061056b600181565b34801561062d57600080fd5b5061052661063c366004613775565b610ffa565b34801561064d57600080fd5b506014546105269062010000900460ff1681565b34801561066d57600080fd5b506014546105269060ff1681565b34801561068757600080fd5b5061049b611096565b34801561069c57600080fd5b5061049b6110cc565b3480156106b157600080fd5b5061049b6106c0366004613707565b6111a3565b3480156106d157600080fd5b506106da600181565b60405160ff90911681526020016104c7565b3480156106f857600080fd5b5060096106da565b34801561070c57600080fd5b506104bd60205481565b34801561072257600080fd5b506104bd6107313660046136cd565b6001600160a01b031660009081526011602052604090205490565b34801561075857600080fd5b50610526610767366004613855565b611210565b34801561077857600080fd5b506104bd601d5481565b34801561078e57600080fd5b5061049b61079d3660046136cd565b611247565b3480156107ae57600080fd5b5061049b6107bd366004613a7f565b611294565b3480156107ce57600080fd5b5061049b6107dd366004613a7f565b611378565b3480156107ee57600080fd5b506104bd601c5481565b34801561080457600080fd5b5060265461052690610100900460ff1681565b34801561082357600080fd5b5061049b6108323660046136cd565b6113b6565b34801561084357600080fd5b506104bd600d5481565b34801561085957600080fd5b5061049b6108683660046136cd565b611405565b34801561087957600080fd5b506104bd600e5481565b34801561088f57600080fd5b506104bd601f5481565b3480156108a557600080fd5b5061049b6108b4366004613a64565b611435565b3480156108c557600080fd5b50601b546105269060ff1681565b3480156108df57600080fd5b5061049b6108ee366004613a18565b611478565b3480156108ff57600080fd5b50601e546106da9060ff1681565b34801561091957600080fd5b5061049b610928366004613a7f565b6115d2565b34801561093957600080fd5b506104bd6109483660046136cd565b6001600160a01b031660009081526002602052604090205490565b34801561096f57600080fd5b5061049b6115fc565b34801561098457600080fd5b506109a073ecb1c6fa4faea49047fa0748b0a1d30136baa73f81565b6040516001600160a01b0390911681526020016104c7565b3480156109c457600080fd5b506104bd600c5481565b3480156109da57600080fd5b506109a07365685081e64fcbd2377c95e5ccb6167ff5f503d381565b348015610a0257600080fd5b5061049b61167f565b348015610a1757600080fd5b5061049b610a26366004613a64565b6116d1565b348015610a3757600080fd5b506026546105269060ff1681565b348015610a5157600080fd5b5061049b610a60366004613881565b611714565b348015610a7157600080fd5b5060245461052690610100900460ff1681565b348015610a9057600080fd5b506000546001600160a01b03166109a0565b348015610aae57600080fd5b506104bd60105481565b348015610ac457600080fd5b506104bd60235481565b348015610ada57600080fd5b5061049b610ae9366004613a64565b611833565b348015610afa57600080fd5b506109a0610b09366004613a7f565b61186b565b348015610b1a57600080fd5b506109a0610b29366004613a98565b611895565b348015610b3a57600080fd5b506104bd60215481565b348015610b5057600080fd5b5061049b610b5f366004613b14565b611914565b348015610b7057600080fd5b5061049b610b7f366004613a7f565b6119c8565b348015610b9057600080fd5b50601e546106da9062010000900460ff1681565b348015610bb057600080fd5b50610526610bbf366004613855565b611a58565b348015610bd057600080fd5b50610be4610bdf366004613adf565b611ad4565b60408051938452602084019290925260ff16908201526060016104c7565b348015610c0e57600080fd5b5061049b610c1d366004613a64565b611b48565b348015610c2e57600080fd5b50610526610c3d366004613855565b611b8b565b348015610c4e57600080fd5b5061049b610c5d366004613988565b611b98565b348015610c6e57600080fd5b5061049b610c7d366004613b64565b611e79565b348015610c8e57600080fd5b5061049b610c9d366004613925565b611fe7565b348015610cae57600080fd5b506109a0734223b10d22bf8634d5128f588600c65f854cd20c81565b348015610cd657600080fd5b50601e546106da90610100900460ff1681565b348015610cf557600080fd5b506104bd610d04366004613a7f565b60009081526012602052604090205490565b348015610d2257600080fd5b506104bd610d313660046138f0565b6121be565b348015610d4257600080fd5b5061049b61220d565b348015610d5757600080fd5b506104bd610d6636600461373c565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610d9d57600080fd5b5061049b610dac3660046136cd565b612241565b348015610dbd57600080fd5b506104f9610dcc3660046138f0565b612271565b348015610ddd57600080fd5b50610df1610dec3660046136cd565b6122b7565b6040516104c79190613c16565b348015610e0a57600080fd5b506104bd610e19366004613a7f565b60009081526013602052604090205490565b348015610e3757600080fd5b506104bd610e463660046138f0565b612373565b348015610e5757600080fd5b506019546109a0906001600160a01b031681565b348015610e7757600080fd5b506106da603181565b348015610e8c57600080fd5b506007546109a09061010090046001600160a01b031681565b348015610eb157600080fd5b5061049b610ec03660046136cd565b612390565b348015610ed157600080fd5b50601454610526906301000000900460ff1681565b348015610ef257600080fd5b506104bd60255481565b348015610f0857600080fd5b5061049b610f17366004613a64565b612489565b348015610f2857600080fd5b506104bd610f37366004613a7f565b6124cc565b348015610f4857600080fd5b5061049b61251f565b6000610f6d610f61858585612271565b805190602001206124cc565b949350505050565b6000610f8233848461258d565b5060015b92915050565b600080610f9a8686866121be565b90506000610fa7826124cc565b60145490915064010000000090046001600160a01b0316610fc88286611895565b6001600160a01b031614979650505050505050565b610fe96009600a613e0b565b610ff790633b9aca00613eb6565b81565b6000611007848484612681565b6001600160a01b0384166000908152600360209081526040808320338452909152902054828110156110775760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b60448201526064015b60405180910390fd5b61108b85336110868685613ed5565b61258d565b506001949350505050565b61109f33612949565b6110bb5760405162461bcd60e51b815260040161106e90613ca2565b6026805461ff001916610100179055565b6110d533612949565b6110f15760405162461bcd60e51b815260040161106e90613ca2565b602180546000918290556040519091907365685081e64fcbd2377c95e5ccb6167ff5f503d39083905b60006040518083038185875af1925050503d8060008114611157576040519150601f19603f3d011682016040523d82523d6000602084013e61115c565b606091505b505090508061119f5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b604482015260640161106e565b5050565b336111b66000546001600160a01b031690565b6001600160a01b0316146111dc5760405162461bcd60e51b815260040161106e90613c6d565b601980546001600160a01b0319166001600160a01b039390931692909217909155601b805460ff1916911515919091179055565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610f82918590611086908690613d69565b61125033612949565b61126c5760405162461bcd60e51b815260040161106e90613ca2565b600780546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60075461010090046001600160a01b031633146112e85760405162461bcd60e51b815260206004820152601260248201527121b0b63632b91034b9903737ba1031b432b360711b604482015260640161106e565b80600b546112f69190613d69565b600b5560075461010090046001600160a01b0316600090815260026020526040902054611324908290613ed5565b600780546001600160a01b036101009182900481166000908152600260209081526040808320969096559354945186815292909404169291600080516020613f75833981519152910160405180910390a350565b61138133612949565b61139d5760405162461bcd60e51b815260040161106e90613ca2565b6113b36113ae82633b9aca00613eb6565b6129f0565b50565b6113bf33612949565b6113db5760405162461bcd60e51b815260040161106e90613ca2565b602680546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b61140e33612949565b61142a5760405162461bcd60e51b815260040161106e90613ca2565b61119f600482612571565b61143e33612949565b61145a5760405162461bcd60e51b815260040161106e90613ca2565b60078054911515600160c81b0260ff60c81b19909216919091179055565b60005b828110156115cc57426012600086868581811061149a5761149a613f33565b9050602002013581526020019081526020016000208190555081601360008686858181106114ca576114ca613f33565b60209081029290920135835250810191909152604001600020556019546001600160a01b031663b88d4fde333087878681811061150957611509613f33565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152608060648201526000608482015260a401600060405180830381600087803b15801561156e57600080fd5b505af1158015611582573d6000803e3d6000fd5b505050506115b984848381811061159b5761159b613f33565b336000908152601a6020908152604090912093910201359050612b4f565b50806115c481613eec565b91505061147b565b50505050565b6115db33612949565b6115f75760405162461bcd60e51b815260040161106e90613ca2565b600a55565b3361160f6000546001600160a01b031690565b6001600160a01b0316146116355760405162461bcd60e51b815260040161106e90613c6d565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61168833612949565b6116a45760405162461bcd60e51b815260040161106e90613ca2565b601f805460009182905560405190919073ecb1c6fa4faea49047fa0748b0a1d30136baa73f90839061111a565b6116da33612949565b6116f65760405162461bcd60e51b815260040161106e90613ca2565b60078054911515600160a81b0260ff60a81b19909216919091179055565b336117276000546001600160a01b031690565b6001600160a01b03161461174d5760405162461bcd60e51b815260040161106e90613c6d565b6102588510156117b95760405162461bcd60e51b815260206004820152603160248201527f63616e6e6f742073657420636c61696e206d6f7265206f6674656e207468616e604482015270206576657279203130206d696e7574657360781b606482015260840161106e565b6010949094556014805463ffffff01600160c01b0319166401000000006001600160a01b03979097169690960260ff1916959095179215159290921762ffff0019166101009115159190910262ff000019161762010000921515929092029190911763ff0000001916630100000091151591909102179055565b61183c33612949565b6118585760405162461bcd60e51b815260040161106e90613ca2565b6026805460ff1916911515919091179055565b600f818154811061187b57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000806000806118a485611ad4565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa1580156118ff573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b61191d33612949565b6119395760405162461bcd60e51b815260040161106e90613ca2565b624c4b406119496009600a613e0b565b6119539084613eb6565b92506119616009600a613e0b565b61196b9083613eb6565b915080831015801561197d5750808210155b6119bc5760405162461bcd60e51b815260206004820152601060248201526f2634b6b4ba10383937ba32b1ba34b7b760811b604482015260640161106e565b50600c91909155600d55565b60075461010090046001600160a01b03163314611a1c5760405162461bcd60e51b815260206004820152601260248201527121b0b63632b91034b9903737ba1031b432b360711b604482015260640161106e565b80600b54611a2a9190613d69565b600b5560075461010090046001600160a01b0316600090815260026020526040902054611324908290613d69565b3360009081526003602090815260408083206001600160a01b038616845290915281205482811015611abb5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b604482015260640161106e565b611aca33856110868685613ed5565b5060019392505050565b60008060008351604114611b2a5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e6774680000000000000000604482015260640161106e565b50505060208101516040820151606090920151909260009190911a90565b611b5133612949565b611b6d5760405162461bcd60e51b815260040161106e90613ca2565b60078054911515600160b81b0260ff60b81b19909216919091179055565b6000610f82338484612681565b60026001541415611beb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161106e565b60026001558415611cab57611c0286868686610f8c565b611c425760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964205369676e617475726560781b604482015260640161106e565b60008481526015602052604090205460ff1615611c915760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420436c61696d60981b604482015260640161106e565b6000848152601560205260409020805460ff191660011790555b60005b81811015611e4f57611ce9838383818110611ccb57611ccb613f33565b336000908152601a6020908152604090912093910201359050612b5b565b611d355760405162461bcd60e51b815260206004820152601c60248201527f5374616b696e673a20746f6b656e206e6f74206465706f736974656400000000604482015260640161106e565b600060126000858585818110611d4d57611d4d613f33565b90506020020135815260200190815260200160002081905550611d99838383818110611d7b57611d7b613f33565b336000908152601a6020908152604090912093910201359050612b73565b506019546001600160a01b031663b88d4fde3033868686818110611dbf57611dbf613f33565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152608060648201526000608482015260a401600060405180830381600087803b158015611e2457600080fd5b505af1158015611e38573d6000803e3d6000fd5b505050508080611e4790613eec565b915050611cae565b508415611e6d57611e6d86611e6887633b9aca00613eb6565b612b7f565b50506001805550505050565b611e8233612949565b611e9e5760405162461bcd60e51b815260040161106e90613ca2565b6000611eaa8686613d81565b90508060ff16606414611f0b5760405162461bcd60e51b815260206004820152602360248201527f6c69712b6469737472696275746564206e6565647320746f20657175616c203160448201526230302560e81b606482015260840161106e565b603160ff851611801590611f235750603160ff841611155b8015611f335750603160ff831611155b611f7f5760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d61782074617800000000000000604482015260640161106e565b506016805460ff928316620100000262ff0000199484166101000261ffff199885166401000000000264ff00000000199886166301000000029890981664ffff0000001990931692909217969096179690961693909116929092179390931792909216179055565b60145460ff1661202a5760405162461bcd60e51b815260206004820152600e60248201526d10db185a5b48111a5cd8589b195960921b604482015260640161106e565b601454610100900460ff16156120865761204684848484610f8c565b6120865760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964205369676e617475726560781b604482015260640161106e565b60145462010000900460ff1615612101576010546001600160a01b0385166000908152601160205260409020546120bd9190613d69565b42116121015760405162461bcd60e51b81526020600482015260136024820152722737ba103a34329021b630b4b6903a34b6b29760691b604482015260640161106e565b6014546301000000900460ff16156121955760008281526015602052604090205460ff16156121625760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420436c61696d60981b604482015260640161106e565b6000828152601560209081526040808320805460ff191660011790556001600160a01b0387168352601190915290204290555b6115cc6121aa6000546001600160a01b031690565b856121b986633b9aca00613eb6565b612bff565b6040516bffffffffffffffffffffffff19606085901b16602082015260348101839052605481018290526000906074016040516020818303038152906040528051906020012090509392505050565b61221633612949565b6122325760405162461bcd60e51b815260040161106e90613ca2565b6007805460ff60c01b19169055565b61224a33612949565b6122665760405162461bcd60e51b815260040161106e90613ca2565b61119f600482612cb8565b604051606084811b6bffffffffffffffffffffffff1916602083015260348201849052605482018390529060740160405160208183030381529060405290509392505050565b6001600160a01b0381166000908152601a602052604081206060916122db82612ccd565b67ffffffffffffffff8111156122f3576122f3613f49565b60405190808252806020026020018201604052801561231c578160200160208202803683370190505b50905060005b61232b83612ccd565b81101561236b5761233c8382612cd7565b82828151811061234e5761234e613f33565b60209081029190910101528061236381613eec565b915050612322565b509392505050565b6000612380848484612271565b8051906020012090509392505050565b336123a36000546001600160a01b031690565b6001600160a01b0316146123c95760405162461bcd60e51b815260040161106e90613c6d565b6001600160a01b03811661242e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161106e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61249233612949565b6124ae5760405162461bcd60e51b815260040161106e90613ca2565b60078054911515600160b01b0260ff60b01b19909216919091179055565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b61252833612949565b6125445760405162461bcd60e51b815260040161106e90613ca2565b60208054600091829055604051909190734223b10d22bf8634d5128f588600c65f854cd20c90839061111a565b6000612586836001600160a01b038416612ce3565b9392505050565b6001600160a01b0383166125d75760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b604482015260640161106e565b6001600160a01b03821661261f5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b604482015260640161106e565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166126cc5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b604482015260640161106e565b6001600160a01b0382166127155760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b604482015260640161106e565b6000612722600485612d32565b806127335750612733600484612d32565b905060006001600160a01b03851630148061275657506001600160a01b03841630145b6017546016549192506001600160a01b0390811691600091888116600160301b909204161480156127985750816001600160a01b0316866001600160a01b0316145b806127d357506016546001600160a01b03878116600160301b909204161480156127d35750816001600160a01b0316876001600160a01b0316145b6016549091506000906001600160a01b03898116600160301b90920416148061280d5750826001600160a01b0316886001600160a01b0316145b6016549091506000906001600160a01b03898116600160301b9092041614806128475750836001600160a01b0316886001600160a01b0316145b905084806128525750825b8061285a5750855b1561286f5761286a898989612bff565b61293e565b602654610100900460ff166128bc5760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81a5cc8191a5cd8589b1959606a1b604482015260640161106e565b600754600160c81b900460ff1615612931573360009081526008602052604090205460ff1615612916573360009081526009602052604090204290819055600a5461290691613d69565b421061291157600080fd5b612931565b336000908152600860205260409020805460ff191660011790555b61293e8989898585612d54565b505050505050505050565b600754600090600160c01b900460ff1661296557506000919050565b6000546001600160a01b038381169116148061299d57506001600160a01b03821673ecb1c6fa4faea49047fa0748b0a1d30136baa73f145b806129c457506001600160a01b0382167365685081e64fcbd2377c95e5ccb6167ff5f503d3145b80610f8657506001600160a01b038216734223b10d22bf8634d5128f588600c65f854cd20c1492915050565b6024805460ff1916600117905530600090815260026020526040812054601654909190612a3290640100000000810460ff908116916301000000900416613d81565b60ff1690506000600654905083811115612a545760075460ff1615612a545750825b80831080612a64575061ffff8216155b15612a7157505050612b42565b60165460009061ffff841690612a91906301000000900460ff1684613eb6565b612a9b9190613da6565b90506000612aa98284613ed5565b90506000612ab8600284613da6565b90506000612ac68285613ed5565b90506000612ad48483613d69565b905047612ae082613010565b6000612aec8247613ed5565b601b5490915060ff1615612b1f57600083612b078684613eb6565b612b119190613da6565b9050612b1d8682613178565b505b6000612b2b8347613ed5565b9050612b368161324f565b50505050505050505050505b506024805460ff19169055565b60006125868383612ce3565b60008181526001830160205260408120541515612586565b6000612586838361335f565b80600b54612b8d9190613d69565b600b556001600160a01b038216600090815260026020526040902054612bb4908290613d69565b6001600160a01b038316600081815260026020526040808220939093559151909190600080516020613f7583398151915290612bf39085815260200190565b60405180910390a35050565b6001600160a01b03831660009081526002602052604090205481811015612c635760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b604482015260640161106e565b612c6d848361344c565b612c7783836134d7565b826001600160a01b0316846001600160a01b0316600080516020613f7583398151915284604051612caa91815260200190565b60405180910390a350505050565b6000612586836001600160a01b03841661335f565b6000610f86825490565b6000612586838361351c565b6000818152600183016020526040812054612d2a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f86565b506000610f86565b6001600160a01b03811660009081526001830160205260408120541515612586565b6001600160a01b0380851660009081526002602052604080822054928816825290205484811015612dc25760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b604482015260640161106e565b6002600d54612dd19190613da6565b60065560008315612e4357600754600160a81b900460ff1615612e3257600d54861115612e325760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b604482015260640161106e565b50601654610100900460ff16612f0a565b8415612ed157600754600160b81b900460ff1615612e9157600c54612e69906002613eb6565b612e738785613d69565b1115612e915760405162461bcd60e51b815260040161106e90613cce565b600754600160b01b900460ff1615612ec557600e54861115612ec55760405162461bcd60e51b815260040161106e90613cce565b5060165460ff16612f0a565b600c54612ede8785613d69565b1115612efc5760405162461bcd60e51b815260040161106e90613cce565b5060165462010000900460ff165b6016546001600160a01b03898116600160301b9092041614801590612f32575060265460ff16155b8015612f41575060245460ff16155b15612f4f57612f4f866129f0565b601654600090612f809088908490612f7b9060ff63010000008204811691640100000000900416613d81565b6135a2565b90506000612f8e8289613ed5565b9050612f9a8a8961344c565b3060009081526002602052604081208054849290612fb9908490613d69565b90915550612fc9905089826134d7565b886001600160a01b03168a6001600160a01b0316600080516020613f7583398151915283604051612ffc91815260200190565b60405180910390a350505050505050505050565b6017546130289030906001600160a01b03168361258d565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061305d5761305d613f33565b6001600160a01b03928316602091820292909201810191909152601754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156130b157600080fd5b505afa1580156130c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130e991906136ea565b816001815181106130fc576130fc613f33565b6001600160a01b03928316602091820292909201015260175460405163791ac94760e01b815291169063791ac94790613142908590600090869030904290600401613cf8565b600060405180830381600087803b15801561315c57600080fd5b505af1158015613170573d6000803e3d6000fd5b505050505050565b806023600082825461318a9190613d69565b90915550506017546131a79030906001600160a01b03168461258d565b60175460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b15801561320f57600080fd5b505af1158015613223573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906132489190613b36565b5050505050565b601e546000906064906132659060ff1684613eb6565b61326f9190613da6565b601e5490915060009060649061328d90610100900460ff1685613eb6565b6132979190613da6565b601e549091506000906064906132b69062010000900460ff1686613eb6565b6132c09190613da6565b905047816132ce8486613d69565b6132d89190613d69565b111561331057600047826132ec8587613d69565b6132f69190613d69565b6133009190613ed5565b905061330c8183613ed5565b9150505b82601f60008282546133229190613d69565b92505081905550816021600082825461333b9190613d69565b9250508190555080602060008282546133549190613d69565b909155505050505050565b60008181526001830160205260408120548015613442576000613383600183613ed5565b855490915060009061339790600190613ed5565b905060008660000182815481106133b0576133b0613f33565b90600052602060002001549050808760000184815481106133d3576133d3613f33565b60009182526020808320909101929092558281526001890190915260409020849055865487908061340657613406613f1d565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610f86565b6000915050610f86565b6001600160a01b038216600090815260026020526040812054613470908390613ed5565b30600090815260026020526040812080549293508492909190613494908490613d69565b90915550506001600160a01b0383166000818152600260205260409081902083905551309190600080516020613f75833981519152906126749086815260200190565b6001600160a01b0382166000908152600260205260408120546134fb908390613d69565b6001600160a01b039093166000908152600260205260409020929092555050565b8154600090821061357a5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161106e565b82600001828154811061358f5761358f613f33565b9060005260206000200154905092915050565b60006127108260ff168460ff16866135ba9190613eb6565b6135c49190613eb6565b610f6d9190613da6565b60008083601f8401126135e057600080fd5b50813567ffffffffffffffff8111156135f857600080fd5b6020830191508360208260051b850101111561361357600080fd5b9250929050565b8035801515811461362a57600080fd5b919050565b600082601f83011261364057600080fd5b813567ffffffffffffffff8082111561365b5761365b613f49565b604051601f8301601f19908116603f0116810190828211818310171561368357613683613f49565b8160405283815286602085880101111561369c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560ff8116811461362a57600080fd5b6000602082840312156136df57600080fd5b813561258681613f5f565b6000602082840312156136fc57600080fd5b815161258681613f5f565b6000806040838503121561371a57600080fd5b823561372581613f5f565b91506137336020840161361a565b90509250929050565b6000806040838503121561374f57600080fd5b823561375a81613f5f565b9150602083013561376a81613f5f565b809150509250929050565b60008060006060848603121561378a57600080fd5b833561379581613f5f565b925060208401356137a581613f5f565b929592945050506040919091013590565b6000806000806000608086880312156137ce57600080fd5b85356137d981613f5f565b945060208601356137e981613f5f565b935060408601359250606086013567ffffffffffffffff8082111561380d57600080fd5b818801915088601f83011261382157600080fd5b81358181111561383057600080fd5b89602082850101111561384257600080fd5b9699959850939650602001949392505050565b6000806040838503121561386857600080fd5b823561387381613f5f565b946020939093013593505050565b60008060008060008060c0878903121561389a57600080fd5b86356138a581613f5f565b9550602087013594506138ba6040880161361a565b93506138c86060880161361a565b92506138d66080880161361a565b91506138e460a0880161361a565b90509295509295509295565b60008060006060848603121561390557600080fd5b833561391081613f5f565b95602085013595506040909401359392505050565b6000806000806080858703121561393b57600080fd5b843561394681613f5f565b93506020850135925060408501359150606085013567ffffffffffffffff81111561397057600080fd5b61397c8782880161362f565b91505092959194509250565b60008060008060008060a087890312156139a157600080fd5b86356139ac81613f5f565b95506020870135945060408701359350606087013567ffffffffffffffff808211156139d757600080fd5b6139e38a838b0161362f565b945060808901359150808211156139f957600080fd5b50613a0689828a016135ce565b979a9699509497509295939492505050565b600080600060408486031215613a2d57600080fd5b833567ffffffffffffffff811115613a4457600080fd5b613a50868287016135ce565b909790965060209590950135949350505050565b600060208284031215613a7657600080fd5b6125868261361a565b600060208284031215613a9157600080fd5b5035919050565b60008060408385031215613aab57600080fd5b82359150602083013567ffffffffffffffff811115613ac957600080fd5b613ad58582860161362f565b9150509250929050565b600060208284031215613af157600080fd5b813567ffffffffffffffff811115613b0857600080fd5b610f6d8482850161362f565b60008060408385031215613b2757600080fd5b50508035926020909101359150565b600080600060608486031215613b4b57600080fd5b8351925060208401519150604084015190509250925092565b600080600080600060a08688031215613b7c57600080fd5b613b85866136bc565b9450613b93602087016136bc565b9350613ba1604087016136bc565b9250613baf606087016136bc565b9150613bbd608087016136bc565b90509295509295909350565b6000815180845260005b81811015613bef57602081850181015186830182015201613bd3565b81811115613c01576000602083870101525b50601f01601f19169290920160200192915050565b6020808252825182820181905260009190848201906040850190845b81811015613c4e57835183529284019291840191600101613c32565b50909695505050505050565b6020815260006125866020830184613bc9565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526012908201527143616c6c6572206e6f7420696e205465616d60701b604082015260600190565b60208082526010908201526f3bb430b63290383937ba32b1ba34b7b760811b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613d485784516001600160a01b031683529383019391830191600101613d23565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115613d7c57613d7c613f07565b500190565b600060ff821660ff84168060ff03821115613d9e57613d9e613f07565b019392505050565b600082613dc357634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115613e03578160001904821115613de957613de9613f07565b80851615613df657918102915b93841c9390800290613dcd565b509250929050565b600061258660ff841683600082613e2457506001610f86565b81613e3157506000610f86565b8160018114613e475760028114613e5157613e6d565b6001915050610f86565b60ff841115613e6257613e62613f07565b50506001821b610f86565b5060208310610133831016604e8410600b8410161715613e90575081810a610f86565b613e9a8383613dc8565b8060001904821115613eae57613eae613f07565b029392505050565b6000816000190483118215151615613ed057613ed0613f07565b500290565b600082821015613ee757613ee7613f07565b500390565b6000600019821415613f0057613f00613f07565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146113b357600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212209aa505fd5db87ffff7a052e6d7a3b259eecca7735d66cf64c6665b24307db84164736f6c63430008070033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed Bytecode

0x6080604052600436106104945760003560e01c8063843abdd01161025e578063b3da7ef511610143578063e4762a93116100bb578063f2fde38b11610082578063f2fde38b14610ea5578063f4f8c16614610ec5578063f88b0e4614610ee6578063f8f08eee14610efc578063fa54080114610f1c578063faf0a26f14610f3c57005b8063e4762a9314610dfe578063ea0eac6914610e2b578063eb25952314610e4b578063eb8e886314610e6b578063ec521be414610e8057005b8063d2b0737b1161010a578063d2b0737b14610d16578063d9a431b314610d36578063dd62ed3e14610d4b578063dff6bcbf14610d91578063e18802ca14610db1578063e3a9db1a14610dd157005b8063b3da7ef514610c62578063ba2cb23714610c82578063c04a541414610ca2578063c2cf92e814610cca578063d1262f5514610ce957005b806395d89b41116101d6578063a0dd80401161019d578063a0dd804014610b84578063a457c2d714610ba4578063a7bb580314610bc4578063a8bee36814610c02578063a9059cbb14610c22578063b20c6fc114610c4257005b806395d89b41146104d057806397aba7f914610b0e57806399b8a3f014610b2e5780639fa62d5f14610b44578063a0712d6814610b6457005b8063893d20e811610225578063893d20e814610a845780638b3b5bb314610aa25780638d060d7714610ab85780638d2c503914610ace5780638da5cb5b14610a8457806393ab98f214610aee57005b8063843abdd014610a0b57806386d0ada814610a2b57806386f51cea14610a455780638724cc721461060c578063887c60fb14610a6557005b80634089b1701161038457806358eaa1ea116102fc57806370a08231116102c357806370a082311461092d578063715018a61461096357806375f0a87414610978578063762bb282146109b85780637b208769146109ce5780637f919373146109f657005b806358eaa1ea14610899578063595d5d30146108b95780635dc55f2f146108d357806361a23c69146108f35780636ff732011461090d57005b80634ada218b1161034b5780634ada218b146107f85780634cdaf0ae146108175780634f91e48c14610837578063588aeaf21461084d578063589210d91461086d57806358e553651461088357005b80634089b1701461076c578063414916e51461078257806342966c68146107a25780634607e692146107c257806348e907b7146107e257005b806323b872dd1161041757806330f6f1ef116103de57806330f6f1ef146106a5578063311a8697146106c5578063313ce567146106ec578063340e578914610700578063370c325214610716578063395093511461074c57005b806323b872dd14610621578063255d3ddf146106415780632866ed21146106615780632c02c26a1461067b5780632cb88ba41461069057005b8063150b7a021161045b578063150b7a021461057e57806316828728146105c357806318160ddd146105e25780631eb25d13146105f75780631f8b845e1461060c57005b80630201ecde1461049d57806306fdde03146104d0578063095ea7b3146105065780630deea608146105365780630fd99e161461055657005b3661049b57005b005b3480156104a957600080fd5b506104bd6104b83660046138f0565b610f51565b6040519081526020015b60405180910390f35b3480156104dc57600080fd5b506040805180820190915260048152634241504560e01b60208201525b6040516104c79190613c5a565b34801561051257600080fd5b50610526610521366004613855565b610f75565b60405190151581526020016104c7565b34801561054257600080fd5b50610526610551366004613925565b610f8c565b34801561056257600080fd5b5061056b606481565b60405161ffff90911681526020016104c7565b34801561058a57600080fd5b506105aa6105993660046137b6565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016104c7565b3480156105cf57600080fd5b5060145461052690610100900460ff1681565b3480156105ee57600080fd5b50600b546104bd565b34801561060357600080fd5b506104bd610fdd565b34801561061857600080fd5b5061056b600181565b34801561062d57600080fd5b5061052661063c366004613775565b610ffa565b34801561064d57600080fd5b506014546105269062010000900460ff1681565b34801561066d57600080fd5b506014546105269060ff1681565b34801561068757600080fd5b5061049b611096565b34801561069c57600080fd5b5061049b6110cc565b3480156106b157600080fd5b5061049b6106c0366004613707565b6111a3565b3480156106d157600080fd5b506106da600181565b60405160ff90911681526020016104c7565b3480156106f857600080fd5b5060096106da565b34801561070c57600080fd5b506104bd60205481565b34801561072257600080fd5b506104bd6107313660046136cd565b6001600160a01b031660009081526011602052604090205490565b34801561075857600080fd5b50610526610767366004613855565b611210565b34801561077857600080fd5b506104bd601d5481565b34801561078e57600080fd5b5061049b61079d3660046136cd565b611247565b3480156107ae57600080fd5b5061049b6107bd366004613a7f565b611294565b3480156107ce57600080fd5b5061049b6107dd366004613a7f565b611378565b3480156107ee57600080fd5b506104bd601c5481565b34801561080457600080fd5b5060265461052690610100900460ff1681565b34801561082357600080fd5b5061049b6108323660046136cd565b6113b6565b34801561084357600080fd5b506104bd600d5481565b34801561085957600080fd5b5061049b6108683660046136cd565b611405565b34801561087957600080fd5b506104bd600e5481565b34801561088f57600080fd5b506104bd601f5481565b3480156108a557600080fd5b5061049b6108b4366004613a64565b611435565b3480156108c557600080fd5b50601b546105269060ff1681565b3480156108df57600080fd5b5061049b6108ee366004613a18565b611478565b3480156108ff57600080fd5b50601e546106da9060ff1681565b34801561091957600080fd5b5061049b610928366004613a7f565b6115d2565b34801561093957600080fd5b506104bd6109483660046136cd565b6001600160a01b031660009081526002602052604090205490565b34801561096f57600080fd5b5061049b6115fc565b34801561098457600080fd5b506109a073ecb1c6fa4faea49047fa0748b0a1d30136baa73f81565b6040516001600160a01b0390911681526020016104c7565b3480156109c457600080fd5b506104bd600c5481565b3480156109da57600080fd5b506109a07365685081e64fcbd2377c95e5ccb6167ff5f503d381565b348015610a0257600080fd5b5061049b61167f565b348015610a1757600080fd5b5061049b610a26366004613a64565b6116d1565b348015610a3757600080fd5b506026546105269060ff1681565b348015610a5157600080fd5b5061049b610a60366004613881565b611714565b348015610a7157600080fd5b5060245461052690610100900460ff1681565b348015610a9057600080fd5b506000546001600160a01b03166109a0565b348015610aae57600080fd5b506104bd60105481565b348015610ac457600080fd5b506104bd60235481565b348015610ada57600080fd5b5061049b610ae9366004613a64565b611833565b348015610afa57600080fd5b506109a0610b09366004613a7f565b61186b565b348015610b1a57600080fd5b506109a0610b29366004613a98565b611895565b348015610b3a57600080fd5b506104bd60215481565b348015610b5057600080fd5b5061049b610b5f366004613b14565b611914565b348015610b7057600080fd5b5061049b610b7f366004613a7f565b6119c8565b348015610b9057600080fd5b50601e546106da9062010000900460ff1681565b348015610bb057600080fd5b50610526610bbf366004613855565b611a58565b348015610bd057600080fd5b50610be4610bdf366004613adf565b611ad4565b60408051938452602084019290925260ff16908201526060016104c7565b348015610c0e57600080fd5b5061049b610c1d366004613a64565b611b48565b348015610c2e57600080fd5b50610526610c3d366004613855565b611b8b565b348015610c4e57600080fd5b5061049b610c5d366004613988565b611b98565b348015610c6e57600080fd5b5061049b610c7d366004613b64565b611e79565b348015610c8e57600080fd5b5061049b610c9d366004613925565b611fe7565b348015610cae57600080fd5b506109a0734223b10d22bf8634d5128f588600c65f854cd20c81565b348015610cd657600080fd5b50601e546106da90610100900460ff1681565b348015610cf557600080fd5b506104bd610d04366004613a7f565b60009081526012602052604090205490565b348015610d2257600080fd5b506104bd610d313660046138f0565b6121be565b348015610d4257600080fd5b5061049b61220d565b348015610d5757600080fd5b506104bd610d6636600461373c565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610d9d57600080fd5b5061049b610dac3660046136cd565b612241565b348015610dbd57600080fd5b506104f9610dcc3660046138f0565b612271565b348015610ddd57600080fd5b50610df1610dec3660046136cd565b6122b7565b6040516104c79190613c16565b348015610e0a57600080fd5b506104bd610e19366004613a7f565b60009081526013602052604090205490565b348015610e3757600080fd5b506104bd610e463660046138f0565b612373565b348015610e5757600080fd5b506019546109a0906001600160a01b031681565b348015610e7757600080fd5b506106da603181565b348015610e8c57600080fd5b506007546109a09061010090046001600160a01b031681565b348015610eb157600080fd5b5061049b610ec03660046136cd565b612390565b348015610ed157600080fd5b50601454610526906301000000900460ff1681565b348015610ef257600080fd5b506104bd60255481565b348015610f0857600080fd5b5061049b610f17366004613a64565b612489565b348015610f2857600080fd5b506104bd610f37366004613a7f565b6124cc565b348015610f4857600080fd5b5061049b61251f565b6000610f6d610f61858585612271565b805190602001206124cc565b949350505050565b6000610f8233848461258d565b5060015b92915050565b600080610f9a8686866121be565b90506000610fa7826124cc565b60145490915064010000000090046001600160a01b0316610fc88286611895565b6001600160a01b031614979650505050505050565b610fe96009600a613e0b565b610ff790633b9aca00613eb6565b81565b6000611007848484612681565b6001600160a01b0384166000908152600360209081526040808320338452909152902054828110156110775760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b60448201526064015b60405180910390fd5b61108b85336110868685613ed5565b61258d565b506001949350505050565b61109f33612949565b6110bb5760405162461bcd60e51b815260040161106e90613ca2565b6026805461ff001916610100179055565b6110d533612949565b6110f15760405162461bcd60e51b815260040161106e90613ca2565b602180546000918290556040519091907365685081e64fcbd2377c95e5ccb6167ff5f503d39083905b60006040518083038185875af1925050503d8060008114611157576040519150601f19603f3d011682016040523d82523d6000602084013e61115c565b606091505b505090508061119f5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b604482015260640161106e565b5050565b336111b66000546001600160a01b031690565b6001600160a01b0316146111dc5760405162461bcd60e51b815260040161106e90613c6d565b601980546001600160a01b0319166001600160a01b039390931692909217909155601b805460ff1916911515919091179055565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610f82918590611086908690613d69565b61125033612949565b61126c5760405162461bcd60e51b815260040161106e90613ca2565b600780546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60075461010090046001600160a01b031633146112e85760405162461bcd60e51b815260206004820152601260248201527121b0b63632b91034b9903737ba1031b432b360711b604482015260640161106e565b80600b546112f69190613d69565b600b5560075461010090046001600160a01b0316600090815260026020526040902054611324908290613ed5565b600780546001600160a01b036101009182900481166000908152600260209081526040808320969096559354945186815292909404169291600080516020613f75833981519152910160405180910390a350565b61138133612949565b61139d5760405162461bcd60e51b815260040161106e90613ca2565b6113b36113ae82633b9aca00613eb6565b6129f0565b50565b6113bf33612949565b6113db5760405162461bcd60e51b815260040161106e90613ca2565b602680546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b61140e33612949565b61142a5760405162461bcd60e51b815260040161106e90613ca2565b61119f600482612571565b61143e33612949565b61145a5760405162461bcd60e51b815260040161106e90613ca2565b60078054911515600160c81b0260ff60c81b19909216919091179055565b60005b828110156115cc57426012600086868581811061149a5761149a613f33565b9050602002013581526020019081526020016000208190555081601360008686858181106114ca576114ca613f33565b60209081029290920135835250810191909152604001600020556019546001600160a01b031663b88d4fde333087878681811061150957611509613f33565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152608060648201526000608482015260a401600060405180830381600087803b15801561156e57600080fd5b505af1158015611582573d6000803e3d6000fd5b505050506115b984848381811061159b5761159b613f33565b336000908152601a6020908152604090912093910201359050612b4f565b50806115c481613eec565b91505061147b565b50505050565b6115db33612949565b6115f75760405162461bcd60e51b815260040161106e90613ca2565b600a55565b3361160f6000546001600160a01b031690565b6001600160a01b0316146116355760405162461bcd60e51b815260040161106e90613c6d565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61168833612949565b6116a45760405162461bcd60e51b815260040161106e90613ca2565b601f805460009182905560405190919073ecb1c6fa4faea49047fa0748b0a1d30136baa73f90839061111a565b6116da33612949565b6116f65760405162461bcd60e51b815260040161106e90613ca2565b60078054911515600160a81b0260ff60a81b19909216919091179055565b336117276000546001600160a01b031690565b6001600160a01b03161461174d5760405162461bcd60e51b815260040161106e90613c6d565b6102588510156117b95760405162461bcd60e51b815260206004820152603160248201527f63616e6e6f742073657420636c61696e206d6f7265206f6674656e207468616e604482015270206576657279203130206d696e7574657360781b606482015260840161106e565b6010949094556014805463ffffff01600160c01b0319166401000000006001600160a01b03979097169690960260ff1916959095179215159290921762ffff0019166101009115159190910262ff000019161762010000921515929092029190911763ff0000001916630100000091151591909102179055565b61183c33612949565b6118585760405162461bcd60e51b815260040161106e90613ca2565b6026805460ff1916911515919091179055565b600f818154811061187b57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000806000806118a485611ad4565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa1580156118ff573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b61191d33612949565b6119395760405162461bcd60e51b815260040161106e90613ca2565b624c4b406119496009600a613e0b565b6119539084613eb6565b92506119616009600a613e0b565b61196b9083613eb6565b915080831015801561197d5750808210155b6119bc5760405162461bcd60e51b815260206004820152601060248201526f2634b6b4ba10383937ba32b1ba34b7b760811b604482015260640161106e565b50600c91909155600d55565b60075461010090046001600160a01b03163314611a1c5760405162461bcd60e51b815260206004820152601260248201527121b0b63632b91034b9903737ba1031b432b360711b604482015260640161106e565b80600b54611a2a9190613d69565b600b5560075461010090046001600160a01b0316600090815260026020526040902054611324908290613d69565b3360009081526003602090815260408083206001600160a01b038616845290915281205482811015611abb5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b604482015260640161106e565b611aca33856110868685613ed5565b5060019392505050565b60008060008351604114611b2a5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e6774680000000000000000604482015260640161106e565b50505060208101516040820151606090920151909260009190911a90565b611b5133612949565b611b6d5760405162461bcd60e51b815260040161106e90613ca2565b60078054911515600160b81b0260ff60b81b19909216919091179055565b6000610f82338484612681565b60026001541415611beb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161106e565b60026001558415611cab57611c0286868686610f8c565b611c425760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964205369676e617475726560781b604482015260640161106e565b60008481526015602052604090205460ff1615611c915760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420436c61696d60981b604482015260640161106e565b6000848152601560205260409020805460ff191660011790555b60005b81811015611e4f57611ce9838383818110611ccb57611ccb613f33565b336000908152601a6020908152604090912093910201359050612b5b565b611d355760405162461bcd60e51b815260206004820152601c60248201527f5374616b696e673a20746f6b656e206e6f74206465706f736974656400000000604482015260640161106e565b600060126000858585818110611d4d57611d4d613f33565b90506020020135815260200190815260200160002081905550611d99838383818110611d7b57611d7b613f33565b336000908152601a6020908152604090912093910201359050612b73565b506019546001600160a01b031663b88d4fde3033868686818110611dbf57611dbf613f33565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152608060648201526000608482015260a401600060405180830381600087803b158015611e2457600080fd5b505af1158015611e38573d6000803e3d6000fd5b505050508080611e4790613eec565b915050611cae565b508415611e6d57611e6d86611e6887633b9aca00613eb6565b612b7f565b50506001805550505050565b611e8233612949565b611e9e5760405162461bcd60e51b815260040161106e90613ca2565b6000611eaa8686613d81565b90508060ff16606414611f0b5760405162461bcd60e51b815260206004820152602360248201527f6c69712b6469737472696275746564206e6565647320746f20657175616c203160448201526230302560e81b606482015260840161106e565b603160ff851611801590611f235750603160ff841611155b8015611f335750603160ff831611155b611f7f5760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d61782074617800000000000000604482015260640161106e565b506016805460ff928316620100000262ff0000199484166101000261ffff199885166401000000000264ff00000000199886166301000000029890981664ffff0000001990931692909217969096179690961693909116929092179390931792909216179055565b60145460ff1661202a5760405162461bcd60e51b815260206004820152600e60248201526d10db185a5b48111a5cd8589b195960921b604482015260640161106e565b601454610100900460ff16156120865761204684848484610f8c565b6120865760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964205369676e617475726560781b604482015260640161106e565b60145462010000900460ff1615612101576010546001600160a01b0385166000908152601160205260409020546120bd9190613d69565b42116121015760405162461bcd60e51b81526020600482015260136024820152722737ba103a34329021b630b4b6903a34b6b29760691b604482015260640161106e565b6014546301000000900460ff16156121955760008281526015602052604090205460ff16156121625760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420436c61696d60981b604482015260640161106e565b6000828152601560209081526040808320805460ff191660011790556001600160a01b0387168352601190915290204290555b6115cc6121aa6000546001600160a01b031690565b856121b986633b9aca00613eb6565b612bff565b6040516bffffffffffffffffffffffff19606085901b16602082015260348101839052605481018290526000906074016040516020818303038152906040528051906020012090509392505050565b61221633612949565b6122325760405162461bcd60e51b815260040161106e90613ca2565b6007805460ff60c01b19169055565b61224a33612949565b6122665760405162461bcd60e51b815260040161106e90613ca2565b61119f600482612cb8565b604051606084811b6bffffffffffffffffffffffff1916602083015260348201849052605482018390529060740160405160208183030381529060405290509392505050565b6001600160a01b0381166000908152601a602052604081206060916122db82612ccd565b67ffffffffffffffff8111156122f3576122f3613f49565b60405190808252806020026020018201604052801561231c578160200160208202803683370190505b50905060005b61232b83612ccd565b81101561236b5761233c8382612cd7565b82828151811061234e5761234e613f33565b60209081029190910101528061236381613eec565b915050612322565b509392505050565b6000612380848484612271565b8051906020012090509392505050565b336123a36000546001600160a01b031690565b6001600160a01b0316146123c95760405162461bcd60e51b815260040161106e90613c6d565b6001600160a01b03811661242e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161106e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61249233612949565b6124ae5760405162461bcd60e51b815260040161106e90613ca2565b60078054911515600160b01b0260ff60b01b19909216919091179055565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b61252833612949565b6125445760405162461bcd60e51b815260040161106e90613ca2565b60208054600091829055604051909190734223b10d22bf8634d5128f588600c65f854cd20c90839061111a565b6000612586836001600160a01b038416612ce3565b9392505050565b6001600160a01b0383166125d75760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b604482015260640161106e565b6001600160a01b03821661261f5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b604482015260640161106e565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166126cc5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b604482015260640161106e565b6001600160a01b0382166127155760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b604482015260640161106e565b6000612722600485612d32565b806127335750612733600484612d32565b905060006001600160a01b03851630148061275657506001600160a01b03841630145b6017546016549192506001600160a01b0390811691600091888116600160301b909204161480156127985750816001600160a01b0316866001600160a01b0316145b806127d357506016546001600160a01b03878116600160301b909204161480156127d35750816001600160a01b0316876001600160a01b0316145b6016549091506000906001600160a01b03898116600160301b90920416148061280d5750826001600160a01b0316886001600160a01b0316145b6016549091506000906001600160a01b03898116600160301b9092041614806128475750836001600160a01b0316886001600160a01b0316145b905084806128525750825b8061285a5750855b1561286f5761286a898989612bff565b61293e565b602654610100900460ff166128bc5760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81a5cc8191a5cd8589b1959606a1b604482015260640161106e565b600754600160c81b900460ff1615612931573360009081526008602052604090205460ff1615612916573360009081526009602052604090204290819055600a5461290691613d69565b421061291157600080fd5b612931565b336000908152600860205260409020805460ff191660011790555b61293e8989898585612d54565b505050505050505050565b600754600090600160c01b900460ff1661296557506000919050565b6000546001600160a01b038381169116148061299d57506001600160a01b03821673ecb1c6fa4faea49047fa0748b0a1d30136baa73f145b806129c457506001600160a01b0382167365685081e64fcbd2377c95e5ccb6167ff5f503d3145b80610f8657506001600160a01b038216734223b10d22bf8634d5128f588600c65f854cd20c1492915050565b6024805460ff1916600117905530600090815260026020526040812054601654909190612a3290640100000000810460ff908116916301000000900416613d81565b60ff1690506000600654905083811115612a545760075460ff1615612a545750825b80831080612a64575061ffff8216155b15612a7157505050612b42565b60165460009061ffff841690612a91906301000000900460ff1684613eb6565b612a9b9190613da6565b90506000612aa98284613ed5565b90506000612ab8600284613da6565b90506000612ac68285613ed5565b90506000612ad48483613d69565b905047612ae082613010565b6000612aec8247613ed5565b601b5490915060ff1615612b1f57600083612b078684613eb6565b612b119190613da6565b9050612b1d8682613178565b505b6000612b2b8347613ed5565b9050612b368161324f565b50505050505050505050505b506024805460ff19169055565b60006125868383612ce3565b60008181526001830160205260408120541515612586565b6000612586838361335f565b80600b54612b8d9190613d69565b600b556001600160a01b038216600090815260026020526040902054612bb4908290613d69565b6001600160a01b038316600081815260026020526040808220939093559151909190600080516020613f7583398151915290612bf39085815260200190565b60405180910390a35050565b6001600160a01b03831660009081526002602052604090205481811015612c635760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b604482015260640161106e565b612c6d848361344c565b612c7783836134d7565b826001600160a01b0316846001600160a01b0316600080516020613f7583398151915284604051612caa91815260200190565b60405180910390a350505050565b6000612586836001600160a01b03841661335f565b6000610f86825490565b6000612586838361351c565b6000818152600183016020526040812054612d2a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f86565b506000610f86565b6001600160a01b03811660009081526001830160205260408120541515612586565b6001600160a01b0380851660009081526002602052604080822054928816825290205484811015612dc25760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b604482015260640161106e565b6002600d54612dd19190613da6565b60065560008315612e4357600754600160a81b900460ff1615612e3257600d54861115612e325760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b604482015260640161106e565b50601654610100900460ff16612f0a565b8415612ed157600754600160b81b900460ff1615612e9157600c54612e69906002613eb6565b612e738785613d69565b1115612e915760405162461bcd60e51b815260040161106e90613cce565b600754600160b01b900460ff1615612ec557600e54861115612ec55760405162461bcd60e51b815260040161106e90613cce565b5060165460ff16612f0a565b600c54612ede8785613d69565b1115612efc5760405162461bcd60e51b815260040161106e90613cce565b5060165462010000900460ff165b6016546001600160a01b03898116600160301b9092041614801590612f32575060265460ff16155b8015612f41575060245460ff16155b15612f4f57612f4f866129f0565b601654600090612f809088908490612f7b9060ff63010000008204811691640100000000900416613d81565b6135a2565b90506000612f8e8289613ed5565b9050612f9a8a8961344c565b3060009081526002602052604081208054849290612fb9908490613d69565b90915550612fc9905089826134d7565b886001600160a01b03168a6001600160a01b0316600080516020613f7583398151915283604051612ffc91815260200190565b60405180910390a350505050505050505050565b6017546130289030906001600160a01b03168361258d565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061305d5761305d613f33565b6001600160a01b03928316602091820292909201810191909152601754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156130b157600080fd5b505afa1580156130c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130e991906136ea565b816001815181106130fc576130fc613f33565b6001600160a01b03928316602091820292909201015260175460405163791ac94760e01b815291169063791ac94790613142908590600090869030904290600401613cf8565b600060405180830381600087803b15801561315c57600080fd5b505af1158015613170573d6000803e3d6000fd5b505050505050565b806023600082825461318a9190613d69565b90915550506017546131a79030906001600160a01b03168461258d565b60175460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b15801561320f57600080fd5b505af1158015613223573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906132489190613b36565b5050505050565b601e546000906064906132659060ff1684613eb6565b61326f9190613da6565b601e5490915060009060649061328d90610100900460ff1685613eb6565b6132979190613da6565b601e549091506000906064906132b69062010000900460ff1686613eb6565b6132c09190613da6565b905047816132ce8486613d69565b6132d89190613d69565b111561331057600047826132ec8587613d69565b6132f69190613d69565b6133009190613ed5565b905061330c8183613ed5565b9150505b82601f60008282546133229190613d69565b92505081905550816021600082825461333b9190613d69565b9250508190555080602060008282546133549190613d69565b909155505050505050565b60008181526001830160205260408120548015613442576000613383600183613ed5565b855490915060009061339790600190613ed5565b905060008660000182815481106133b0576133b0613f33565b90600052602060002001549050808760000184815481106133d3576133d3613f33565b60009182526020808320909101929092558281526001890190915260409020849055865487908061340657613406613f1d565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610f86565b6000915050610f86565b6001600160a01b038216600090815260026020526040812054613470908390613ed5565b30600090815260026020526040812080549293508492909190613494908490613d69565b90915550506001600160a01b0383166000818152600260205260409081902083905551309190600080516020613f75833981519152906126749086815260200190565b6001600160a01b0382166000908152600260205260408120546134fb908390613d69565b6001600160a01b039093166000908152600260205260409020929092555050565b8154600090821061357a5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161106e565b82600001828154811061358f5761358f613f33565b9060005260206000200154905092915050565b60006127108260ff168460ff16866135ba9190613eb6565b6135c49190613eb6565b610f6d9190613da6565b60008083601f8401126135e057600080fd5b50813567ffffffffffffffff8111156135f857600080fd5b6020830191508360208260051b850101111561361357600080fd5b9250929050565b8035801515811461362a57600080fd5b919050565b600082601f83011261364057600080fd5b813567ffffffffffffffff8082111561365b5761365b613f49565b604051601f8301601f19908116603f0116810190828211818310171561368357613683613f49565b8160405283815286602085880101111561369c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560ff8116811461362a57600080fd5b6000602082840312156136df57600080fd5b813561258681613f5f565b6000602082840312156136fc57600080fd5b815161258681613f5f565b6000806040838503121561371a57600080fd5b823561372581613f5f565b91506137336020840161361a565b90509250929050565b6000806040838503121561374f57600080fd5b823561375a81613f5f565b9150602083013561376a81613f5f565b809150509250929050565b60008060006060848603121561378a57600080fd5b833561379581613f5f565b925060208401356137a581613f5f565b929592945050506040919091013590565b6000806000806000608086880312156137ce57600080fd5b85356137d981613f5f565b945060208601356137e981613f5f565b935060408601359250606086013567ffffffffffffffff8082111561380d57600080fd5b818801915088601f83011261382157600080fd5b81358181111561383057600080fd5b89602082850101111561384257600080fd5b9699959850939650602001949392505050565b6000806040838503121561386857600080fd5b823561387381613f5f565b946020939093013593505050565b60008060008060008060c0878903121561389a57600080fd5b86356138a581613f5f565b9550602087013594506138ba6040880161361a565b93506138c86060880161361a565b92506138d66080880161361a565b91506138e460a0880161361a565b90509295509295509295565b60008060006060848603121561390557600080fd5b833561391081613f5f565b95602085013595506040909401359392505050565b6000806000806080858703121561393b57600080fd5b843561394681613f5f565b93506020850135925060408501359150606085013567ffffffffffffffff81111561397057600080fd5b61397c8782880161362f565b91505092959194509250565b60008060008060008060a087890312156139a157600080fd5b86356139ac81613f5f565b95506020870135945060408701359350606087013567ffffffffffffffff808211156139d757600080fd5b6139e38a838b0161362f565b945060808901359150808211156139f957600080fd5b50613a0689828a016135ce565b979a9699509497509295939492505050565b600080600060408486031215613a2d57600080fd5b833567ffffffffffffffff811115613a4457600080fd5b613a50868287016135ce565b909790965060209590950135949350505050565b600060208284031215613a7657600080fd5b6125868261361a565b600060208284031215613a9157600080fd5b5035919050565b60008060408385031215613aab57600080fd5b82359150602083013567ffffffffffffffff811115613ac957600080fd5b613ad58582860161362f565b9150509250929050565b600060208284031215613af157600080fd5b813567ffffffffffffffff811115613b0857600080fd5b610f6d8482850161362f565b60008060408385031215613b2757600080fd5b50508035926020909101359150565b600080600060608486031215613b4b57600080fd5b8351925060208401519150604084015190509250925092565b600080600080600060a08688031215613b7c57600080fd5b613b85866136bc565b9450613b93602087016136bc565b9350613ba1604087016136bc565b9250613baf606087016136bc565b9150613bbd608087016136bc565b90509295509295909350565b6000815180845260005b81811015613bef57602081850181015186830182015201613bd3565b81811115613c01576000602083870101525b50601f01601f19169290920160200192915050565b6020808252825182820181905260009190848201906040850190845b81811015613c4e57835183529284019291840191600101613c32565b50909695505050505050565b6020815260006125866020830184613bc9565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526012908201527143616c6c6572206e6f7420696e205465616d60701b604082015260600190565b60208082526010908201526f3bb430b63290383937ba32b1ba34b7b760811b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613d485784516001600160a01b031683529383019391830191600101613d23565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115613d7c57613d7c613f07565b500190565b600060ff821660ff84168060ff03821115613d9e57613d9e613f07565b019392505050565b600082613dc357634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115613e03578160001904821115613de957613de9613f07565b80851615613df657918102915b93841c9390800290613dcd565b509250929050565b600061258660ff841683600082613e2457506001610f86565b81613e3157506000610f86565b8160018114613e475760028114613e5157613e6d565b6001915050610f86565b60ff841115613e6257613e62613f07565b50506001821b610f86565b5060208310610133831016604e8410600b8410161715613e90575081810a610f86565b613e9a8383613dc8565b8060001904821115613eae57613eae613f07565b029392505050565b6000816000190483118215151615613ed057613ed0613f07565b500290565b600082821015613ee757613ee7613f07565b500390565b6000600019821415613f0057613f00613f07565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146113b357600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212209aa505fd5db87ffff7a052e6d7a3b259eecca7735d66cf64c6665b24307db84164736f6c63430008070033

Deployed Bytecode Sourcemap

37928:33151:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64164:178;;;;;;;;;;-1:-1:-1;64164:178:0;;;;;:::i;:::-;;:::i;:::-;;;13506:25:1;;;13494:2;13479:18;64164:178:0;;;;;;;;61399:94;;;;;;;;;;-1:-1:-1;61480:5:0;;;;;;;;;;;;-1:-1:-1;;;61480:5:0;;;;61399:94;;;;;;;:::i;62270:161::-;;;;;;;;;;-1:-1:-1;62270:161:0;;;;;:::i;:::-;;:::i;:::-;;;13333:14:1;;13326:22;13308:41;;13296:2;13281:18;62270:161:0;13168:187:1;66101:388:0;;;;;;;;;;-1:-1:-1;66101:388:0;;;;;:::i;:::-;;:::i;39012:43::-;;;;;;;;;;;;39052:3;39012:43;;;;;24744:6:1;24732:19;;;24714:38;;24702:2;24687:18;39012:43:0;24570:188:1;70857:219:0;;;;;;;;;;-1:-1:-1;70857:219:0;;;;;:::i;:::-;-1:-1:-1;;;70857:219:0;;;;;;;;;;;-1:-1:-1;;;;;;14438:33:1;;;14420:52;;14408:2;14393:18;70857:219:0;14276:202:1;40740:32:0;;;;;;;;;;-1:-1:-1;40740:32:0;;;;;;;;;;;61703:108;;;;;;;;;;-1:-1:-1;61785:18:0;;61703:108;;38422:64;;;;;;;;;;;;;:::i;38650:40::-;;;;;;;;;;;;38689:1;38650:40;;62740:388;;;;;;;;;;-1:-1:-1;62740:388:0;;;;;:::i;:::-;;:::i;40779:38::-;;;;;;;;;;-1:-1:-1;40779:38:0;;;;;;;;;;;40702:31;;;;;;;;;;-1:-1:-1;40702:31:0;;;;;;;;57510:85;;;;;;;;;;;;;:::i;57846:230::-;;;;;;;;;;;;;:::i;68300:187::-;;;;;;;;;;-1:-1:-1;68300:187:0;;;;;:::i;:::-;;:::i;38766:43::-;;;;;;;;;;;;38808:1;38766:43;;;;;26102:4:1;26090:17;;;26072:36;;26060:2;26045:18;38766:43:0;25930:184:1;61603:94:0;;;;;;;;;;-1:-1:-1;38414:1:0;61603:94;;50784:33;;;;;;;;;;;;;;;;63716:134;;;;;;;;;;-1:-1:-1;63716:134:0;;;;;:::i;:::-;-1:-1:-1;;;;;63807:35:0;63774:7;63807:35;;;:31;:35;;;;;;;63716:134;63159:205;;;;;;;;;;-1:-1:-1;63159:205:0;;;;;:::i;:::-;;:::i;50421:27::-;;;;;;;;;;;;;;;;57091:88;;;;;;;;;;-1:-1:-1;57091:88:0;;;;;:::i;:::-;;:::i;56499:225::-;;;;;;;;;;-1:-1:-1;56499:225:0;;;;;:::i;:::-;;:::i;59217:120::-;;;;;;;;;;-1:-1:-1;59217:120:0;;;;;:::i;:::-;;:::i;50313:38::-;;;;;;;;;;;;;;;;60518:32;;;;;;;;;;-1:-1:-1;60518:32:0;;;;;;;;;;;60732:145;;;;;;;;;;-1:-1:-1;60732:145:0;;;;;:::i;:::-;;:::i;40177:46::-;;;;;;;;;;;;;;;;59394:110;;;;;;;;;;-1:-1:-1;59394:110:0;;;;;:::i;:::-;;:::i;40230:45::-;;;;;;;;;;;;;;;;50746:31;;;;;;;;;;;;;;;;56756:90;;;;;;;;;;-1:-1:-1;56756:90:0;;;;;:::i;:::-;;:::i;42489:37::-;;;;;;;;;;-1:-1:-1;42489:37:0;;;;;;;;68942:518;;;;;;;;;;-1:-1:-1;68942:518:0;;;;;:::i;:::-;;:::i;50499:31::-;;;;;;;;;;-1:-1:-1;50499:31:0;;;;;;;;56852:93;;;;;;;;;;-1:-1:-1;56852:93:0;;;;;:::i;:::-;;:::i;61817:121::-;;;;;;;;;;-1:-1:-1;61817:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;61912:18:0;61885:7;61912:18;;;:9;:18;;;;;;;61817:121;19625:140;;;;;;;;;;;;;:::i;39369:82::-;;;;;;;;;;;;39409:42;39369:82;;;;;-1:-1:-1;;;;;11315:32:1;;;11297:51;;11285:2;11270:18;39369:82:0;11151:203:1;40121:49:0;;;;;;;;;;;;;;;;39549:80;;;;;;;;;;;;39587:42;39549:80;;57601:238;;;;;;;;;;;;;:::i;57185:101::-;;;;;;;;;;-1:-1:-1;57185:101:0;;;;;:::i;:::-;;:::i;56000:28::-;;;;;;;;;;-1:-1:-1;56000:28:0;;;;;;;;67667:545;;;;;;;;;;-1:-1:-1;67667:545:0;;;;;:::i;:::-;;:::i;55931:28::-;;;;;;;;;;-1:-1:-1;55931:28:0;;;;;;;;;;;61299:94;;;;;;;;;;-1:-1:-1;61351:7:0;19053:6;-1:-1:-1;;;;;19053:6:0;61299:94;;40462:45;;;;;;;;;;;;;;;;52407:25;;;;;;;;;;;;;;;;58412:109;;;;;;;;;;-1:-1:-1;58412:109:0;;;;;:::i;:::-;;:::i;40282:28::-;;;;;;;;;;-1:-1:-1;40282:28:0;;;;;:::i;:::-;;:::i;66495:279::-;;;;;;;;;;-1:-1:-1;66495:279:0;;;;;:::i;:::-;;:::i;50824:29::-;;;;;;;;;;;;;;;;59722:460;;;;;;;;;;-1:-1:-1;59722:460:0;;;;;:::i;:::-;;:::i;56035:225::-;;;;;;;;;;-1:-1:-1;56035:225:0;;;;;:::i;:::-;;:::i;50661:33::-;;;;;;;;;;-1:-1:-1;50661:33:0;;;;;;;;;;;63370:340;;;;;;;;;;-1:-1:-1;63370:340:0;;;;;:::i;:::-;;:::i;66780:881::-;;;;;;;;;;-1:-1:-1;66780:881:0;;;;;:::i;:::-;;:::i;:::-;;;;13740:25:1;;;13796:2;13781:18;;13774:34;;;;13856:4;13844:17;13824:18;;;13817:45;13728:2;13713:18;66780:881:0;13542:326:1;57397:107:0;;;;;;;;;;-1:-1:-1;57397:107:0;;;;;:::i;:::-;;:::i;61944:167::-;;;;;;;;;;-1:-1:-1;61944:167:0;;;;;:::i;:::-;;:::i;69744:1107::-;;;;;;;;;;-1:-1:-1;69744:1107:0;;;;;:::i;:::-;;:::i;58613:536::-;;;;;;;;;;-1:-1:-1;58613:536:0;;;;;:::i;:::-;;:::i;64714:729::-;;;;;;;;;;-1:-1:-1;64714:729:0;;;;;:::i;:::-;;:::i;39458:84::-;;;;;;;;;;;;39500:42;39458:84;;50581:29;;;;;;;;;;-1:-1:-1;50581:29:0;;;;;;;;;;;69466:117;;;;;;;;;;-1:-1:-1;69466:117:0;;;;;:::i;:::-;69525:7;69557:18;;;:13;:18;;;;;;;69466:117;65450:203;;;;;;;;;;-1:-1:-1;65450:203:0;;;;;:::i;:::-;;:::i;57006:79::-;;;;;;;;;;;;;:::i;62117:147::-;;;;;;;;;;-1:-1:-1;62117:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;62228:19:0;;;62201:7;62228:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;62117:147;59510:111;;;;;;;;;;-1:-1:-1;59510:111:0;;;;;:::i;:::-;;:::i;63856:149::-;;;;;;;;;;-1:-1:-1;63856:149:0;;;;;:::i;:::-;;:::i;68523:383::-;;;;;;;;;;-1:-1:-1;68523:383:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;69589:121::-;;;;;;;;;;-1:-1:-1;69589:121:0;;;;;:::i;:::-;69650:7;69682:20;;;:15;:20;;;;;;;69589:121;64011:147;;;;;;;;;;-1:-1:-1;64011:147:0;;;;;:::i;:::-;;:::i;42364:30::-;;;;;;;;;;-1:-1:-1;42364:30:0;;;;-1:-1:-1;;;;;42364:30:0;;;40401:31;;;;;;;;;;;;40430:2;40401:31;;39083:71;;;;;;;;;;-1:-1:-1;39083:71:0;;;;;;;-1:-1:-1;;;;;39083:71:0;;;19918:236;;;;;;;;;;-1:-1:-1;19918:236:0;;;;;:::i;:::-;;:::i;40824:35::-;;;;;;;;;;-1:-1:-1;40824:35:0;;;;;;;;;;;55966:27;;;;;;;;;;;;;;;;57292:99;;;;;;;;;;-1:-1:-1;57292:99:0;;;;;:::i;:::-;;:::i;65662:433::-;;;;;;;;;;-1:-1:-1;65662:433:0;;;;;:::i;:::-;;:::i;58083:246::-;;;;;;;;;;;;;:::i;64164:178::-;64244:7;64276:58;64310:22;64318:2;64322:3;64326:5;64310:7;:22::i;:::-;64300:33;;;;;;64276:23;:58::i;:::-;64269:65;64164:178;-1:-1:-1;;;;64164:178:0:o;62270:161::-;62347:4;62364:37;62373:10;62385:7;62394:6;62364:8;:37::i;:::-;-1:-1:-1;62419:4:0;62270:161;;;;;:::o;66101:388::-;66245:4;66262:19;66284:37;66299:3;66304:7;66314:6;66284:14;:37::i;:::-;66262:59;;66332:28;66363:36;66387:11;66363:23;:36::i;:::-;66467:14;;66332:67;;-1:-1:-1;66467:14:0;;;-1:-1:-1;;;;;66467:14:0;66417:46;66332:67;66453:9;66417:13;:46::i;:::-;-1:-1:-1;;;;;66417:64:0;;;66101:388;-1:-1:-1;;;;;;;66101:388:0:o;38422:64::-;38473:13;38414:1;38473:2;:13;:::i;:::-;38461:25;;:9;:25;:::i;:::-;38422:64;:::o;62740:388::-;62840:4;62857:36;62867:6;62875:9;62886:6;62857:9;:36::i;:::-;-1:-1:-1;;;;;62931:19:0;;62904:24;62931:19;;;:11;:19;;;;;;;;62951:10;62931:31;;;;;;;;62981:26;;;;62973:59;;;;-1:-1:-1;;;62973:59:0;;17680:2:1;62973:59:0;;;17662:21:1;17719:2;17699:18;;;17692:30;-1:-1:-1;;;17738:18:1;;;17731:50;17798:18;;62973:59:0;;;;;;;;;63043:55;63052:6;63060:10;63072:25;63091:6;63072:16;:25;:::i;:::-;63043:8;:55::i;:::-;-1:-1:-1;63116:4:0;;62740:388;-1:-1:-1;;;;62740:388:0:o;57510:85::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;57566:14:::1;:21:::0;;-1:-1:-1;;57566:21:0::1;;;::::0;;57510:85::o;57846:230::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;57921:14:::1;::::0;;57906::::1;57946:16:::0;;;;57987:39:::1;::::0;57921:14;;57906;39587:42:::1;::::0;57921:14;;57987:39:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57973:53;;;58045:4;58037:31;;;::::0;-1:-1:-1;;;58037:31:0;;24087:2:1;58037:31:0::1;::::0;::::1;24069:21:1::0;24126:2;24106:18;;;24099:30;-1:-1:-1;;;24145:18:1;;;24138:45;24200:18;;58037:31:0::1;23885:339:1::0;58037:31:0::1;57895:181;;57846:230::o:0;68300:187::-;19209:10;19198:7;19026;19053:6;-1:-1:-1;;;;;19053:6:0;;18988:79;19198:7;-1:-1:-1;;;;;19198:21:0;;19190:66;;;;-1:-1:-1;;;19190:66:0;;;;;;;:::i;:::-;68404:15:::1;:28:::0;;-1:-1:-1;;;;;;68404:28:0::1;-1:-1:-1::0;;;;;68404:28:0;;;::::1;::::0;;;::::1;::::0;;;68443:17:::1;:36:::0;;-1:-1:-1;;68443:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;68300:187::o;63159:205::-;63267:10;63241:4;63288:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;63288:32:0;;;;;;;;;;63241:4;;63258:76;;63279:7;;63288:45;;63323:10;;63288:45;:::i;57091:88::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;57153:11:::1;:18:::0;;-1:-1:-1;;;;;57153:18:0;;::::1;;;-1:-1:-1::0;;;;;;57153:18:0;;::::1;::::0;;;::::1;::::0;;57091:88::o;56499:225::-;42173:11;;;;;-1:-1:-1;;;;;42173:11:0;41579:10;42167:17;41563:50;;;;-1:-1:-1;;;41563:50:0;;23336:2:1;41563:50:0;;;23318:21:1;23375:2;23355:18;;;23348:30;-1:-1:-1;;;23394:18:1;;;23387:48;23452:18;;41563:50:0;23134:342:1;41563:50:0;56595:3:::1;56574:18;;:24;;;;:::i;:::-;56553:18;:45:::0;56644:11:::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;56644:11:0::1;56634:22;::::0;;;:9:::1;:22;::::0;;;;;:28:::1;::::0;56659:3;;56634:28:::1;:::i;:::-;56619:11;::::0;;-1:-1:-1;;;;;56619:11:0::1;::::0;;;::::1;::::0;::::1;56609:22;::::0;;;:9:::1;:22;::::0;;;;;;;:53;;;;56699:11;;56678:38;;13506:25:1;;;56699:11:0;;;::::1;;::::0;56609:22;-1:-1:-1;;;;;;;;;;;56678:38:0;13479:18:1;56678:38:0::1;;;;;;;56499:225:::0;:::o;59217:120::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;59297:32:::1;59316:12;:4:::0;59323:5:::1;59316:12;:::i;:::-;59297:18;:32::i;:::-;59217:120:::0;:::o;60732:145::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;60825:22:::1;:44:::0;;-1:-1:-1;;;;;60825:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;60825:44:0;;::::1;::::0;;;::::1;::::0;;60732:145::o;59394:110::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;59474:22:::1;:9;59488:7:::0;59474:13:::1;:22::i;56756:90::-:0;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;56822:8:::1;:16:::0;;;::::1;;-1:-1:-1::0;;;56822:16:0::1;-1:-1:-1::0;;;;56822:16:0;;::::1;::::0;;;::::1;::::0;;56756:90::o;68942:518::-;69060:9;69055:398;69071:19;;;69055:398;;;69141:15;69112:13;:26;69126:8;;69135:1;69126:11;;;;;;;:::i;:::-;;;;;;;69112:26;;;;;;;;;;;:44;;;;69202:3;69171:15;:28;69187:8;;69196:1;69187:11;;;;;;;:::i;:::-;;;;;;;;;;69171:28;;-1:-1:-1;69171:28:0;;;;;;;;-1:-1:-1;69171:28:0;:34;69228:15;;-1:-1:-1;;;;;69228:15:0;69220:41;69280:10;69317:4;69341:8;;69350:1;69341:11;;;;;;;:::i;:::-;69220:168;;-1:-1:-1;;;;;;69220:168:0;;;;;;;-1:-1:-1;;;;;11682:15:1;;;69220:168:0;;;11664:34:1;11734:15;;;;11714:18;;;11707:43;-1:-1:-1;69341:11:0;;;;;;11766:18:1;;;11759:34;11829:3;11809:18;;;11802:31;-1:-1:-1;11849:19:1;;;11842:30;11889:19;;69220:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69403:38;69429:8;;69438:1;69429:11;;;;;;;:::i;:::-;69413:10;69403:21;;;;:9;69429:11;69403:21;;;;;;;;69429:11;;;;;-1:-1:-1;69403:25:0;:38::i;:::-;-1:-1:-1;69092:3:0;;;;:::i;:::-;;;;69055:398;;;;68942:518;;;:::o;56852:93::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;56918:12:::1;:19:::0;56852:93::o;19625:140::-;19209:10;19198:7;19026;19053:6;-1:-1:-1;;;;;19053:6:0;;18988:79;19198:7;-1:-1:-1;;;;;19198:21:0;;19190:66;;;;-1:-1:-1;;;19190:66:0;;;;;;;:::i;:::-;19724:1:::1;19708:6:::0;;19687:40:::1;::::0;-1:-1:-1;;;;;19708:6:0;;::::1;::::0;19687:40:::1;::::0;19724:1;;19687:40:::1;19755:1;19738:19:::0;;-1:-1:-1;;;;;;19738:19:0::1;::::0;;19625:140::o;57601:238::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;57678:16:::1;::::0;;57663:14:::1;57705:18:::0;;;;57748:41:::1;::::0;57678:16;;57663:14;39409:42:::1;::::0;57678:16;;57748:41:::1;10941:205:1::0;57185:101:0;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;57255:15:::1;:23:::0;;;::::1;;-1:-1:-1::0;;;57255:23:0::1;-1:-1:-1::0;;;;57255:23:0;;::::1;::::0;;;::::1;::::0;;57185:101::o;67667:545::-;19209:10;19198:7;19026;19053:6;-1:-1:-1;;;;;19053:6:0;;18988:79;19198:7;-1:-1:-1;;;;;19198:21:0;;19190:66;;;;-1:-1:-1;;;19190:66:0;;;;;;;:::i;:::-;67886:3:::1;67867:15;:22;;67859:84;;;::::0;-1:-1:-1;;;67859:84:0;;21515:2:1;67859:84:0::1;::::0;::::1;21497:21:1::0;21554:2;21534:18;;;21527:30;21593:34;21573:18;;;21566:62;-1:-1:-1;;;21644:18:1;;;21637:47;21701:19;;67859:84:0::1;21313:413:1::0;67859:84:0::1;67954:14;:32:::0;;;;67997:14:::1;:32:::0;;-1:-1:-1;;;;;;68040:23:0;67997:32;-1:-1:-1;;;;;67997:32:0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;68040:23:0;;;;;;::::1;;::::0;;;::::1;-1:-1:-1::0;;68115:42:0;67997:32:::1;68074:30:::0;::::1;;::::0;;;::::1;-1:-1:-1::0;;68115:42:0;;;;::::1;;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;68168:36:0::1;::::0;;::::1;;::::0;;;::::1;;::::0;;67667:545::o;58412:109::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;58490:16:::1;:23:::0;;-1:-1:-1;;58490:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58412:109::o;40282:28::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40282:28:0;;-1:-1:-1;40282:28:0;:::o;66495:279::-;66622:7;66648:9;66659;66670:7;66681:26;66696:10;66681:14;:26::i;:::-;66725:41;;;;;;;;;;;;14100:25:1;;;14173:4;14161:17;;14141:18;;;14134:45;;;;14195:18;;;14188:34;;;14238:18;;;14231:34;;;66647:60:0;;-1:-1:-1;66647:60:0;;-1:-1:-1;66647:60:0;-1:-1:-1;66725:41:0;;14072:19:1;;66725:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66725:41:0;;-1:-1:-1;;66725:41:0;;;66495:279;-1:-1:-1;;;;;;;66495:279:0:o;59722:460::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;59844:9:::1;59931:13;38414:1;59931:2;:13;:::i;:::-;59915:29;::::0;:15;:29:::1;:::i;:::-;59899:45:::0;-1:-1:-1;59981:13:0::1;38414:1;59981:2;:13;:::i;:::-;59968:26;::::0;:12;:26:::1;:::i;:::-;59955:39;;60030:12;60013:15;:29;;:59;;;;;60060:12;60046;:26;;60013:59;60005:88;;;::::0;-1:-1:-1;;;60005:88:0;;22631:2:1;60005:88:0::1;::::0;::::1;22613:21:1::0;22670:2;22650:18;;;22643:30;-1:-1:-1;;;22689:18:1;;;22682:46;22745:18;;60005:88:0::1;22429:340:1::0;60005:88:0::1;-1:-1:-1::0;60104:12:0::1;:30:::0;;;;60145:9:::1;:24:::0;59722:460::o;56035:225::-;42173:11;;;;;-1:-1:-1;;;;;42173:11:0;41579:10;42167:17;41563:50;;;;-1:-1:-1;;;41563:50:0;;23336:2:1;41563:50:0;;;23318:21:1;23375:2;23355:18;;;23348:30;-1:-1:-1;;;23394:18:1;;;23387:48;23452:18;;41563:50:0;23134:342:1;41563:50:0;56131:3:::1;56110:18;;:24;;;;:::i;:::-;56089:18;:45:::0;56180:11:::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;56180:11:0::1;56170:22;::::0;;;:9:::1;:22;::::0;;;;;:28:::1;::::0;56195:3;;56170:28:::1;:::i;63370:340::-:0;63513:10;63457:4;63501:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;63501:32:0;;;;;;;;;;63552:35;;;;63544:60;;;;-1:-1:-1;;;63544:60:0;;24431:2:1;63544:60:0;;;24413:21:1;24470:2;24450:18;;;24443:30;-1:-1:-1;;;24489:18:1;;;24482:42;24541:18;;63544:60:0;24229:336:1;63544:60:0;63615:65;63624:10;63636:7;63645:34;63664:15;63645:16;:34;:::i;63615:65::-;-1:-1:-1;63698:4:0;;63370:340;-1:-1:-1;;;63370:340:0:o;66780:881::-;66884:9;66908;66932:7;66975:3;:10;66989:2;66975:16;66967:53;;;;-1:-1:-1;;;66967:53:0;;22278:2:1;66967:53:0;;;22260:21:1;22317:2;22297:18;;;22290:30;22356:26;22336:18;;;22329:54;22400:18;;66967:53:0;22076:348:1;66967:53:0;-1:-1:-1;;;67421:2:0;67412:12;;67406:19;67491:2;67482:12;;67476:19;67598:2;67589:12;;;67583:19;67406;;67580:1;67575:28;;;;;66780:881::o;57397:107::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;57470:18:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;57470:26:0::1;-1:-1:-1::0;;;;57470:26:0;;::::1;::::0;;;::::1;::::0;;57397:107::o;61944:167::-;62024:4;62041:40;62051:10;62063:9;62074:6;62041:9;:40::i;69744:1107::-;9533:1;10125:7;;:19;;10117:63;;;;-1:-1:-1;;;10117:63:0;;22976:2:1;10117:63:0;;;22958:21:1;23015:2;22995:18;;;22988:30;23054:33;23034:18;;;23027:61;23105:18;;10117:63:0;22774:355:1;10117:63:0;9533:1;10256:7;:18;69929:8;;69926:286:::1;;69970:35;69977:2;69981:6;69988;69995:9;69970:6;:35::i;:::-;69962:65;;;::::0;-1:-1:-1;;;69962:65:0;;19750:2:1;69962:65:0::1;::::0;::::1;19732:21:1::0;19789:2;19769:18;;;19762:30;-1:-1:-1;;;19808:18:1;;;19801:47;19865:18;;69962:65:0::1;19548:341:1::0;69962:65:0::1;70051:20;::::0;;;:12:::1;:20;::::0;;;;;::::1;;70050:21;70042:47;;;::::0;-1:-1:-1;;;70042:47:0;;18029:2:1;70042:47:0::1;::::0;::::1;18011:21:1::0;18068:2;18048:18;;;18041:30;-1:-1:-1;;;18087:18:1;;;18080:43;18140:18;;70042:47:0::1;17827:337:1::0;70042:47:0::1;70104:20;::::0;;;:12:::1;:20;::::0;;;;:27;;-1:-1:-1;;70104:27:0::1;70127:4;70104:27;::::0;;69926:286:::1;70227:9;70222:486;70238:19:::0;;::::1;70222:486;;;70305:43;70336:8;;70345:1;70336:11;;;;;;;:::i;:::-;70315:10;70305:21;::::0;;;:9:::1;70336:11;70305:21:::0;;;;;;;;70336:11;::::1;;;::::0;-1:-1:-1;70305:30:0::1;:43::i;:::-;70279:133;;;::::0;-1:-1:-1;;;70279:133:0;;20804:2:1;70279:133:0::1;::::0;::::1;20786:21:1::0;20843:2;20823:18;;;20816:30;20882;20862:18;;;20855:58;20930:18;;70279:133:0::1;20602:352:1::0;70279:133:0::1;70456:1;70427:13;:26;70441:8;;70450:1;70441:11;;;;;;;:::i;:::-;;;;;;;70427:26;;;;;;;;;;;:30;;;;70472:41;70501:8;;70510:1;70501:11;;;;;;;:::i;:::-;70482:10;70472:21;::::0;;;:9:::1;70501:11;70472:21:::0;;;;;;;;70501:11;::::1;;;::::0;-1:-1:-1;70472:28:0::1;:41::i;:::-;-1:-1:-1::0;70536:15:0::1;::::0;-1:-1:-1;;;;;70536:15:0::1;70528:41;70596:4;70620:10;70649:8:::0;;70658:1;70649:11;;::::1;;;;;:::i;:::-;70528:168;::::0;-1:-1:-1;;;;;;70528:168:0::1;::::0;;;;;;-1:-1:-1;;;;;11682:15:1;;;70528:168:0::1;::::0;::::1;11664:34:1::0;11734:15;;;;11714:18;;;11707:43;-1:-1:-1;70649:11:0::1;::::0;;::::1;;;11766:18:1::0;;;11759:34;11829:3;11809:18;;;11802:31;-1:-1:-1;11849:19:1;;;11842:30;11889:19;;70528:168:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;70259:3;;;;;:::i;:::-;;;;70222:486;;;-1:-1:-1::0;70721:8:0;;70718:70:::1;;70750:27;70760:2:::0;70764:12:::1;:6:::0;70771:5:::1;70764:12;:::i;:::-;70750:9;:27::i;:::-;-1:-1:-1::0;;9489:1:0;10431:22;;-1:-1:-1;;;;69744:1107:0:o;58613:536::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;58754:14:::1;58769:31;58784:16:::0;58769:14;:31:::1;:::i;:::-;58754:46;;58819:8;:13;;58829:3;58819:13;58811:61;;;::::0;-1:-1:-1;;;58811:61:0;;23683:2:1;58811:61:0::1;::::0;::::1;23665:21:1::0;23722:2;23702:18;;;23695:30;23761:34;23741:18;;;23734:62;-1:-1:-1;;;23812:18:1;;;23805:33;23855:19;;58811:61:0::1;23481:399:1::0;58811:61:0::1;40430:2;58891:14;::::0;::::1;;::::0;::::1;::::0;:31:::1;;-1:-1:-1::0;40430:2:0::1;58907:15;::::0;::::1;;;58891:31;:52;;;;-1:-1:-1::0;40430:2:0::1;58924:19;::::0;::::1;;;58891:52;58883:89;;;::::0;-1:-1:-1;;;58883:89:0;;21161:2:1;58883:89:0::1;::::0;::::1;21143:21:1::0;21200:2;21180:18;;;21173:30;21239:27;21219:18;;;21212:55;21284:18;;58883:89:0::1;20959:349:1::0;58883:89:0::1;-1:-1:-1::0;58983:13:0::1;:28:::0;;::::1;59117:24:::0;;::::1;::::0;::::1;-1:-1:-1::0;;59090:16:0;;::::1;58983:28;59090:16;-1:-1:-1::0;;59022:32:0;;::::1;::::0;::::1;-1:-1:-1::0;;58983:28:0;;::::1;::::0;::::1;59022:32:::0;;;;-1:-1:-1;;59022:32:0;;;;;;;;;;::::1;59090:16:::0;;;;59065:14;;;::::1;59090:16:::0;;;;;;;::::1;59117:24:::0;;;::::1;;::::0;;58613:536::o;64714:729::-;64828:12;;;;64820:39;;;;-1:-1:-1;;;64820:39:0;;18715:2:1;64820:39:0;;;18697:21:1;18754:2;18734:18;;;18727:30;-1:-1:-1;;;18773:18:1;;;18766:44;18827:18;;64820:39:0;18513:338:1;64820:39:0;64872:13;;;;;;;64869:117;;;64918:35;64925:2;64929:6;64936;64943:9;64918:6;:35::i;:::-;64910:65;;;;-1:-1:-1;;;64910:65:0;;19750:2:1;64910:65:0;;;19732:21:1;19789:2;19769:18;;;19762:30;-1:-1:-1;;;19808:18:1;;;19801:47;19865:18;;64910:65:0;19548:341:1;64910:65:0;64999:19;;;;;;;64996:162;;;65108:14;;-1:-1:-1;;;;;65070:35:0;;;;;;:31;:35;;;;;;:52;;65108:14;65070:52;:::i;:::-;65052:15;:70;65044:102;;;;-1:-1:-1;;;65044:102:0;;15881:2:1;65044:102:0;;;15863:21:1;15920:2;15900:18;;;15893:30;-1:-1:-1;;;15939:18:1;;;15932:49;15998:18;;65044:102:0;15679:343:1;65044:102:0;65171:16;;;;;;;65168:214;;;65222:20;;;;:12;:20;;;;;;;;65221:21;65213:47;;;;-1:-1:-1;;;65213:47:0;;18029:2:1;65213:47:0;;;18011:21:1;18068:2;18048:18;;;18041:30;-1:-1:-1;;;18087:18:1;;;18080:43;18140:18;;65213:47:0;17827:337:1;65213:47:0;65275:20;;;;:12;:20;;;;;;;;:27;;-1:-1:-1;;65275:27:0;65298:4;65275:27;;;-1:-1:-1;;;;;65317:35:0;;;;:31;:35;;;;;65355:15;65317:53;;65168:214;65392:43;65409:7;19026;19053:6;-1:-1:-1;;;;;19053:6:0;;18988:79;65409:7;65418:2;65422:12;:6;65429:5;65422:12;:::i;:::-;65392:16;:43::i;65450:203::-;65606:38;;-1:-1:-1;;10397:2:1;10393:15;;;10389:53;65606:38:0;;;10377:66:1;10459:12;;;10452:28;;;10496:12;;;10489:28;;;65569:7:0;;10533:12:1;;65606:38:0;;;;;;;;;;;;65596:49;;;;;;65589:56;;65450:203;;;;;:::o;57006:79::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;57057:12:::1;:20:::0;;-1:-1:-1;;;;57057:20:0::1;::::0;;57006:79::o;59510:111::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;59588:25:::1;:9;59605:7:::0;59588:16:::1;:25::i;63856:149::-:0;63966:31;;63928:12;10393:15:1;;;-1:-1:-1;;10389:53:1;63966:31:0;;;10377:66:1;10459:12;;;10452:28;;;10496:12;;;10489:28;;;63928:12:0;10533::1;;63966:31:0;;;;;;;;;;;;63959:38;;63856:149;;;;;:::o;68523:383::-;-1:-1:-1;;;;;68681:18:0;;68638:40;68681:18;;;:9;:18;;;;;68606:16;;68751:19;68681:18;68751:17;:19::i;:::-;68736:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68736:35:0;;68708:63;;68785:9;68780:95;68798:19;:10;:17;:19::i;:::-;68796:1;:21;68780:95;;;68849:16;:10;68863:1;68849:13;:16::i;:::-;68835:8;68844:1;68835:11;;;;;;;;:::i;:::-;;;;;;;;;;:30;68819:3;;;;:::i;:::-;;;;68780:95;;;-1:-1:-1;68890:8:0;68523:383;-1:-1:-1;;;68523:383:0:o;64011:147::-;64085:7;64127:22;64135:2;64139:3;64143:5;64127:7;:22::i;:::-;64117:33;;;;;;64110:40;;64011:147;;;;;:::o;19918:236::-;19209:10;19198:7;19026;19053:6;-1:-1:-1;;;;;19053:6:0;;18988:79;19198:7;-1:-1:-1;;;;;19198:21:0;;19190:66;;;;-1:-1:-1;;;19190:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19999:22:0;::::1;19991:73;;;::::0;-1:-1:-1;;;19991:73:0;;16582:2:1;19991:73:0::1;::::0;::::1;16564:21:1::0;16621:2;16601:18;;;16594:30;16660:34;16640:18;;;16633:62;-1:-1:-1;;;16711:18:1;;;16704:36;16757:19;;19991:73:0::1;16380:402:1::0;19991:73:0::1;20101:6;::::0;;20080:38:::1;::::0;-1:-1:-1;;;;;20080:38:0;;::::1;::::0;20101:6;::::1;::::0;20080:38:::1;::::0;::::1;20129:6;:17:::0;;-1:-1:-1;;;;;;20129:17:0::1;-1:-1:-1::0;;;;;20129:17:0;;;::::1;::::0;;;::::1;::::0;;19918:236::o;57292:99::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;57361:14:::1;:22:::0;;;::::1;;-1:-1:-1::0;;;57361:22:0::1;-1:-1:-1::0;;;;57361:22:0;;::::1;::::0;;;::::1;::::0;;57292:99::o;65662:433::-;66006:66;;10798::1;66006::0;;;10786:79:1;10881:12;;;10874:28;;;65765:7:0;;10918:12:1;;66006:66:0;;;;;;;;;;;;65978:109;;;;;;65958:129;;65662:433;;;:::o;58083:246::-;41464:19;41472:10;41464:7;:19::i;:::-;41456:50;;;;-1:-1:-1;;;41456:50:0;;;;;;;:::i;:::-;58162:18:::1;::::0;;58147:14:::1;58191:20:::0;;;;58236:43:::1;::::0;58162:18;;58147:14;39500:42:::1;::::0;58162:18;;58236:43:::1;10941:205:1::0;34583:152:0;34653:4;34677:50;34682:3;-1:-1:-1;;;;;34702:23:0;;34677:4;:50::i;:::-;34670:57;34583:152;-1:-1:-1;;;34583:152:0:o;62437:297::-;-1:-1:-1;;;;;62530:19:0;;62522:49;;;;-1:-1:-1;;;62522:49:0;;16989:2:1;62522:49:0;;;16971:21:1;17028:2;17008:18;;;17001:30;-1:-1:-1;;;17047:18:1;;;17040:47;17104:18;;62522:49:0;16787:341:1;62522:49:0;-1:-1:-1;;;;;62590:21:0;;62582:49;;;;-1:-1:-1;;;62582:49:0;;19058:2:1;62582:49:0;;;19040:21:1;19097:2;19077:18;;;19070:30;-1:-1:-1;;;19116:18:1;;;19109:45;19171:18;;62582:49:0;18856:339:1;62582:49:0;-1:-1:-1;;;;;62642:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;62694:32;;13506:25:1;;;62694:32:0;;13479:18:1;62694:32:0;;;;;;;;62437:297;;;:::o;44709:1841::-;-1:-1:-1;;;;;44805:20:0;;44797:51;;;;-1:-1:-1;;;44797:51:0;;15534:2:1;44797:51:0;;;15516:21:1;15573:2;15553:18;;;15546:30;-1:-1:-1;;;15592:18:1;;;15585:48;15650:18;;44797:51:0;15332:342:1;44797:51:0;-1:-1:-1;;;;;44867:23:0;;44859:52;;;;-1:-1:-1;;;44859:52:0;;17335:2:1;44859:52:0;;;17317:21:1;17374:2;17354:18;;;17347:30;-1:-1:-1;;;17393:18:1;;;17386:46;17449:18;;44859:52:0;17133:340:1;44859:52:0;44994:15;45013:26;:9;45032:6;45013:18;:26::i;:::-;:59;;;-1:-1:-1;45043:29:0;:9;45062;45043:18;:29::i;:::-;44994:79;-1:-1:-1;45162:23:0;-1:-1:-1;;;;;45187:21:0;;45203:4;45187:21;;:49;;-1:-1:-1;;;;;;45212:24:0;;45231:4;45212:24;45187:49;45359:14;;45424:19;;45162:75;;-1:-1:-1;;;;;;45359:14:0;;;;45329:21;;45414:29;;;-1:-1:-1;;;45424:19:0;;;;45414:29;:59;;;;;45460:13;-1:-1:-1;;;;;45447:26:0;:9;-1:-1:-1;;;;;45447:26:0;;45414:59;45413:136;;;-1:-1:-1;45502:19:0;;-1:-1:-1;;;;;45489:32:0;;;-1:-1:-1;;;45502:19:0;;;;45489:32;:59;;;;;45535:13;-1:-1:-1;;;;;45525:23:0;:6;-1:-1:-1;;;;;45525:23:0;;45489:59;45669:19;;45385:165;;-1:-1:-1;45650:10:0;;-1:-1:-1;;;;;45661:27:0;;;-1:-1:-1;;;45669:19:0;;;;45661:27;;:53;;;45701:13;-1:-1:-1;;;;;45691:23:0;:6;-1:-1:-1;;;;;45691:23:0;;45661:53;45748:19;;45650:64;;-1:-1:-1;45725:11:0;;-1:-1:-1;;;;;45737:30:0;;;-1:-1:-1;;;45748:19:0;;;;45737:30;;:59;;;45783:13;-1:-1:-1;;;;;45770:26:0;:9;-1:-1:-1;;;;;45770:26:0;;45737:59;45725:71;;45835:18;:41;;;;45857:19;45835:41;:55;;;;45880:10;45835:55;45832:711;;;45906:43;45923:6;45931:9;45942:6;45906:16;:43::i;:::-;45832:711;;;45989:14;;;;;;;45981:46;;;;-1:-1:-1;;;45981:46:0;;19402:2:1;45981:46:0;;;19384:21:1;19441:2;19421:18;;;19414:30;-1:-1:-1;;;19460:18:1;;;19453:49;19519:18;;45981:46:0;19200:343:1;45981:46:0;46129:8;;-1:-1:-1;;;46129:8:0;;;;46126:321;;;46172:10;46162:21;;;;:9;:21;;;;;;;;46158:274;;;46218:10;46208:21;;;;:9;:21;;;;;46232:15;46208:39;;;;46321:12;;46297:36;;;:::i;:::-;46278:15;:56;46270:65;;;;;;46158:274;;;46394:10;46384:21;;;;:9;:21;;;;;:28;;-1:-1:-1;;46384:28:0;46408:4;46384:28;;;46158:274;46461:52;46476:6;46483:9;46493:6;46500:5;46506:6;46461:14;:52::i;:::-;44786:1764;;;;;;44709:1841;;;:::o;41851:233::-;41924:12;;41904:4;;-1:-1:-1;;;41924:12:0;;;;41920:57;;-1:-1:-1;41960:5:0;;41851:233;-1:-1:-1;41851:233:0:o;41920:57::-;19026:7;19053:6;-1:-1:-1;;;;;41994:13:0;;;19053:6;;41994:13;;:36;;-1:-1:-1;;;;;;42009:21:0;;39409:42;42009:21;41994:36;:57;;;-1:-1:-1;;;;;;42032:19:0;;39587:42;42032:19;41994:57;:82;;;-1:-1:-1;;;;;;42053:23:0;;39500:42;42053:23;41987:89;41851:233;-1:-1:-1;;41851:233:0:o;52810:1812::-;52560:27;:34;;-1:-1:-1;;52560:34:0;52590:4;52560:34;;;52928:4:::1;52560:27:::0;52910:24;;;:9:::1;:24;::::0;;;;;52975:15:::1;::::0;52910:24;;52560:27;52961:29:::1;::::0;52975:15;;::::1;52560:34:::0;52975:15;;::::1;::::0;52961:13;;::::1;;:29;:::i;:::-;52945:45;;;;53001:19;53021:9;;53001:29;;53058:8;53044:11;:22;53041:127;;;53086:12;::::0;::::1;;53083:74;;;-1:-1:-1::0;53133:8:0;53083:74:::1;53294:11;53278:15;:27;:40;;;-1:-1:-1::0;53307:11:0::1;::::0;::::1;::::0;53278:40:::1;53275:77;;;53334:7;;;;;53275:77;53472:13;::::0;53433:25:::1;::::0;53459:36:::1;::::0;::::1;::::0;53460:25:::1;::::0;53472:13;;::::1;;;53460:11:::0;:25:::1;:::i;:::-;53459:36;;;;:::i;:::-;53433:62:::0;-1:-1:-1;53506:17:0::1;53526:31;53433:62:::0;53526:11;:31:::1;:::i;:::-;53506:51:::0;-1:-1:-1;53616:16:0::1;53633:19;53651:1;53633:17:::0;:19:::1;:::i;:::-;53616:36:::0;-1:-1:-1;53663:19:0::1;53683:26;53616:36:::0;53683:17;:26:::1;:::i;:::-;53663:46:::0;-1:-1:-1;53786:17:0::1;53804:21;53816:9:::0;53663:46;53804:21:::1;:::i;:::-;53786:39:::0;-1:-1:-1;53939:21:0::1;53971:27;53786:39:::0;53971:16:::1;:27::i;:::-;54009:14;54025:41;54049:17:::0;54025:21:::1;:41;:::i;:::-;54170:17;::::0;54009:58;;-1:-1:-1;54170:17:0::1;;54167:151;;;54213:14;54251:9:::0;54231:18:::1;54238:11:::0;54231:6;:18:::1;:::i;:::-;54230:30;;;;:::i;:::-;54213:47;;54275:31;54289:8;54299:6;54275:13;:31::i;:::-;54198:120;54167:151;54440:20;54462:41;54486:17:::0;54462:21:::1;:41;:::i;:::-;54440:64;;54582:32;54601:12;54582:18;:32::i;:::-;52875:1747;;;;;;;;;;;52605:1;-1:-1:-1::0;52617:27:0;:35;;-1:-1:-1;;52617:35:0;;;52810:1812::o;36261:131::-;36328:4;36352:32;36357:3;36377:5;36352:4;:32::i;36787:146::-;36864:4;31988:19;;;:12;;;:19;;;;;;:24;;36888:37;31891:129;36566:137;36636:4;36660:35;36668:3;36688:5;36660:7;:35::i;56266:227::-;56376:3;56355:18;;:24;;;;:::i;:::-;56334:18;:45;-1:-1:-1;;;;;56411:18:0;;;;;;:9;:18;;;;;;:24;;56432:3;;56411:24;:::i;:::-;-1:-1:-1;;;;;56390:18:0;;;;;;:9;:18;;;;;;:45;;;;56451:34;;56390:18;;;-1:-1:-1;;;;;;;;;;;56451:34:0;;;56481:3;13506:25:1;;13494:2;13479:18;;13360:177;56451:34:0;;;;;;;;56266:227;;:::o;49149:428::-;-1:-1:-1;;;;;49268:17:0;;49244:21;49268:17;;;:9;:17;;;;;;49304:23;;;;49296:60;;;;-1:-1:-1;;;49296:60:0;;16229:2:1;49296:60:0;;;16211:21:1;16268:2;16248:18;;;16241:30;-1:-1:-1;;;16287:18:1;;;16280:54;16351:18;;49296:60:0;16027:348:1;49296:60:0;49412:27;49425:6;49432;49412:12;:27::i;:::-;49492:28;49502:9;49513:6;49492:9;:28::i;:::-;49552:9;-1:-1:-1;;;;;49536:33:0;49545:6;-1:-1:-1;;;;;49536:33:0;-1:-1:-1;;;;;;;;;;;49562:6:0;49536:33;;;;13506:25:1;;13494:2;13479:18;;13360:177;49536:33:0;;;;;;;;49233:344;49149:428;;;:::o;34909:158::-;34982:4;35006:53;35014:3;-1:-1:-1;;;;;35034:23:0;;35006:7;:53::i;37017:114::-;37077:7;37104:19;37112:3;32187:18;;32104:109;37473:137;37544:7;37579:22;37583:3;37595:5;37579:3;:22::i;29682:414::-;29745:4;31988:19;;;:12;;;:19;;;;;;29762:327;;-1:-1:-1;29805:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;29988:18;;29966:19;;;:12;;;:19;;;;;;:40;;;;30021:11;;29762:327;-1:-1:-1;30072:5:0;30065:12;;35151:167;-1:-1:-1;;;;;35285:23:0;;35231:4;31988:19;;;:12;;;:19;;;;;;:24;;35255:55;31891:129;46651:2438;-1:-1:-1;;;;;46794:20:0;;;46767:24;46794:20;;;:9;:20;;;;;;;46849:17;;;;;;;;46885:23;;;;46877:60;;;;-1:-1:-1;;;46877:60:0;;16229:2:1;46877:60:0;;;16211:21:1;16268:2;16248:18;;;16241:30;-1:-1:-1;;;16287:18:1;;;16280:54;16351:18;;46877:60:0;16027:348:1;46877:60:0;46970:1;46960:9;;:11;;;;:::i;:::-;46948:9;:23;46982:9;47002:1006;;;;47031:15;;-1:-1:-1;;;47031:15:0;;;;47027:100;;;47083:9;;47075:6;:17;;47067:44;;;;-1:-1:-1;;;47067:44:0;;18371:2:1;47067:44:0;;;18353:21:1;18410:2;18390:18;;;18383:30;-1:-1:-1;;;18429:18:1;;;18422:45;18484:18;;47067:44:0;18169:339:1;47067:44:0;-1:-1:-1;47145:8:0;;;;;;;47002:1006;;;47174:5;47171:837;;;47290:18;;-1:-1:-1;;;47290:18:0;;;;47286:128;;;47363:12;;:14;;47376:1;47363:14;:::i;:::-;47337:23;47354:6;47337:16;:23;:::i;:::-;:41;;47329:69;;;;-1:-1:-1;;;47329:69:0;;;;;;;:::i;:::-;47432:14;;-1:-1:-1;;;47432:14:0;;;;47428:100;;;47483:8;;47475:6;:16;;47467:45;;;;-1:-1:-1;;;47467:45:0;;;;;;;:::i;:::-;-1:-1:-1;47546:7:0;;;;47171:837;;;47720:12;;47695:23;47712:6;47695:16;:23;:::i;:::-;:37;;47687:65;;;;-1:-1:-1;;;47687:65:0;;;;;;;:::i;:::-;-1:-1:-1;47984:12:0;;;;;;;47171:837;48343:19;;-1:-1:-1;;;;;48335:27:0;;;-1:-1:-1;;;48343:19:0;;;;48335:27;;;;48334:50;;-1:-1:-1;48367:16:0;;;;48366:17;48334:50;:82;;;;-1:-1:-1;48388:27:0;;;;48387:28;48334:82;48331:126;;;48431:26;48450:6;48431:18;:26::i;:::-;48630:13;;48565:21;;48587:57;;48601:6;;48609:3;;48614:29;;48630:13;;;;;;;48614:15;;;;:29;:::i;:::-;48587:13;:57::i;:::-;48565:79;-1:-1:-1;48708:19:0;48728:22;48565:79;48728:6;:22;:::i;:::-;48708:42;;48806:27;48819:6;48826;48806:12;:27::i;:::-;48918:4;48900:24;;;;:9;:24;;;;;:41;;48928:13;;48900:24;:41;;48928:13;;48900:41;:::i;:::-;;;;-1:-1:-1;48994:33:0;;-1:-1:-1;49004:9:0;49015:11;48994:9;:33::i;:::-;49059:9;-1:-1:-1;;;;;49043:38:0;49052:6;-1:-1:-1;;;;;49043:38:0;-1:-1:-1;;;;;;;;;;;49069:11:0;49043:38;;;;13506:25:1;;13494:2;13479:18;;13360:177;49043:38:0;;;;;;;;46756:2333;;;;;46651:2438;;;;;:::o;54672:453::-;54765:14;;54733:56;;54750:4;;-1:-1:-1;;;;;54765:14:0;54782:6;54733:8;:56::i;:::-;54824:16;;;54838:1;54824:16;;;;;;;;54800:21;;54824:16;;;;;;;;;;-1:-1:-1;54824:16:0;54800:40;;54869:4;54851;54856:1;54851:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54851:23:0;;;:7;;;;;;;;;;:23;;;;54895:14;;:21;;;-1:-1:-1;;;54895:21:0;;;;:14;;;;;:19;;:21;;;;;54851:7;;54895:21;;;;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54885:4;54890:1;54885:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54885:31:0;;;:7;;;;;;;;;:31;54927:14;;:190;;-1:-1:-1;;;54927:190:0;;:14;;;:65;;:190;;55007:6;;54927:14;;55044:4;;55071;;55091:15;;54927:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54722:403;54672:453;:::o;55198:397::-;55292:9;55280:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;55344:14:0;;55312:61;;55329:4;;-1:-1:-1;;;;;55344:14:0;55361:11;55312:8;:61::i;:::-;55384:14;;:203;;-1:-1:-1;;;55384:203:0;;55455:4;55384:203;;;12260:34:1;;;12310:18;;;12303:34;;;55384:14:0;12353:18:1;;;12346:34;;;12396:18;;;12389:34;12439:19;;;12432:44;55561:15:0;12492:19:1;;;12485:35;-1:-1:-1;;;;;55384:14:0;;;;:30;;55422:9;;12194:19:1;;55384:203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;55198:397;;:::o;51031:780::-;51168:15;;51130:22;;51187:3;;51156:27;;51168:15;;51156:9;:27;:::i;:::-;51155:35;;;;:::i;:::-;51237:13;;51130:60;;-1:-1:-1;51201:20:0;;51254:3;;51225:25;;51237:13;;;;;51225:9;:25;:::i;:::-;51224:33;;;;:::i;:::-;51308:17;;51201:56;;-1:-1:-1;51268:24:0;;51329:3;;51296:29;;51308:17;;;;;51296:9;:29;:::i;:::-;51295:37;;;;:::i;:::-;51268:64;-1:-1:-1;51460:21:0;51268:64;51412:27;51427:12;51412:14;:27;:::i;:::-;:44;;;;:::i;:::-;51411:70;51407:236;;;51498:16;51566:21;51546:16;51518:27;51533:12;51518:14;:27;:::i;:::-;:44;;;;:::i;:::-;51517:70;;;;:::i;:::-;51498:89;-1:-1:-1;51602:28:0;51498:89;51602:28;;:::i;:::-;;;51483:160;51407:236;51701:14;51683:16;;:32;;;;;;;:::i;:::-;;;;;;;;51742:12;51726:14;;:28;;;;;;;:::i;:::-;;;;;;;;51787:16;51765:18;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;51031:780:0:o;30270:1537::-;30336:4;30475:19;;;:12;;;:19;;;;;;30509:15;;30505:1295;;30869:21;30893:14;30906:1;30893:10;:14;:::i;:::-;30942:18;;30869:38;;-1:-1:-1;30922:17:0;;30942:22;;30963:1;;30942:22;:::i;:::-;30922:42;;31205:17;31225:3;:11;;31237:9;31225:22;;;;;;;;:::i;:::-;;;;;;;;;31205:42;;31369:9;31340:3;:11;;31352:13;31340:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;31446:23;;;:12;;;:23;;;;;;:36;;;31605:17;;31446:3;;31605:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;31698:3;:12;;:19;31711:5;31698:19;;;;;;;;;;;31691:26;;;31739:4;31732:11;;;;;;;;30505:1295;31783:5;31776:12;;;;;49868:300;-1:-1:-1;;;;;50003:15:0;;49985:17;50003:15;;;:9;:15;;;;;;:22;;50019:6;;50003:22;:::i;:::-;50054:4;50036:24;;;;:9;:24;;;;;:34;;49985:40;;-1:-1:-1;50064:6:0;;50036:24;;;:34;;50064:6;;50036:34;:::i;:::-;;;;-1:-1:-1;;;;;;;50081:15:0;;;;;;:9;:15;;;;;;;:25;;;50122:37;50145:4;;50081:15;-1:-1:-1;;;;;;;;;;;50122:37:0;;;50152:6;13506:25:1;;13494:2;13479:18;;13360:177;51817:198:0;-1:-1:-1;;;;;51949:15:0;;51931:17;51949:15;;;:9;:15;;;;;;:22;;51965:6;;51949:22;:::i;:::-;-1:-1:-1;;;;;51982:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;;51817:198:0:o;32555:204::-;32650:18;;32622:7;;32650:26;-1:-1:-1;32642:73:0;;;;-1:-1:-1;;;32642:73:0;;15131:2:1;32642:73:0;;;15113:21:1;15170:2;15150:18;;;15143:30;15209:34;15189:18;;;15182:62;-1:-1:-1;;;15260:18:1;;;15253:32;15302:19;;32642:73:0;14929:398:1;32642:73:0;32733:3;:11;;32745:5;32733:18;;;;;;;;:::i;:::-;;;;;;;;;32726:25;;32555:204;;;;:::o;49632:156::-;49722:7;49775:5;49761:10;49750:21;;49757:3;49750:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;49749:31;;;;:::i;14:367:1:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:1;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:160::-;451:20;;507:13;;500:21;490:32;;480:60;;536:1;533;526:12;480:60;386:160;;;:::o;551:718::-;593:5;646:3;639:4;631:6;627:17;623:27;613:55;;664:1;661;654:12;613:55;700:6;687:20;726:18;763:2;759;756:10;753:36;;;769:18;;:::i;:::-;844:2;838:9;812:2;898:13;;-1:-1:-1;;894:22:1;;;918:2;890:31;886:40;874:53;;;942:18;;;962:22;;;939:46;936:72;;;988:18;;:::i;:::-;1028:10;1024:2;1017:22;1063:2;1055:6;1048:18;1109:3;1102:4;1097:2;1089:6;1085:15;1081:26;1078:35;1075:55;;;1126:1;1123;1116:12;1075:55;1190:2;1183:4;1175:6;1171:17;1164:4;1156:6;1152:17;1139:54;1237:1;1230:4;1225:2;1217:6;1213:15;1209:26;1202:37;1257:6;1248:15;;;;;;551:718;;;;:::o;1274:156::-;1340:20;;1400:4;1389:16;;1379:27;;1369:55;;1420:1;1417;1410:12;1435:247;1494:6;1547:2;1535:9;1526:7;1522:23;1518:32;1515:52;;;1563:1;1560;1553:12;1515:52;1602:9;1589:23;1621:31;1646:5;1621:31;:::i;1687:251::-;1757:6;1810:2;1798:9;1789:7;1785:23;1781:32;1778:52;;;1826:1;1823;1816:12;1778:52;1858:9;1852:16;1877:31;1902:5;1877:31;:::i;1943:323::-;2016:6;2024;2077:2;2065:9;2056:7;2052:23;2048:32;2045:52;;;2093:1;2090;2083:12;2045:52;2132:9;2119:23;2151:31;2176:5;2151:31;:::i;:::-;2201:5;-1:-1:-1;2225:35:1;2256:2;2241:18;;2225:35;:::i;:::-;2215:45;;1943:323;;;;;:::o;2271:388::-;2339:6;2347;2400:2;2388:9;2379:7;2375:23;2371:32;2368:52;;;2416:1;2413;2406:12;2368:52;2455:9;2442:23;2474:31;2499:5;2474:31;:::i;:::-;2524:5;-1:-1:-1;2581:2:1;2566:18;;2553:32;2594:33;2553:32;2594:33;:::i;:::-;2646:7;2636:17;;;2271:388;;;;;:::o;2664:456::-;2741:6;2749;2757;2810:2;2798:9;2789:7;2785:23;2781:32;2778:52;;;2826:1;2823;2816:12;2778:52;2865:9;2852:23;2884:31;2909:5;2884:31;:::i;:::-;2934:5;-1:-1:-1;2991:2:1;2976:18;;2963:32;3004:33;2963:32;3004:33;:::i;:::-;2664:456;;3056:7;;-1:-1:-1;;;3110:2:1;3095:18;;;;3082:32;;2664:456::o;3125:936::-;3222:6;3230;3238;3246;3254;3307:3;3295:9;3286:7;3282:23;3278:33;3275:53;;;3324:1;3321;3314:12;3275:53;3363:9;3350:23;3382:31;3407:5;3382:31;:::i;:::-;3432:5;-1:-1:-1;3489:2:1;3474:18;;3461:32;3502:33;3461:32;3502:33;:::i;:::-;3554:7;-1:-1:-1;3608:2:1;3593:18;;3580:32;;-1:-1:-1;3663:2:1;3648:18;;3635:32;3686:18;3716:14;;;3713:34;;;3743:1;3740;3733:12;3713:34;3781:6;3770:9;3766:22;3756:32;;3826:7;3819:4;3815:2;3811:13;3807:27;3797:55;;3848:1;3845;3838:12;3797:55;3888:2;3875:16;3914:2;3906:6;3903:14;3900:34;;;3930:1;3927;3920:12;3900:34;3975:7;3970:2;3961:6;3957:2;3953:15;3949:24;3946:37;3943:57;;;3996:1;3993;3986:12;3943:57;3125:936;;;;-1:-1:-1;3125:936:1;;-1:-1:-1;4027:2:1;4019:11;;4049:6;3125:936;-1:-1:-1;;;3125:936:1:o;4066:315::-;4134:6;4142;4195:2;4183:9;4174:7;4170:23;4166:32;4163:52;;;4211:1;4208;4201:12;4163:52;4250:9;4237:23;4269:31;4294:5;4269:31;:::i;:::-;4319:5;4371:2;4356:18;;;;4343:32;;-1:-1:-1;;;4066:315:1:o;4386:590::-;4478:6;4486;4494;4502;4510;4518;4571:3;4559:9;4550:7;4546:23;4542:33;4539:53;;;4588:1;4585;4578:12;4539:53;4627:9;4614:23;4646:31;4671:5;4646:31;:::i;:::-;4696:5;-1:-1:-1;4748:2:1;4733:18;;4720:32;;-1:-1:-1;4771:35:1;4802:2;4787:18;;4771:35;:::i;:::-;4761:45;;4825:35;4856:2;4845:9;4841:18;4825:35;:::i;:::-;4815:45;;4879:36;4910:3;4899:9;4895:19;4879:36;:::i;:::-;4869:46;;4934:36;4965:3;4954:9;4950:19;4934:36;:::i;:::-;4924:46;;4386:590;;;;;;;;:::o;4981:383::-;5058:6;5066;5074;5127:2;5115:9;5106:7;5102:23;5098:32;5095:52;;;5143:1;5140;5133:12;5095:52;5182:9;5169:23;5201:31;5226:5;5201:31;:::i;:::-;5251:5;5303:2;5288:18;;5275:32;;-1:-1:-1;5354:2:1;5339:18;;;5326:32;;4981:383;-1:-1:-1;;;4981:383:1:o;5369:592::-;5464:6;5472;5480;5488;5541:3;5529:9;5520:7;5516:23;5512:33;5509:53;;;5558:1;5555;5548:12;5509:53;5597:9;5584:23;5616:31;5641:5;5616:31;:::i;:::-;5666:5;-1:-1:-1;5718:2:1;5703:18;;5690:32;;-1:-1:-1;5769:2:1;5754:18;;5741:32;;-1:-1:-1;5824:2:1;5809:18;;5796:32;5851:18;5840:30;;5837:50;;;5883:1;5880;5873:12;5837:50;5906:49;5947:7;5938:6;5927:9;5923:22;5906:49;:::i;:::-;5896:59;;;5369:592;;;;;;;:::o;5966:929::-;6097:6;6105;6113;6121;6129;6137;6190:3;6178:9;6169:7;6165:23;6161:33;6158:53;;;6207:1;6204;6197:12;6158:53;6246:9;6233:23;6265:31;6290:5;6265:31;:::i;:::-;6315:5;-1:-1:-1;6367:2:1;6352:18;;6339:32;;-1:-1:-1;6418:2:1;6403:18;;6390:32;;-1:-1:-1;6473:2:1;6458:18;;6445:32;6496:18;6526:14;;;6523:34;;;6553:1;6550;6543:12;6523:34;6576:49;6617:7;6608:6;6597:9;6593:22;6576:49;:::i;:::-;6566:59;;6678:3;6667:9;6663:19;6650:33;6634:49;;6708:2;6698:8;6695:16;6692:36;;;6724:1;6721;6714:12;6692:36;;6763:72;6827:7;6816:8;6805:9;6801:24;6763:72;:::i;:::-;5966:929;;;;-1:-1:-1;5966:929:1;;-1:-1:-1;5966:929:1;;6854:8;;5966:929;-1:-1:-1;;;5966:929:1:o;6900:505::-;6995:6;7003;7011;7064:2;7052:9;7043:7;7039:23;7035:32;7032:52;;;7080:1;7077;7070:12;7032:52;7120:9;7107:23;7153:18;7145:6;7142:30;7139:50;;;7185:1;7182;7175:12;7139:50;7224:70;7286:7;7277:6;7266:9;7262:22;7224:70;:::i;:::-;7313:8;;7198:96;;-1:-1:-1;7395:2:1;7380:18;;;;7367:32;;6900:505;-1:-1:-1;;;;6900:505:1:o;7410:180::-;7466:6;7519:2;7507:9;7498:7;7494:23;7490:32;7487:52;;;7535:1;7532;7525:12;7487:52;7558:26;7574:9;7558:26;:::i;7595:180::-;7654:6;7707:2;7695:9;7686:7;7682:23;7678:32;7675:52;;;7723:1;7720;7713:12;7675:52;-1:-1:-1;7746:23:1;;7595:180;-1:-1:-1;7595:180:1:o;7780:388::-;7857:6;7865;7918:2;7906:9;7897:7;7893:23;7889:32;7886:52;;;7934:1;7931;7924:12;7886:52;7970:9;7957:23;7947:33;;8031:2;8020:9;8016:18;8003:32;8058:18;8050:6;8047:30;8044:50;;;8090:1;8087;8080:12;8044:50;8113:49;8154:7;8145:6;8134:9;8130:22;8113:49;:::i;:::-;8103:59;;;7780:388;;;;;:::o;8173:320::-;8241:6;8294:2;8282:9;8273:7;8269:23;8265:32;8262:52;;;8310:1;8307;8300:12;8262:52;8350:9;8337:23;8383:18;8375:6;8372:30;8369:50;;;8415:1;8412;8405:12;8369:50;8438:49;8479:7;8470:6;8459:9;8455:22;8438:49;:::i;8683:248::-;8751:6;8759;8812:2;8800:9;8791:7;8787:23;8783:32;8780:52;;;8828:1;8825;8818:12;8780:52;-1:-1:-1;;8851:23:1;;;8921:2;8906:18;;;8893:32;;-1:-1:-1;8683:248:1:o;8936:306::-;9024:6;9032;9040;9093:2;9081:9;9072:7;9068:23;9064:32;9061:52;;;9109:1;9106;9099:12;9061:52;9138:9;9132:16;9122:26;;9188:2;9177:9;9173:18;9167:25;9157:35;;9232:2;9221:9;9217:18;9211:25;9201:35;;8936:306;;;;;:::o;9247:464::-;9332:6;9340;9348;9356;9364;9417:3;9405:9;9396:7;9392:23;9388:33;9385:53;;;9434:1;9431;9424:12;9385:53;9457:27;9474:9;9457:27;:::i;:::-;9447:37;;9503:36;9535:2;9524:9;9520:18;9503:36;:::i;:::-;9493:46;;9558:36;9590:2;9579:9;9575:18;9558:36;:::i;:::-;9548:46;;9613:36;9645:2;9634:9;9630:18;9613:36;:::i;:::-;9603:46;;9668:37;9700:3;9689:9;9685:19;9668:37;:::i;:::-;9658:47;;9247:464;;;;;;;;:::o;9716:471::-;9757:3;9795:5;9789:12;9822:6;9817:3;9810:19;9847:1;9857:162;9871:6;9868:1;9865:13;9857:162;;;9933:4;9989:13;;;9985:22;;9979:29;9961:11;;;9957:20;;9950:59;9886:12;9857:162;;;10037:6;10034:1;10031:13;10028:87;;;10103:1;10096:4;10087:6;10082:3;10078:16;10074:27;10067:38;10028:87;-1:-1:-1;10169:2:1;10148:15;-1:-1:-1;;10144:29:1;10135:39;;;;10176:4;10131:50;;9716:471;-1:-1:-1;;9716:471:1:o;12531:632::-;12702:2;12754:21;;;12824:13;;12727:18;;;12846:22;;;12673:4;;12702:2;12925:15;;;;12899:2;12884:18;;;12673:4;12968:169;12982:6;12979:1;12976:13;12968:169;;;13043:13;;13031:26;;13112:15;;;;13077:12;;;;13004:1;12997:9;12968:169;;;-1:-1:-1;13154:3:1;;12531:632;-1:-1:-1;;;;;;12531:632:1:o;14483:217::-;14630:2;14619:9;14612:21;14593:4;14650:44;14690:2;14679:9;14675:18;14667:6;14650:44;:::i;19894:356::-;20096:2;20078:21;;;20115:18;;;20108:30;20174:34;20169:2;20154:18;;20147:62;20241:2;20226:18;;19894:356::o;20255:342::-;20457:2;20439:21;;;20496:2;20476:18;;;20469:30;-1:-1:-1;;;20530:2:1;20515:18;;20508:48;20588:2;20573:18;;20255:342::o;21731:340::-;21933:2;21915:21;;;21972:2;21952:18;;;21945:30;-1:-1:-1;;;22006:2:1;21991:18;;21984:46;22062:2;22047:18;;21731:340::o;24945:980::-;25207:4;25255:3;25244:9;25240:19;25286:6;25275:9;25268:25;25312:2;25350:6;25345:2;25334:9;25330:18;25323:34;25393:3;25388:2;25377:9;25373:18;25366:31;25417:6;25452;25446:13;25483:6;25475;25468:22;25521:3;25510:9;25506:19;25499:26;;25560:2;25552:6;25548:15;25534:29;;25581:1;25591:195;25605:6;25602:1;25599:13;25591:195;;;25670:13;;-1:-1:-1;;;;;25666:39:1;25654:52;;25761:15;;;;25726:12;;;;25702:1;25620:9;25591:195;;;-1:-1:-1;;;;;;;25842:32:1;;;;25837:2;25822:18;;25815:60;-1:-1:-1;;;25906:3:1;25891:19;25884:35;25803:3;24945:980;-1:-1:-1;;;24945:980:1:o;26119:128::-;26159:3;26190:1;26186:6;26183:1;26180:13;26177:39;;;26196:18;;:::i;:::-;-1:-1:-1;26232:9:1;;26119:128::o;26252:204::-;26290:3;26326:4;26323:1;26319:12;26358:4;26355:1;26351:12;26393:3;26387:4;26383:14;26378:3;26375:23;26372:49;;;26401:18;;:::i;:::-;26437:13;;26252:204;-1:-1:-1;;;26252:204:1:o;26461:217::-;26501:1;26527;26517:132;;26571:10;26566:3;26562:20;26559:1;26552:31;26606:4;26603:1;26596:15;26634:4;26631:1;26624:15;26517:132;-1:-1:-1;26663:9:1;;26461:217::o;26683:422::-;26772:1;26815:5;26772:1;26829:270;26850:7;26840:8;26837:21;26829:270;;;26909:4;26905:1;26901:6;26897:17;26891:4;26888:27;26885:53;;;26918:18;;:::i;:::-;26968:7;26958:8;26954:22;26951:55;;;26988:16;;;;26951:55;27067:22;;;;27027:15;;;;26829:270;;;26833:3;26683:422;;;;;:::o;27110:140::-;27168:5;27197:47;27238:4;27228:8;27224:19;27218:4;27304:5;27334:8;27324:80;;-1:-1:-1;27375:1:1;27389:5;;27324:80;27423:4;27413:76;;-1:-1:-1;27460:1:1;27474:5;;27413:76;27505:4;27523:1;27518:59;;;;27591:1;27586:130;;;;27498:218;;27518:59;27548:1;27539:10;;27562:5;;;27586:130;27623:3;27613:8;27610:17;27607:43;;;27630:18;;:::i;:::-;-1:-1:-1;;27686:1:1;27672:16;;27701:5;;27498:218;;27800:2;27790:8;27787:16;27781:3;27775:4;27772:13;27768:36;27762:2;27752:8;27749:16;27744:2;27738:4;27735:12;27731:35;27728:77;27725:159;;;-1:-1:-1;27837:19:1;;;27869:5;;27725:159;27916:34;27941:8;27935:4;27916:34;:::i;:::-;27986:6;27982:1;27978:6;27974:19;27965:7;27962:32;27959:58;;;27997:18;;:::i;:::-;28035:20;;27255:806;-1:-1:-1;;;27255:806:1:o;28066:168::-;28106:7;28172:1;28168;28164:6;28160:14;28157:1;28154:21;28149:1;28142:9;28135:17;28131:45;28128:71;;;28179:18;;:::i;:::-;-1:-1:-1;28219:9:1;;28066:168::o;28239:125::-;28279:4;28307:1;28304;28301:8;28298:34;;;28312:18;;:::i;:::-;-1:-1:-1;28349:9:1;;28239:125::o;28369:135::-;28408:3;-1:-1:-1;;28429:17:1;;28426:43;;;28449:18;;:::i;:::-;-1:-1:-1;28496:1:1;28485:13;;28369:135::o;28509:127::-;28570:10;28565:3;28561:20;28558:1;28551:31;28601:4;28598:1;28591:15;28625:4;28622:1;28615:15;28641:127;28702:10;28697:3;28693:20;28690:1;28683:31;28733:4;28730:1;28723:15;28757:4;28754:1;28747:15;28773:127;28834:10;28829:3;28825:20;28822:1;28815:31;28865:4;28862:1;28855:15;28889:4;28886:1;28879:15;28905:127;28966:10;28961:3;28957:20;28954:1;28947:31;28997:4;28994:1;28987:15;29021:4;29018:1;29011:15;29037:131;-1:-1:-1;;;;;29112:31:1;;29102:42;;29092:70;;29158:1;29155;29148:12

Swarm Source

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