ETH Price: $3,528.23 (+5.46%)

Token

Big Cats TYG (BCT)
 

Overview

Max Total Supply

404 BCT

Holders

180

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
konger.eth
Balance
1 BCT
0x044c8F54235E5293dB95aC58Ac6155578B8A695e
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:
BigCatsTYG

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-28
*/

/*__________.__         _________         __           ________________.___. ________ 
  \______   \__| ____   \_   ___ \_____ _/  |_  ______ \__    ___/\__  |   |/  _____/ 
   |    |  _/  |/ ___\  /    \  \/\__  \\   __\/  ___/   |    |    /   |   /   \  ___ 
   |    |   \  / /_/  > \     \____/ __ \|  |  \___ \    |    |    \____   \    \_\  \
   |______  /__\___  /   \______  (____  /__| /____  >   |____|    / ______|\______  /
          \/  /_____/           \/     \/          \/              \/              \/
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@                                                   @@@@@@@
@@@@@@@     .######                           #   ###     @@@@@@@
@@@@@@@    ## @@@@    ###    ##   ##    ##    @@@@@@ ##   @@@@@@@
@@@@@@@    # @@@  ######   ####   ###    #####  @@@@@ #,  @@@@@@@
@@@@@@@     /#  ################################. @& (#   @@@@@@@
@@@@@@@       ####################################        @@@@@@@
@@@@@@@      ######################################       @@@@@@@
@@@@@@@        #####    #############   #########         @@@@@@@
@@@@@@@       ######    #############    ########     @   @@@@@@@
@@@@@@@  @@ #########/ ##############*  ###########  @&   @@@@@@@
@@@@@@@    @&  ########### ,,,, ################  @@@@@@  @@@@@@@
@@@@@@@   @@@@@@@        @@    @@@           @@@@@@@      @@@@@@@
@@@@@@@       @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@        @@@@@@@
@@@@@@@          @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@          @@@@@@@
@@@@@@@               @@@@@@@@@@@@@@@@@@@@@*              @@@@@@@
@@@@@@@                ##               ##                @@@@@@@
@@@@@@@              #######################              @@@@@@@
@@@@@@@            #### ################ #####            @@@@@@@
@@@@@@@          ##### ################## ######          @@@@@@@
@@@@@@@         ##### #################### ######         @@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@ An NFT collection of 10,000 hand-drawn characters @@@@@@@
@@@@@@@@@@@@@@ Living on the Ethereum & Arweave @@@@@@@@@@@@@@@*/

// SPDX-License-Identifier: GPL-3.0

// File: contracts/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].
 */

pragma solidity ^0.8.0;

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 make 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: contracts/Strings.sol


// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
// File: contracts/Context.sol


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

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
// File: contracts/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// File: contracts/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
// File: contracts/IERC165.sol


// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @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: contracts/ERC165.sol


// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}
// File: contracts/IERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @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: contracts/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @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 tokenId);

    /**
     * @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: contracts/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: contracts/ERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}
// File: contracts/BigCatsTYG.sol


pragma solidity ^0.8.7;




contract BigCatsTYG is ERC721Enumerable, ReentrancyGuard, Ownable {
  using Strings for uint256;

  string private __baseURI = "ar://";
  string private _baseExtension = ".json";
  string private _defaultTokenURI = "ar://w4Y4JXoCGNJOBnimdO5OzcZncbnn2ew_LxZPwopeGa4";
  uint256 public Price = 0.088 ether;
  uint256 public MaxSupply = 10000;
  uint256 public MaxMintAmount = 20;
  uint256 private _initAmount = 200;
  bool public Paused = true;
  uint256 public RevealTo = 0;
  bool public Reveal = false;
  address[] private _whitelistedAddresses;
  mapping(address => uint256) private _whitelistMintedBalance;
  uint256 public WhitelistMintLimit = 1;
  uint256 public WhitelistPrice = 0.05 ether;
  bool public WhitelistMintPaused = true;
  mapping(address => uint256) private _claimedBalance;
  address[] private _airdropContracts;
  uint256 public ClaimLimit = 0;
  bool public ClaimPaused = true;

  // Big Cats Never Disappear :)
  constructor(
  ) ERC721("Big Cats TYG", "BCT") {
    mint(_initAmount);
  }

  // internal
  function _baseURI() internal view virtual override returns (string memory) {
    return __baseURI;
  }

  // public
  function mint(uint256 mintAmount) public payable {
    require(mintAmount > 0, "at least 1 nft");

    uint256 supply = totalSupply();
    require(supply + mintAmount <= MaxSupply, "max nft limit exceeded");

    if (msg.sender != owner()) {
      require(!Paused, "sale paused");
      require(mintAmount <= MaxMintAmount, "you can adopt a maximum of 20 nfts");
      require(msg.value >= Price * mintAmount, "insufficient funds");
    }

    for (uint256 i = 1; i <= mintAmount; i++) {
      _safeMint(msg.sender, supply + i);
    }
  }

  function whiteListMint(uint256 mintAmount) public payable nonReentrant {
    require(!WhitelistMintPaused, "whitelist mint paused");

    uint256 supply = totalSupply();
    require(supply + mintAmount <= MaxSupply, "max nft limit exceeded");

    require(isWhitelisted(msg.sender), "whitelist required");
    uint256 ownerMintedCount = _whitelistMintedBalance[msg.sender];
    require(ownerMintedCount + mintAmount <= WhitelistMintLimit, "max NFT per whitelist address exceeded");
    require(msg.value >= WhitelistPrice * mintAmount, "insufficient funds");

    for (uint256 i = 1; i <= mintAmount; i++) {
      _whitelistMintedBalance[msg.sender]++;
      _safeMint(msg.sender, supply + i);
    }
  }

  function isWhitelisted(address user) public view returns (bool) {
    for (uint i = 0; i < _whitelistedAddresses.length; i++) {
      if (_whitelistedAddresses[i] == user) {
          return true;
      }
    }
    return false;
  }

  function claim(uint256 mintAmount) public nonReentrant {
    require(!ClaimPaused, "claim paused");
    uint256 supply = totalSupply();
    require(supply + mintAmount <= MaxSupply, "max nft limit exceeded");

    uint claimLimit = airdropLimit(msg.sender);
    require(claimLimit > 0, "not qualified");

    if (ClaimLimit > 0) {
      claimLimit = ClaimLimit;
    }

    uint256 ownerMintedCount = _claimedBalance[msg.sender];
    require(ownerMintedCount + mintAmount <= claimLimit, "max nft per address exceeded");

    for (uint256 i = 1; i <= mintAmount; i++) {
      _claimedBalance[msg.sender]++;
      _safeMint(msg.sender, supply + i);
    }
  }

  function airdropLimit(address owner) public view returns (uint) {
    uint claimLimit = 0;
    for (uint i = 0; i < _airdropContracts.length; i++) {
      ERC721 airdropContract = ERC721(_airdropContracts[i]);
      claimLimit += airdropContract.balanceOf(owner);
    }
    return claimLimit;
  }

  function walletOfOwner(address owner) public view returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(owner, i);
    }
    return tokenIds;
  }

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory)
  {
    require(_exists(tokenId), "query for nonexistent token");

    string memory currentBaseURI = _baseURI();
    if (tokenId <= RevealTo || Reveal == true) {
        return bytes(currentBaseURI).length > 0
          ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), _baseExtension))
          : "";
    } else {
      return _defaultTokenURI;
    }
  }

  function gift(uint256 amount, address[] calldata destination) public onlyOwner {
    require(amount > 0, "at least 1 nft");
    uint256 supply = totalSupply();
    require(supply + amount <= MaxSupply, "max nft limit exceeded");

    uint256 add = 1;
    for (uint d = 0; d < destination.length; d++) {
      for (uint256 i = 1; i <= amount; i++) {
        _safeMint(destination[d], supply + add);
        add++;
      }
    }
  }

  function setPrice(uint256 newPrice) public onlyOwner {
    Price = newPrice;
  }

  function setMaxMintAmount(uint256 newMaxMintAmount) public onlyOwner {
    MaxMintAmount = newMaxMintAmount;
  }

  function setBaseURI(string memory newBaseURI) public onlyOwner {
    __baseURI = newBaseURI;
  }

  function setBaseExtension(string memory newBaseExtension) public onlyOwner {
    _baseExtension = newBaseExtension;
  }

  function pause(bool paused) public onlyOwner {
    Paused = paused;
  }

  function whitelistMintPause(bool paused) public onlyOwner {
    WhitelistMintPaused = paused;
  }

  function claimPause(bool paused) public onlyOwner {
    ClaimPaused = paused;
  }

  function setReveal(bool reveal) public onlyOwner {
    Reveal = reveal;
  }

  function setRevealTo(uint256 revealTo) public onlyOwner {
    RevealTo = revealTo;
  }

  function setDefaultTokenURI(string memory defaultTokenURI) public onlyOwner {
    _defaultTokenURI = defaultTokenURI;
  }

  function setWhitelistUsers(address[] calldata users) public onlyOwner {
    delete _whitelistedAddresses;
    _whitelistedAddresses = users;
  }

  function setWhitelistMintLimit(uint256 whitelistMintLimit) public onlyOwner {
    WhitelistMintLimit = whitelistMintLimit;
  }

  function setWhiteListPrice(uint256 newPrice) public onlyOwner {
    WhitelistPrice = newPrice;
  }

  function setAirdropContracts(address[] calldata contracts) public onlyOwner {
    delete _airdropContracts;
    _airdropContracts = contracts;
  }

  function setClaimLimit(uint256 claimLimit) public onlyOwner {
    ClaimLimit = claimLimit;
  }

  function withdraw() public payable onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }
}

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":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ClaimLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ClaimPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RevealTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WhitelistMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WhitelistMintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WhitelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"airdropLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"claimPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address[]","name":"destination","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"contracts","type":"address[]"}],"name":"setAirdropContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimLimit","type":"uint256"}],"name":"setClaimLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"defaultTokenURI","type":"string"}],"name":"setDefaultTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"reveal","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"revealTo","type":"uint256"}],"name":"setRevealTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setWhiteListPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whitelistMintLimit","type":"uint256"}],"name":"setWhitelistMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"setWhitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"whiteListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"whitelistMintPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f61723a2f2f000000000000000000000000000000000000000000000000000000815250600c90805190602001906200005192919062000f7c565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90805190602001906200009f92919062000f7c565b506040518060600160405280603081526020016200759360309139600e9080519060200190620000d192919062000f7c565b50670138a388a43c0000600f55612710601055601460115560c86012556001601360006101000a81548160ff02191690831515021790555060006014556000601560006101000a81548160ff021916908315150217905550600160185566b1a2bc2ec500006019556001601a60006101000a81548160ff0219169083151502179055506000601d556001601e60006101000a81548160ff0219169083151502179055503480156200018157600080fd5b506040518060400160405280600c81526020017f42696720436174732054594700000000000000000000000000000000000000008152506040518060400160405280600381526020017f424354000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200020692919062000f7c565b5080600190805190602001906200021f92919062000f7c565b5050506001600a819055506200024a6200023e6200026360201b60201c565b6200026b60201b60201c565b6200025d6012546200033160201b60201c565b620018d6565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000811162000377576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036e906200139b565b60405180910390fd5b6000620003896200055d60201b60201c565b905060105482826200039c9190620013ea565b1115620003e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003d79062001335565b60405180910390fd5b620003f06200056a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200051457601360009054906101000a900460ff161562000476576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046d90620012ad565b60405180910390fd5b601154821115620004be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004b59062001357565b60405180910390fd5b81600f54620004ce919062001447565b34101562000513576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200050a9062001379565b60405180910390fd5b5b6000600190505b828111620005585762000542338284620005369190620013ea565b6200059460201b60201c565b80806200054f90620015b9565b9150506200051b565b505050565b6000600880549050905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620005b6828260405180602001604052806000815250620005ba60201b60201c565b5050565b620005cc83836200062860201b60201c565b620005e160008484846200080e60201b60201c565b62000623576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200061a906200128b565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200069b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006929062001313565b60405180910390fd5b620006ac81620009c860201b60201c565b15620006ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006e690620012cf565b60405180910390fd5b620007036000838362000a3460201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620007559190620013ea565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006200083c8473ffffffffffffffffffffffffffffffffffffffff1662000b7b60201b62002c0d1760201c565b15620009bb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200086e6200026360201b60201c565b8786866040518563ffffffff1660e01b815260040162000892949392919062001237565b602060405180830381600087803b158015620008ad57600080fd5b505af1925050508015620008e157506040513d601f19601f82011682018060405250810190620008de919062001043565b60015b6200096a573d806000811462000914576040519150601f19603f3d011682016040523d82523d6000602084013e62000919565b606091505b5060008151141562000962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000959906200128b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620009c0565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b62000a4c83838362000b8e60201b62002c201760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000a995762000a938162000b9360201b60201c565b62000ae1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000ae05762000adf838262000bdc60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b2e5762000b288162000d5960201b60201c565b62000b76565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000b755762000b74828262000e3560201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000bf68462000ec160201b62001db41760201c565b62000c029190620014a8565b905060006007600084815260200190815260200160002054905081811462000ce8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000d6f9190620014a8565b905060006009600084815260200190815260200160002054905060006008838154811062000da25762000da162001694565b5b90600052602060002001549050806008838154811062000dc75762000dc662001694565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000e195762000e1862001665565b5b6001900381819060005260206000200160009055905550505050565b600062000e4d8362000ec160201b62001db41760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f2c90620012f1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000f8a9062001583565b90600052602060002090601f01602090048101928262000fae576000855562000ffa565b82601f1062000fc957805160ff191683800117855562000ffa565b8280016001018555821562000ffa579182015b8281111562000ff957825182559160200191906001019062000fdc565b5b5090506200100991906200100d565b5090565b5b80821115620010285760008160009055506001016200100e565b5090565b6000815190506200103d81620018bc565b92915050565b6000602082840312156200105c576200105b620016c3565b5b60006200106c848285016200102c565b91505092915050565b6200108081620014e3565b82525050565b60006200109382620013bd565b6200109f8185620013c8565b9350620010b18185602086016200154d565b620010bc81620016c8565b840191505092915050565b6000620010d6603283620013d9565b9150620010e382620016d9565b604082019050919050565b6000620010fd600b83620013d9565b91506200110a8262001728565b602082019050919050565b600062001124601c83620013d9565b9150620011318262001751565b602082019050919050565b60006200114b602a83620013d9565b915062001158826200177a565b604082019050919050565b600062001172602083620013d9565b91506200117f82620017c9565b602082019050919050565b600062001199601683620013d9565b9150620011a682620017f2565b602082019050919050565b6000620011c0602283620013d9565b9150620011cd826200181b565b604082019050919050565b6000620011e7601283620013d9565b9150620011f4826200186a565b602082019050919050565b60006200120e600e83620013d9565b91506200121b8262001893565b602082019050919050565b620012318162001543565b82525050565b60006080820190506200124e600083018762001075565b6200125d602083018662001075565b6200126c604083018562001226565b818103606083015262001280818462001086565b905095945050505050565b60006020820190508181036000830152620012a681620010c7565b9050919050565b60006020820190508181036000830152620012c881620010ee565b9050919050565b60006020820190508181036000830152620012ea8162001115565b9050919050565b600060208201905081810360008301526200130c816200113c565b9050919050565b600060208201905081810360008301526200132e8162001163565b9050919050565b6000602082019050818103600083015262001350816200118a565b9050919050565b600060208201905081810360008301526200137281620011b1565b9050919050565b600060208201905081810360008301526200139481620011d8565b9050919050565b60006020820190508181036000830152620013b681620011ff565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000620013f78262001543565b9150620014048362001543565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200143c576200143b62001607565b5b828201905092915050565b6000620014548262001543565b9150620014618362001543565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200149d576200149c62001607565b5b828202905092915050565b6000620014b58262001543565b9150620014c28362001543565b925082821015620014d857620014d762001607565b5b828203905092915050565b6000620014f08262001523565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200156d57808201518184015260208101905062001550565b838111156200157d576000848401525b50505050565b600060028204905060018216806200159c57607f821691505b60208210811415620015b357620015b262001636565b5b50919050565b6000620015c68262001543565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620015fc57620015fb62001607565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f73616c6520706175736564000000000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f6d6178206e6674206c696d697420657863656564656400000000000000000000600082015250565b7f796f752063616e2061646f70742061206d6178696d756d206f66203230206e6660008201527f7473000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f6174206c656173742031206e6674000000000000000000000000000000000000600082015250565b620018c781620014f7565b8114620018d357600080fd5b50565b615cad80620018e66000396000f3fe60806040526004361061031a5760003560e01c806370a08231116101ab578063b36c1284116100f7578063caeeffdb11610095578063eb24e6561161006f578063eb24e65614610ba3578063f2fde38b14610bce578063fb2dcfe714610bf7578063fb45aa0c14610c225761031a565b8063caeeffdb14610b12578063da3ef23f14610b3d578063e985e9c514610b665761031a565b8063beafc89b116100d1578063beafc89b14610a58578063c056a35514610a81578063c3fe17f114610aac578063c87b56dd14610ad55761031a565b8063b36c1284146109c7578063b4a0dd4f146109f2578063b88d4fde14610a2f5761031a565b80639dfde20111610164578063a125c8241161013e578063a125c82414610921578063a22cb4651461094a578063a7492d2214610973578063ae0400531461099c5761031a565b80639dfde201146108af5780639e87fac8146108da578063a0712d68146109055761031a565b806370a08231146107b3578063715018a6146107f05780638da5cb5b146108075780638ee9afe51461083257806391b7f5ed1461085b57806395d89b41146108845761031a565b80632a3f300c1161026a5780633ccfd60b116102235780634f6ccce7116101fd5780634f6ccce7146106e557806355f804b3146107225780636352211e1461074b57806366b9f0d2146107885761031a565b80633ccfd60b1461067557806342842e0e1461067f578063438b6300146106a85761031a565b80632a3f300c146105575780632beab4b7146105805780632f745c59146105a9578063379607f5146105e6578063381b965c1461060f5780633af32abf146106385761031a565b8063088a4ed0116102d757806318160ddd116102b157806318160ddd146104af5780631afb60e0146104da578063234200371461050357806323b872dd1461052e5761031a565b8063088a4ed014610432578063095ea7b31461045b5780630a917d37146104845761031a565b806301ffc9a71461031f578063020a0ff51461035c57806302329a291461038557806302e001ef146103ae57806306fdde03146103ca578063081812fc146103f5575b600080fd5b34801561032b57600080fd5b50610346600480360381019061034191906143a7565b610c4b565b6040516103539190614be4565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e919061444a565b610cc5565b005b34801561039157600080fd5b506103ac60048036038101906103a7919061437a565b610d4b565b005b6103c860048036038101906103c3919061444a565b610de4565b005b3480156103d657600080fd5b506103df6110a3565b6040516103ec9190614bff565b60405180910390f35b34801561040157600080fd5b5061041c6004803603810190610417919061444a565b611135565b6040516104299190614b5b565b60405180910390f35b34801561043e57600080fd5b506104596004803603810190610454919061444a565b6111ba565b005b34801561046757600080fd5b50610482600480360381019061047d91906142ed565b611240565b005b34801561049057600080fd5b50610499611358565b6040516104a69190614be4565b60405180910390f35b3480156104bb57600080fd5b506104c461136b565b6040516104d19190614fe1565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc919061437a565b611378565b005b34801561050f57600080fd5b50610518611411565b6040516105259190614be4565b60405180910390f35b34801561053a57600080fd5b50610555600480360381019061055091906141d7565b611424565b005b34801561056357600080fd5b5061057e6004803603810190610579919061437a565b611484565b005b34801561058c57600080fd5b506105a760048036038101906105a2919061432d565b61151d565b005b3480156105b557600080fd5b506105d060048036038101906105cb91906142ed565b6115bd565b6040516105dd9190614fe1565b60405180910390f35b3480156105f257600080fd5b5061060d6004803603810190610608919061444a565b611662565b005b34801561061b57600080fd5b506106366004803603810190610631919061444a565b6118e9565b005b34801561064457600080fd5b5061065f600480360381019061065a919061416a565b61196f565b60405161066c9190614be4565b60405180910390f35b61067d611a1e565b005b34801561068b57600080fd5b506106a660048036038101906106a191906141d7565b611b1a565b005b3480156106b457600080fd5b506106cf60048036038101906106ca919061416a565b611b3a565b6040516106dc9190614bc2565b60405180910390f35b3480156106f157600080fd5b5061070c6004803603810190610707919061444a565b611be8565b6040516107199190614fe1565b60405180910390f35b34801561072e57600080fd5b5061074960048036038101906107449190614401565b611c59565b005b34801561075757600080fd5b50610772600480360381019061076d919061444a565b611cef565b60405161077f9190614b5b565b60405180910390f35b34801561079457600080fd5b5061079d611da1565b6040516107aa9190614be4565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d5919061416a565b611db4565b6040516107e79190614fe1565b60405180910390f35b3480156107fc57600080fd5b50610805611e6c565b005b34801561081357600080fd5b5061081c611ef4565b6040516108299190614b5b565b60405180910390f35b34801561083e57600080fd5b506108596004803603810190610854919061437a565b611f1e565b005b34801561086757600080fd5b50610882600480360381019061087d919061444a565b611fb7565b005b34801561089057600080fd5b5061089961203d565b6040516108a69190614bff565b60405180910390f35b3480156108bb57600080fd5b506108c46120cf565b6040516108d19190614fe1565b60405180910390f35b3480156108e657600080fd5b506108ef6120d5565b6040516108fc9190614be4565b60405180910390f35b61091f600480360381019061091a919061444a565b6120e8565b005b34801561092d57600080fd5b5061094860048036038101906109439190614401565b6122e2565b005b34801561095657600080fd5b50610971600480360381019061096c91906142ad565b612378565b005b34801561097f57600080fd5b5061099a6004803603810190610995919061432d565b61238e565b005b3480156109a857600080fd5b506109b161242e565b6040516109be9190614fe1565b60405180910390f35b3480156109d357600080fd5b506109dc612434565b6040516109e99190614fe1565b60405180910390f35b3480156109fe57600080fd5b50610a196004803603810190610a14919061416a565b61243a565b604051610a269190614fe1565b60405180910390f35b348015610a3b57600080fd5b50610a566004803603810190610a51919061422a565b612548565b005b348015610a6457600080fd5b50610a7f6004803603810190610a7a919061444a565b6125aa565b005b348015610a8d57600080fd5b50610a96612630565b604051610aa39190614fe1565b60405180910390f35b348015610ab857600080fd5b50610ad36004803603810190610ace91906144a4565b612636565b005b348015610ae157600080fd5b50610afc6004803603810190610af7919061444a565b6127ec565b604051610b099190614bff565b60405180910390f35b348015610b1e57600080fd5b50610b27612953565b604051610b349190614fe1565b60405180910390f35b348015610b4957600080fd5b50610b646004803603810190610b5f9190614401565b612959565b005b348015610b7257600080fd5b50610b8d6004803603810190610b889190614197565b6129ef565b604051610b9a9190614be4565b60405180910390f35b348015610baf57600080fd5b50610bb8612a83565b604051610bc59190614fe1565b60405180910390f35b348015610bda57600080fd5b50610bf56004803603810190610bf0919061416a565b612a89565b005b348015610c0357600080fd5b50610c0c612b81565b604051610c199190614fe1565b60405180910390f35b348015610c2e57600080fd5b50610c496004803603810190610c44919061444a565b612b87565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cbe5750610cbd82612c25565b5b9050919050565b610ccd612d07565b73ffffffffffffffffffffffffffffffffffffffff16610ceb611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3890614e21565b60405180910390fd5b80601d8190555050565b610d53612d07565b73ffffffffffffffffffffffffffffffffffffffff16610d71611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe90614e21565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b6002600a541415610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2190614fa1565b60405180910390fd5b6002600a81905550601a60009054906101000a900460ff1615610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7990614ec1565b60405180910390fd5b6000610e8c61136b565b90506010548282610e9d919061511f565b1115610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590614e61565b60405180910390fd5b610ee73361196f565b610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90614ea1565b60405180910390fd5b6000601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506018548382610f79919061511f565b1115610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190614d21565b60405180910390fd5b82601954610fc891906151a6565b34101561100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190614f21565b60405180910390fd5b6000600190505b83811161109557601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906110689061534d565b919050555061108233828561107d919061511f565b612d0f565b808061108d9061534d565b915050611011565b5050506001600a8190555050565b6060600080546110b2906152ea565b80601f01602080910402602001604051908101604052809291908181526020018280546110de906152ea565b801561112b5780601f106111005761010080835404028352916020019161112b565b820191906000526020600020905b81548152906001019060200180831161110e57829003601f168201915b5050505050905090565b600061114082612d2d565b61117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117690614e01565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6111c2612d07565b73ffffffffffffffffffffffffffffffffffffffff166111e0611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d90614e21565b60405180910390fd5b8060118190555050565b600061124b82611cef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b390614ee1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166112db612d07565b73ffffffffffffffffffffffffffffffffffffffff16148061130a575061130981611304612d07565b6129ef565b5b611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090614d81565b60405180910390fd5b6113538383612d99565b505050565b601e60009054906101000a900460ff1681565b6000600880549050905090565b611380612d07565b73ffffffffffffffffffffffffffffffffffffffff1661139e611ef4565b73ffffffffffffffffffffffffffffffffffffffff16146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90614e21565b60405180910390fd5b80601a60006101000a81548160ff02191690831515021790555050565b601a60009054906101000a900460ff1681565b61143561142f612d07565b82612e52565b611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b90614f41565b60405180910390fd5b61147f838383612f30565b505050565b61148c612d07565b73ffffffffffffffffffffffffffffffffffffffff166114aa611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790614e21565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b611525612d07565b73ffffffffffffffffffffffffffffffffffffffff16611543611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159090614e21565b60405180910390fd5b601660006115a79190613e52565b8181601691906115b8929190613e73565b505050565b60006115c883611db4565b8210611609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160090614c41565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a5414156116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f90614fa1565b60405180910390fd5b6002600a81905550601e60009054906101000a900460ff1615611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790614c21565b60405180910390fd5b600061170a61136b565b9050601054828261171b919061511f565b111561175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175390614e61565b60405180910390fd5b60006117673361243a565b9050600081116117ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a390614e81565b60405180910390fd5b6000601d5411156117bd57601d5490505b6000601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081848261180e919061511f565b111561184f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184690614f81565b60405180910390fd5b6000600190505b8481116118da57601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906118ad9061534d565b91905055506118c73382866118c2919061511f565b612d0f565b80806118d29061534d565b915050611856565b505050506001600a8190555050565b6118f1612d07565b73ffffffffffffffffffffffffffffffffffffffff1661190f611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90614e21565b60405180910390fd5b8060188190555050565b600080600090505b601680549050811015611a13578273ffffffffffffffffffffffffffffffffffffffff16601682815481106119af576119ae615483565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a00576001915050611a19565b8080611a0b9061534d565b915050611977565b50600090505b919050565b611a26612d07565b73ffffffffffffffffffffffffffffffffffffffff16611a44611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614e21565b60405180910390fd5b6000611aa4611ef4565b73ffffffffffffffffffffffffffffffffffffffff1647604051611ac790614b46565b60006040518083038185875af1925050503d8060008114611b04576040519150601f19603f3d011682016040523d82523d6000602084013e611b09565b606091505b5050905080611b1757600080fd5b50565b611b3583838360405180602001604052806000815250612548565b505050565b60606000611b4783611db4565b905060008167ffffffffffffffff811115611b6557611b646154b2565b5b604051908082528060200260200182016040528015611b935781602001602082028036833780820191505090505b50905060005b82811015611bdd57611bab85826115bd565b828281518110611bbe57611bbd615483565b5b6020026020010181815250508080611bd59061534d565b915050611b99565b508092505050919050565b6000611bf261136b565b8210611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a90614f61565b60405180910390fd5b60088281548110611c4757611c46615483565b5b90600052602060002001549050919050565b611c61612d07565b73ffffffffffffffffffffffffffffffffffffffff16611c7f611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90614e21565b60405180910390fd5b80600c9080519060200190611ceb929190613f13565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8f90614dc1565b60405180910390fd5b80915050919050565b601560009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614da1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e74612d07565b73ffffffffffffffffffffffffffffffffffffffff16611e92611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edf90614e21565b60405180910390fd5b611ef2600061318c565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611f26612d07565b73ffffffffffffffffffffffffffffffffffffffff16611f44611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9190614e21565b60405180910390fd5b80601e60006101000a81548160ff02191690831515021790555050565b611fbf612d07565b73ffffffffffffffffffffffffffffffffffffffff16611fdd611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a90614e21565b60405180910390fd5b80600f8190555050565b60606001805461204c906152ea565b80601f0160208091040260200160405190810160405280929190818152602001828054612078906152ea565b80156120c55780601f1061209a576101008083540402835291602001916120c5565b820191906000526020600020905b8154815290600101906020018083116120a857829003601f168201915b5050505050905090565b600f5481565b601360009054906101000a900460ff1681565b6000811161212b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212290614fc1565b60405180910390fd5b600061213561136b565b90506010548282612146919061511f565b1115612187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217e90614e61565b60405180910390fd5b61218f611ef4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122a757601360009054906101000a900460ff1615612211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220890614ca1565b60405180910390fd5b601154821115612256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224d90614f01565b60405180910390fd5b81600f5461226491906151a6565b3410156122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d90614f21565b60405180910390fd5b5b6000600190505b8281116122dd576122ca3382846122c5919061511f565b612d0f565b80806122d59061534d565b9150506122ae565b505050565b6122ea612d07565b73ffffffffffffffffffffffffffffffffffffffff16612308611ef4565b73ffffffffffffffffffffffffffffffffffffffff161461235e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235590614e21565b60405180910390fd5b80600e9080519060200190612374929190613f13565b5050565b61238a612383612d07565b8383613252565b5050565b612396612d07565b73ffffffffffffffffffffffffffffffffffffffff166123b4611ef4565b73ffffffffffffffffffffffffffffffffffffffff161461240a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240190614e21565b60405180910390fd5b601c60006124189190613e52565b8181601c9190612429929190613e73565b505050565b60195481565b60105481565b6000806000905060005b601c8054905081101561253e576000601c828154811061246757612466615483565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b81526004016124cd9190614b5b565b60206040518083038186803b1580156124e557600080fd5b505afa1580156124f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251d9190614477565b83612528919061511f565b92505080806125369061534d565b915050612444565b5080915050919050565b612559612553612d07565b83612e52565b612598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258f90614f41565b60405180910390fd5b6125a4848484846133bf565b50505050565b6125b2612d07565b73ffffffffffffffffffffffffffffffffffffffff166125d0611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614612626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261d90614e21565b60405180910390fd5b8060198190555050565b601d5481565b61263e612d07565b73ffffffffffffffffffffffffffffffffffffffff1661265c611ef4565b73ffffffffffffffffffffffffffffffffffffffff16146126b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a990614e21565b60405180910390fd5b600083116126f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ec90614fc1565b60405180910390fd5b60006126ff61136b565b90506010548482612710919061511f565b1115612751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274890614e61565b60405180910390fd5b60006001905060005b848490508110156127e4576000600190505b8681116127d0576127af86868481811061278957612788615483565b5b905060200201602081019061279e919061416a565b84866127aa919061511f565b612d0f565b82806127ba9061534d565b93505080806127c89061534d565b91505061276c565b5080806127dc9061534d565b91505061275a565b505050505050565b60606127f782612d2d565b612836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282d90614d61565b60405180910390fd5b600061284061341b565b905060145483111580612866575060011515601560009054906101000a900460ff161515145b156128bf57600081511161288957604051806020016040528060008152506128b7565b80612893846134ad565b600d6040516020016128a793929190614b15565b6040516020818303038152906040525b91505061294e565b600e80546128cc906152ea565b80601f01602080910402602001604051908101604052809291908181526020018280546128f8906152ea565b80156129455780601f1061291a57610100808354040283529160200191612945565b820191906000526020600020905b81548152906001019060200180831161292857829003601f168201915b50505050509150505b919050565b60115481565b612961612d07565b73ffffffffffffffffffffffffffffffffffffffff1661297f611ef4565b73ffffffffffffffffffffffffffffffffffffffff16146129d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cc90614e21565b60405180910390fd5b80600d90805190602001906129eb929190613f13565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60185481565b612a91612d07565b73ffffffffffffffffffffffffffffffffffffffff16612aaf611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614612b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afc90614e21565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6c90614c81565b60405180910390fd5b612b7e8161318c565b50565b60145481565b612b8f612d07565b73ffffffffffffffffffffffffffffffffffffffff16612bad611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614612c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfa90614e21565b60405180910390fd5b8060148190555050565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cf057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d005750612cff8261360e565b5b9050919050565b600033905090565b612d29828260405180602001604052806000815250613678565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e0c83611cef565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e5d82612d2d565b612e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9390614d41565b60405180910390fd5b6000612ea783611cef565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f1657508373ffffffffffffffffffffffffffffffffffffffff16612efe84611135565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f275750612f2681856129ef565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f5082611cef565b73ffffffffffffffffffffffffffffffffffffffff1614612fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9d90614e41565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300d90614ce1565b60405180910390fd5b6130218383836136d3565b61302c600082612d99565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461307c9190615200565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130d3919061511f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b890614d01565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516133b29190614be4565b60405180910390a3505050565b6133ca848484612f30565b6133d6848484846137e7565b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340c90614c61565b60405180910390fd5b50505050565b6060600c805461342a906152ea565b80601f0160208091040260200160405190810160405280929190818152602001828054613456906152ea565b80156134a35780601f10613478576101008083540402835291602001916134a3565b820191906000526020600020905b81548152906001019060200180831161348657829003601f168201915b5050505050905090565b606060008214156134f5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613609565b600082905060005b600082146135275780806135109061534d565b915050600a826135209190615175565b91506134fd565b60008167ffffffffffffffff811115613543576135426154b2565b5b6040519080825280601f01601f1916602001820160405280156135755781602001600182028036833780820191505090505b5090505b600085146136025760018261358e9190615200565b9150600a8561359d9190615396565b60306135a9919061511f565b60f81b8183815181106135bf576135be615483565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135fb9190615175565b9450613579565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613682838361397e565b61368f60008484846137e7565b6136ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c590614c61565b60405180910390fd5b505050565b6136de838383612c20565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156137215761371c81613b4c565b613760565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461375f5761375e8382613b95565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137a35761379e81613d02565b6137e2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146137e1576137e08282613dd3565b5b5b505050565b60006138088473ffffffffffffffffffffffffffffffffffffffff16612c0d565b15613971578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613831612d07565b8786866040518563ffffffff1660e01b81526004016138539493929190614b76565b602060405180830381600087803b15801561386d57600080fd5b505af192505050801561389e57506040513d601f19601f8201168201806040525081019061389b91906143d4565b60015b613921573d80600081146138ce576040519150601f19603f3d011682016040523d82523d6000602084013e6138d3565b606091505b50600081511415613919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391090614c61565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613976565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139e590614de1565b60405180910390fd5b6139f781612d2d565b15613a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2e90614cc1565b60405180910390fd5b613a43600083836136d3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a93919061511f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613ba284611db4565b613bac9190615200565b9050600060076000848152602001908152602001600020549050818114613c91576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613d169190615200565b9050600060096000848152602001908152602001600020549050600060088381548110613d4657613d45615483565b5b906000526020600020015490508060088381548110613d6857613d67615483565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613db757613db6615454565b5b6001900381819060005260206000200160009055905550505050565b6000613dde83611db4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b5080546000825590600052602060002090810190613e709190613f99565b50565b828054828255906000526020600020908101928215613f02579160200282015b82811115613f0157823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613e93565b5b509050613f0f9190613f99565b5090565b828054613f1f906152ea565b90600052602060002090601f016020900481019282613f415760008555613f88565b82601f10613f5a57805160ff1916838001178555613f88565b82800160010185558215613f88579182015b82811115613f87578251825591602001919060010190613f6c565b5b509050613f959190613f99565b5090565b5b80821115613fb2576000816000905550600101613f9a565b5090565b6000613fc9613fc484615021565b614ffc565b905082815260208101848484011115613fe557613fe46154f0565b5b613ff08482856152a8565b509392505050565b600061400b61400684615052565b614ffc565b905082815260208101848484011115614027576140266154f0565b5b6140328482856152a8565b509392505050565b60008135905061404981615c1b565b92915050565b60008083601f840112614065576140646154e6565b5b8235905067ffffffffffffffff811115614082576140816154e1565b5b60208301915083602082028301111561409e5761409d6154eb565b5b9250929050565b6000813590506140b481615c32565b92915050565b6000813590506140c981615c49565b92915050565b6000815190506140de81615c49565b92915050565b600082601f8301126140f9576140f86154e6565b5b8135614109848260208601613fb6565b91505092915050565b600082601f830112614127576141266154e6565b5b8135614137848260208601613ff8565b91505092915050565b60008135905061414f81615c60565b92915050565b60008151905061416481615c60565b92915050565b6000602082840312156141805761417f6154fa565b5b600061418e8482850161403a565b91505092915050565b600080604083850312156141ae576141ad6154fa565b5b60006141bc8582860161403a565b92505060206141cd8582860161403a565b9150509250929050565b6000806000606084860312156141f0576141ef6154fa565b5b60006141fe8682870161403a565b935050602061420f8682870161403a565b925050604061422086828701614140565b9150509250925092565b60008060008060808587031215614244576142436154fa565b5b60006142528782880161403a565b94505060206142638782880161403a565b935050604061427487828801614140565b925050606085013567ffffffffffffffff811115614295576142946154f5565b5b6142a1878288016140e4565b91505092959194509250565b600080604083850312156142c4576142c36154fa565b5b60006142d28582860161403a565b92505060206142e3858286016140a5565b9150509250929050565b60008060408385031215614304576143036154fa565b5b60006143128582860161403a565b925050602061432385828601614140565b9150509250929050565b60008060208385031215614344576143436154fa565b5b600083013567ffffffffffffffff811115614362576143616154f5565b5b61436e8582860161404f565b92509250509250929050565b6000602082840312156143905761438f6154fa565b5b600061439e848285016140a5565b91505092915050565b6000602082840312156143bd576143bc6154fa565b5b60006143cb848285016140ba565b91505092915050565b6000602082840312156143ea576143e96154fa565b5b60006143f8848285016140cf565b91505092915050565b600060208284031215614417576144166154fa565b5b600082013567ffffffffffffffff811115614435576144346154f5565b5b61444184828501614112565b91505092915050565b6000602082840312156144605761445f6154fa565b5b600061446e84828501614140565b91505092915050565b60006020828403121561448d5761448c6154fa565b5b600061449b84828501614155565b91505092915050565b6000806000604084860312156144bd576144bc6154fa565b5b60006144cb86828701614140565b935050602084013567ffffffffffffffff8111156144ec576144eb6154f5565b5b6144f88682870161404f565b92509250509250925092565b60006145108383614af7565b60208301905092915050565b61452581615234565b82525050565b6000614536826150a8565b61454081856150d6565b935061454b83615083565b8060005b8381101561457c5781516145638882614504565b975061456e836150c9565b92505060018101905061454f565b5085935050505092915050565b61459281615246565b82525050565b60006145a3826150b3565b6145ad81856150e7565b93506145bd8185602086016152b7565b6145c6816154ff565b840191505092915050565b60006145dc826150be565b6145e68185615103565b93506145f68185602086016152b7565b6145ff816154ff565b840191505092915050565b6000614615826150be565b61461f8185615114565b935061462f8185602086016152b7565b80840191505092915050565b60008154614648816152ea565b6146528186615114565b9450600182166000811461466d576001811461467e576146b1565b60ff198316865281860193506146b1565b61468785615093565b60005b838110156146a95781548189015260018201915060208101905061468a565b838801955050505b50505092915050565b60006146c7600c83615103565b91506146d282615510565b602082019050919050565b60006146ea602b83615103565b91506146f582615539565b604082019050919050565b600061470d603283615103565b915061471882615588565b604082019050919050565b6000614730602683615103565b915061473b826155d7565b604082019050919050565b6000614753600b83615103565b915061475e82615626565b602082019050919050565b6000614776601c83615103565b91506147818261564f565b602082019050919050565b6000614799602483615103565b91506147a482615678565b604082019050919050565b60006147bc601983615103565b91506147c7826156c7565b602082019050919050565b60006147df602683615103565b91506147ea826156f0565b604082019050919050565b6000614802602c83615103565b915061480d8261573f565b604082019050919050565b6000614825601b83615103565b91506148308261578e565b602082019050919050565b6000614848603883615103565b9150614853826157b7565b604082019050919050565b600061486b602a83615103565b915061487682615806565b604082019050919050565b600061488e602983615103565b915061489982615855565b604082019050919050565b60006148b1602083615103565b91506148bc826158a4565b602082019050919050565b60006148d4602c83615103565b91506148df826158cd565b604082019050919050565b60006148f7602083615103565b91506149028261591c565b602082019050919050565b600061491a602983615103565b915061492582615945565b604082019050919050565b600061493d601683615103565b915061494882615994565b602082019050919050565b6000614960600d83615103565b915061496b826159bd565b602082019050919050565b6000614983601283615103565b915061498e826159e6565b602082019050919050565b60006149a6601583615103565b91506149b182615a0f565b602082019050919050565b60006149c9602183615103565b91506149d482615a38565b604082019050919050565b60006149ec602283615103565b91506149f782615a87565b604082019050919050565b6000614a0f6000836150f8565b9150614a1a82615ad6565b600082019050919050565b6000614a32601283615103565b9150614a3d82615ad9565b602082019050919050565b6000614a55603183615103565b9150614a6082615b02565b604082019050919050565b6000614a78602c83615103565b9150614a8382615b51565b604082019050919050565b6000614a9b601c83615103565b9150614aa682615ba0565b602082019050919050565b6000614abe601f83615103565b9150614ac982615bc9565b602082019050919050565b6000614ae1600e83615103565b9150614aec82615bf2565b602082019050919050565b614b008161529e565b82525050565b614b0f8161529e565b82525050565b6000614b21828661460a565b9150614b2d828561460a565b9150614b39828461463b565b9150819050949350505050565b6000614b5182614a02565b9150819050919050565b6000602082019050614b70600083018461451c565b92915050565b6000608082019050614b8b600083018761451c565b614b98602083018661451c565b614ba56040830185614b06565b8181036060830152614bb78184614598565b905095945050505050565b60006020820190508181036000830152614bdc818461452b565b905092915050565b6000602082019050614bf96000830184614589565b92915050565b60006020820190508181036000830152614c1981846145d1565b905092915050565b60006020820190508181036000830152614c3a816146ba565b9050919050565b60006020820190508181036000830152614c5a816146dd565b9050919050565b60006020820190508181036000830152614c7a81614700565b9050919050565b60006020820190508181036000830152614c9a81614723565b9050919050565b60006020820190508181036000830152614cba81614746565b9050919050565b60006020820190508181036000830152614cda81614769565b9050919050565b60006020820190508181036000830152614cfa8161478c565b9050919050565b60006020820190508181036000830152614d1a816147af565b9050919050565b60006020820190508181036000830152614d3a816147d2565b9050919050565b60006020820190508181036000830152614d5a816147f5565b9050919050565b60006020820190508181036000830152614d7a81614818565b9050919050565b60006020820190508181036000830152614d9a8161483b565b9050919050565b60006020820190508181036000830152614dba8161485e565b9050919050565b60006020820190508181036000830152614dda81614881565b9050919050565b60006020820190508181036000830152614dfa816148a4565b9050919050565b60006020820190508181036000830152614e1a816148c7565b9050919050565b60006020820190508181036000830152614e3a816148ea565b9050919050565b60006020820190508181036000830152614e5a8161490d565b9050919050565b60006020820190508181036000830152614e7a81614930565b9050919050565b60006020820190508181036000830152614e9a81614953565b9050919050565b60006020820190508181036000830152614eba81614976565b9050919050565b60006020820190508181036000830152614eda81614999565b9050919050565b60006020820190508181036000830152614efa816149bc565b9050919050565b60006020820190508181036000830152614f1a816149df565b9050919050565b60006020820190508181036000830152614f3a81614a25565b9050919050565b60006020820190508181036000830152614f5a81614a48565b9050919050565b60006020820190508181036000830152614f7a81614a6b565b9050919050565b60006020820190508181036000830152614f9a81614a8e565b9050919050565b60006020820190508181036000830152614fba81614ab1565b9050919050565b60006020820190508181036000830152614fda81614ad4565b9050919050565b6000602082019050614ff66000830184614b06565b92915050565b6000615006615017565b9050615012828261531c565b919050565b6000604051905090565b600067ffffffffffffffff82111561503c5761503b6154b2565b5b615045826154ff565b9050602081019050919050565b600067ffffffffffffffff82111561506d5761506c6154b2565b5b615076826154ff565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061512a8261529e565b91506151358361529e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561516a576151696153c7565b5b828201905092915050565b60006151808261529e565b915061518b8361529e565b92508261519b5761519a6153f6565b5b828204905092915050565b60006151b18261529e565b91506151bc8361529e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151f5576151f46153c7565b5b828202905092915050565b600061520b8261529e565b91506152168361529e565b925082821015615229576152286153c7565b5b828203905092915050565b600061523f8261527e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152d55780820151818401526020810190506152ba565b838111156152e4576000848401525b50505050565b6000600282049050600182168061530257607f821691505b6020821081141561531657615315615425565b5b50919050565b615325826154ff565b810181811067ffffffffffffffff82111715615344576153436154b2565b5b80604052505050565b60006153588261529e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561538b5761538a6153c7565b5b600182019050919050565b60006153a18261529e565b91506153ac8361529e565b9250826153bc576153bb6153f6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f636c61696d207061757365640000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f73616c6520706175736564000000000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f6d6178204e4654207065722077686974656c697374206164647265737320657860008201527f6365656465640000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f6d6178206e6674206c696d697420657863656564656400000000000000000000600082015250565b7f6e6f74207175616c696669656400000000000000000000000000000000000000600082015250565b7f77686974656c6973742072657175697265640000000000000000000000000000600082015250565b7f77686974656c697374206d696e74207061757365640000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f796f752063616e2061646f70742061206d6178696d756d206f66203230206e6660008201527f7473000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f6d6178206e667420706572206164647265737320657863656564656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f6174206c656173742031206e6674000000000000000000000000000000000000600082015250565b615c2481615234565b8114615c2f57600080fd5b50565b615c3b81615246565b8114615c4657600080fd5b50565b615c5281615252565b8114615c5d57600080fd5b50565b615c698161529e565b8114615c7457600080fd5b5056fea2646970667358221220cbd8d5fdfdf72f3fae13f8c25d8207cf0e7b8374e7431a905ba2cd6b37f10e5064736f6c6343000807003361723a2f2f773459344a586f43474e4a4f426e696d644f354f7a635a6e63626e6e3265775f4c785a50776f7065476134

Deployed Bytecode

0x60806040526004361061031a5760003560e01c806370a08231116101ab578063b36c1284116100f7578063caeeffdb11610095578063eb24e6561161006f578063eb24e65614610ba3578063f2fde38b14610bce578063fb2dcfe714610bf7578063fb45aa0c14610c225761031a565b8063caeeffdb14610b12578063da3ef23f14610b3d578063e985e9c514610b665761031a565b8063beafc89b116100d1578063beafc89b14610a58578063c056a35514610a81578063c3fe17f114610aac578063c87b56dd14610ad55761031a565b8063b36c1284146109c7578063b4a0dd4f146109f2578063b88d4fde14610a2f5761031a565b80639dfde20111610164578063a125c8241161013e578063a125c82414610921578063a22cb4651461094a578063a7492d2214610973578063ae0400531461099c5761031a565b80639dfde201146108af5780639e87fac8146108da578063a0712d68146109055761031a565b806370a08231146107b3578063715018a6146107f05780638da5cb5b146108075780638ee9afe51461083257806391b7f5ed1461085b57806395d89b41146108845761031a565b80632a3f300c1161026a5780633ccfd60b116102235780634f6ccce7116101fd5780634f6ccce7146106e557806355f804b3146107225780636352211e1461074b57806366b9f0d2146107885761031a565b80633ccfd60b1461067557806342842e0e1461067f578063438b6300146106a85761031a565b80632a3f300c146105575780632beab4b7146105805780632f745c59146105a9578063379607f5146105e6578063381b965c1461060f5780633af32abf146106385761031a565b8063088a4ed0116102d757806318160ddd116102b157806318160ddd146104af5780631afb60e0146104da578063234200371461050357806323b872dd1461052e5761031a565b8063088a4ed014610432578063095ea7b31461045b5780630a917d37146104845761031a565b806301ffc9a71461031f578063020a0ff51461035c57806302329a291461038557806302e001ef146103ae57806306fdde03146103ca578063081812fc146103f5575b600080fd5b34801561032b57600080fd5b50610346600480360381019061034191906143a7565b610c4b565b6040516103539190614be4565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e919061444a565b610cc5565b005b34801561039157600080fd5b506103ac60048036038101906103a7919061437a565b610d4b565b005b6103c860048036038101906103c3919061444a565b610de4565b005b3480156103d657600080fd5b506103df6110a3565b6040516103ec9190614bff565b60405180910390f35b34801561040157600080fd5b5061041c6004803603810190610417919061444a565b611135565b6040516104299190614b5b565b60405180910390f35b34801561043e57600080fd5b506104596004803603810190610454919061444a565b6111ba565b005b34801561046757600080fd5b50610482600480360381019061047d91906142ed565b611240565b005b34801561049057600080fd5b50610499611358565b6040516104a69190614be4565b60405180910390f35b3480156104bb57600080fd5b506104c461136b565b6040516104d19190614fe1565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc919061437a565b611378565b005b34801561050f57600080fd5b50610518611411565b6040516105259190614be4565b60405180910390f35b34801561053a57600080fd5b50610555600480360381019061055091906141d7565b611424565b005b34801561056357600080fd5b5061057e6004803603810190610579919061437a565b611484565b005b34801561058c57600080fd5b506105a760048036038101906105a2919061432d565b61151d565b005b3480156105b557600080fd5b506105d060048036038101906105cb91906142ed565b6115bd565b6040516105dd9190614fe1565b60405180910390f35b3480156105f257600080fd5b5061060d6004803603810190610608919061444a565b611662565b005b34801561061b57600080fd5b506106366004803603810190610631919061444a565b6118e9565b005b34801561064457600080fd5b5061065f600480360381019061065a919061416a565b61196f565b60405161066c9190614be4565b60405180910390f35b61067d611a1e565b005b34801561068b57600080fd5b506106a660048036038101906106a191906141d7565b611b1a565b005b3480156106b457600080fd5b506106cf60048036038101906106ca919061416a565b611b3a565b6040516106dc9190614bc2565b60405180910390f35b3480156106f157600080fd5b5061070c6004803603810190610707919061444a565b611be8565b6040516107199190614fe1565b60405180910390f35b34801561072e57600080fd5b5061074960048036038101906107449190614401565b611c59565b005b34801561075757600080fd5b50610772600480360381019061076d919061444a565b611cef565b60405161077f9190614b5b565b60405180910390f35b34801561079457600080fd5b5061079d611da1565b6040516107aa9190614be4565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d5919061416a565b611db4565b6040516107e79190614fe1565b60405180910390f35b3480156107fc57600080fd5b50610805611e6c565b005b34801561081357600080fd5b5061081c611ef4565b6040516108299190614b5b565b60405180910390f35b34801561083e57600080fd5b506108596004803603810190610854919061437a565b611f1e565b005b34801561086757600080fd5b50610882600480360381019061087d919061444a565b611fb7565b005b34801561089057600080fd5b5061089961203d565b6040516108a69190614bff565b60405180910390f35b3480156108bb57600080fd5b506108c46120cf565b6040516108d19190614fe1565b60405180910390f35b3480156108e657600080fd5b506108ef6120d5565b6040516108fc9190614be4565b60405180910390f35b61091f600480360381019061091a919061444a565b6120e8565b005b34801561092d57600080fd5b5061094860048036038101906109439190614401565b6122e2565b005b34801561095657600080fd5b50610971600480360381019061096c91906142ad565b612378565b005b34801561097f57600080fd5b5061099a6004803603810190610995919061432d565b61238e565b005b3480156109a857600080fd5b506109b161242e565b6040516109be9190614fe1565b60405180910390f35b3480156109d357600080fd5b506109dc612434565b6040516109e99190614fe1565b60405180910390f35b3480156109fe57600080fd5b50610a196004803603810190610a14919061416a565b61243a565b604051610a269190614fe1565b60405180910390f35b348015610a3b57600080fd5b50610a566004803603810190610a51919061422a565b612548565b005b348015610a6457600080fd5b50610a7f6004803603810190610a7a919061444a565b6125aa565b005b348015610a8d57600080fd5b50610a96612630565b604051610aa39190614fe1565b60405180910390f35b348015610ab857600080fd5b50610ad36004803603810190610ace91906144a4565b612636565b005b348015610ae157600080fd5b50610afc6004803603810190610af7919061444a565b6127ec565b604051610b099190614bff565b60405180910390f35b348015610b1e57600080fd5b50610b27612953565b604051610b349190614fe1565b60405180910390f35b348015610b4957600080fd5b50610b646004803603810190610b5f9190614401565b612959565b005b348015610b7257600080fd5b50610b8d6004803603810190610b889190614197565b6129ef565b604051610b9a9190614be4565b60405180910390f35b348015610baf57600080fd5b50610bb8612a83565b604051610bc59190614fe1565b60405180910390f35b348015610bda57600080fd5b50610bf56004803603810190610bf0919061416a565b612a89565b005b348015610c0357600080fd5b50610c0c612b81565b604051610c199190614fe1565b60405180910390f35b348015610c2e57600080fd5b50610c496004803603810190610c44919061444a565b612b87565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cbe5750610cbd82612c25565b5b9050919050565b610ccd612d07565b73ffffffffffffffffffffffffffffffffffffffff16610ceb611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3890614e21565b60405180910390fd5b80601d8190555050565b610d53612d07565b73ffffffffffffffffffffffffffffffffffffffff16610d71611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe90614e21565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b6002600a541415610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2190614fa1565b60405180910390fd5b6002600a81905550601a60009054906101000a900460ff1615610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7990614ec1565b60405180910390fd5b6000610e8c61136b565b90506010548282610e9d919061511f565b1115610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590614e61565b60405180910390fd5b610ee73361196f565b610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90614ea1565b60405180910390fd5b6000601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506018548382610f79919061511f565b1115610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190614d21565b60405180910390fd5b82601954610fc891906151a6565b34101561100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190614f21565b60405180910390fd5b6000600190505b83811161109557601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906110689061534d565b919050555061108233828561107d919061511f565b612d0f565b808061108d9061534d565b915050611011565b5050506001600a8190555050565b6060600080546110b2906152ea565b80601f01602080910402602001604051908101604052809291908181526020018280546110de906152ea565b801561112b5780601f106111005761010080835404028352916020019161112b565b820191906000526020600020905b81548152906001019060200180831161110e57829003601f168201915b5050505050905090565b600061114082612d2d565b61117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117690614e01565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6111c2612d07565b73ffffffffffffffffffffffffffffffffffffffff166111e0611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d90614e21565b60405180910390fd5b8060118190555050565b600061124b82611cef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b390614ee1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166112db612d07565b73ffffffffffffffffffffffffffffffffffffffff16148061130a575061130981611304612d07565b6129ef565b5b611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090614d81565b60405180910390fd5b6113538383612d99565b505050565b601e60009054906101000a900460ff1681565b6000600880549050905090565b611380612d07565b73ffffffffffffffffffffffffffffffffffffffff1661139e611ef4565b73ffffffffffffffffffffffffffffffffffffffff16146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90614e21565b60405180910390fd5b80601a60006101000a81548160ff02191690831515021790555050565b601a60009054906101000a900460ff1681565b61143561142f612d07565b82612e52565b611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b90614f41565b60405180910390fd5b61147f838383612f30565b505050565b61148c612d07565b73ffffffffffffffffffffffffffffffffffffffff166114aa611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790614e21565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b611525612d07565b73ffffffffffffffffffffffffffffffffffffffff16611543611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159090614e21565b60405180910390fd5b601660006115a79190613e52565b8181601691906115b8929190613e73565b505050565b60006115c883611db4565b8210611609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160090614c41565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a5414156116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f90614fa1565b60405180910390fd5b6002600a81905550601e60009054906101000a900460ff1615611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790614c21565b60405180910390fd5b600061170a61136b565b9050601054828261171b919061511f565b111561175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175390614e61565b60405180910390fd5b60006117673361243a565b9050600081116117ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a390614e81565b60405180910390fd5b6000601d5411156117bd57601d5490505b6000601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081848261180e919061511f565b111561184f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184690614f81565b60405180910390fd5b6000600190505b8481116118da57601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906118ad9061534d565b91905055506118c73382866118c2919061511f565b612d0f565b80806118d29061534d565b915050611856565b505050506001600a8190555050565b6118f1612d07565b73ffffffffffffffffffffffffffffffffffffffff1661190f611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90614e21565b60405180910390fd5b8060188190555050565b600080600090505b601680549050811015611a13578273ffffffffffffffffffffffffffffffffffffffff16601682815481106119af576119ae615483565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a00576001915050611a19565b8080611a0b9061534d565b915050611977565b50600090505b919050565b611a26612d07565b73ffffffffffffffffffffffffffffffffffffffff16611a44611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614e21565b60405180910390fd5b6000611aa4611ef4565b73ffffffffffffffffffffffffffffffffffffffff1647604051611ac790614b46565b60006040518083038185875af1925050503d8060008114611b04576040519150601f19603f3d011682016040523d82523d6000602084013e611b09565b606091505b5050905080611b1757600080fd5b50565b611b3583838360405180602001604052806000815250612548565b505050565b60606000611b4783611db4565b905060008167ffffffffffffffff811115611b6557611b646154b2565b5b604051908082528060200260200182016040528015611b935781602001602082028036833780820191505090505b50905060005b82811015611bdd57611bab85826115bd565b828281518110611bbe57611bbd615483565b5b6020026020010181815250508080611bd59061534d565b915050611b99565b508092505050919050565b6000611bf261136b565b8210611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a90614f61565b60405180910390fd5b60088281548110611c4757611c46615483565b5b90600052602060002001549050919050565b611c61612d07565b73ffffffffffffffffffffffffffffffffffffffff16611c7f611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90614e21565b60405180910390fd5b80600c9080519060200190611ceb929190613f13565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8f90614dc1565b60405180910390fd5b80915050919050565b601560009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614da1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e74612d07565b73ffffffffffffffffffffffffffffffffffffffff16611e92611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edf90614e21565b60405180910390fd5b611ef2600061318c565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611f26612d07565b73ffffffffffffffffffffffffffffffffffffffff16611f44611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614611f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9190614e21565b60405180910390fd5b80601e60006101000a81548160ff02191690831515021790555050565b611fbf612d07565b73ffffffffffffffffffffffffffffffffffffffff16611fdd611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a90614e21565b60405180910390fd5b80600f8190555050565b60606001805461204c906152ea565b80601f0160208091040260200160405190810160405280929190818152602001828054612078906152ea565b80156120c55780601f1061209a576101008083540402835291602001916120c5565b820191906000526020600020905b8154815290600101906020018083116120a857829003601f168201915b5050505050905090565b600f5481565b601360009054906101000a900460ff1681565b6000811161212b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212290614fc1565b60405180910390fd5b600061213561136b565b90506010548282612146919061511f565b1115612187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217e90614e61565b60405180910390fd5b61218f611ef4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122a757601360009054906101000a900460ff1615612211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220890614ca1565b60405180910390fd5b601154821115612256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224d90614f01565b60405180910390fd5b81600f5461226491906151a6565b3410156122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d90614f21565b60405180910390fd5b5b6000600190505b8281116122dd576122ca3382846122c5919061511f565b612d0f565b80806122d59061534d565b9150506122ae565b505050565b6122ea612d07565b73ffffffffffffffffffffffffffffffffffffffff16612308611ef4565b73ffffffffffffffffffffffffffffffffffffffff161461235e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235590614e21565b60405180910390fd5b80600e9080519060200190612374929190613f13565b5050565b61238a612383612d07565b8383613252565b5050565b612396612d07565b73ffffffffffffffffffffffffffffffffffffffff166123b4611ef4565b73ffffffffffffffffffffffffffffffffffffffff161461240a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240190614e21565b60405180910390fd5b601c60006124189190613e52565b8181601c9190612429929190613e73565b505050565b60195481565b60105481565b6000806000905060005b601c8054905081101561253e576000601c828154811061246757612466615483565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b81526004016124cd9190614b5b565b60206040518083038186803b1580156124e557600080fd5b505afa1580156124f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251d9190614477565b83612528919061511f565b92505080806125369061534d565b915050612444565b5080915050919050565b612559612553612d07565b83612e52565b612598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258f90614f41565b60405180910390fd5b6125a4848484846133bf565b50505050565b6125b2612d07565b73ffffffffffffffffffffffffffffffffffffffff166125d0611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614612626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261d90614e21565b60405180910390fd5b8060198190555050565b601d5481565b61263e612d07565b73ffffffffffffffffffffffffffffffffffffffff1661265c611ef4565b73ffffffffffffffffffffffffffffffffffffffff16146126b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a990614e21565b60405180910390fd5b600083116126f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ec90614fc1565b60405180910390fd5b60006126ff61136b565b90506010548482612710919061511f565b1115612751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274890614e61565b60405180910390fd5b60006001905060005b848490508110156127e4576000600190505b8681116127d0576127af86868481811061278957612788615483565b5b905060200201602081019061279e919061416a565b84866127aa919061511f565b612d0f565b82806127ba9061534d565b93505080806127c89061534d565b91505061276c565b5080806127dc9061534d565b91505061275a565b505050505050565b60606127f782612d2d565b612836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282d90614d61565b60405180910390fd5b600061284061341b565b905060145483111580612866575060011515601560009054906101000a900460ff161515145b156128bf57600081511161288957604051806020016040528060008152506128b7565b80612893846134ad565b600d6040516020016128a793929190614b15565b6040516020818303038152906040525b91505061294e565b600e80546128cc906152ea565b80601f01602080910402602001604051908101604052809291908181526020018280546128f8906152ea565b80156129455780601f1061291a57610100808354040283529160200191612945565b820191906000526020600020905b81548152906001019060200180831161292857829003601f168201915b50505050509150505b919050565b60115481565b612961612d07565b73ffffffffffffffffffffffffffffffffffffffff1661297f611ef4565b73ffffffffffffffffffffffffffffffffffffffff16146129d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cc90614e21565b60405180910390fd5b80600d90805190602001906129eb929190613f13565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60185481565b612a91612d07565b73ffffffffffffffffffffffffffffffffffffffff16612aaf611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614612b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afc90614e21565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6c90614c81565b60405180910390fd5b612b7e8161318c565b50565b60145481565b612b8f612d07565b73ffffffffffffffffffffffffffffffffffffffff16612bad611ef4565b73ffffffffffffffffffffffffffffffffffffffff1614612c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfa90614e21565b60405180910390fd5b8060148190555050565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cf057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d005750612cff8261360e565b5b9050919050565b600033905090565b612d29828260405180602001604052806000815250613678565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e0c83611cef565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e5d82612d2d565b612e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9390614d41565b60405180910390fd5b6000612ea783611cef565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f1657508373ffffffffffffffffffffffffffffffffffffffff16612efe84611135565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f275750612f2681856129ef565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f5082611cef565b73ffffffffffffffffffffffffffffffffffffffff1614612fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9d90614e41565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300d90614ce1565b60405180910390fd5b6130218383836136d3565b61302c600082612d99565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461307c9190615200565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130d3919061511f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b890614d01565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516133b29190614be4565b60405180910390a3505050565b6133ca848484612f30565b6133d6848484846137e7565b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340c90614c61565b60405180910390fd5b50505050565b6060600c805461342a906152ea565b80601f0160208091040260200160405190810160405280929190818152602001828054613456906152ea565b80156134a35780601f10613478576101008083540402835291602001916134a3565b820191906000526020600020905b81548152906001019060200180831161348657829003601f168201915b5050505050905090565b606060008214156134f5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613609565b600082905060005b600082146135275780806135109061534d565b915050600a826135209190615175565b91506134fd565b60008167ffffffffffffffff811115613543576135426154b2565b5b6040519080825280601f01601f1916602001820160405280156135755781602001600182028036833780820191505090505b5090505b600085146136025760018261358e9190615200565b9150600a8561359d9190615396565b60306135a9919061511f565b60f81b8183815181106135bf576135be615483565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135fb9190615175565b9450613579565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613682838361397e565b61368f60008484846137e7565b6136ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c590614c61565b60405180910390fd5b505050565b6136de838383612c20565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156137215761371c81613b4c565b613760565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461375f5761375e8382613b95565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137a35761379e81613d02565b6137e2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146137e1576137e08282613dd3565b5b5b505050565b60006138088473ffffffffffffffffffffffffffffffffffffffff16612c0d565b15613971578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613831612d07565b8786866040518563ffffffff1660e01b81526004016138539493929190614b76565b602060405180830381600087803b15801561386d57600080fd5b505af192505050801561389e57506040513d601f19601f8201168201806040525081019061389b91906143d4565b60015b613921573d80600081146138ce576040519150601f19603f3d011682016040523d82523d6000602084013e6138d3565b606091505b50600081511415613919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391090614c61565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613976565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139e590614de1565b60405180910390fd5b6139f781612d2d565b15613a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2e90614cc1565b60405180910390fd5b613a43600083836136d3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a93919061511f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613ba284611db4565b613bac9190615200565b9050600060076000848152602001908152602001600020549050818114613c91576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613d169190615200565b9050600060096000848152602001908152602001600020549050600060088381548110613d4657613d45615483565b5b906000526020600020015490508060088381548110613d6857613d67615483565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613db757613db6615454565b5b6001900381819060005260206000200160009055905550505050565b6000613dde83611db4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b5080546000825590600052602060002090810190613e709190613f99565b50565b828054828255906000526020600020908101928215613f02579160200282015b82811115613f0157823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613e93565b5b509050613f0f9190613f99565b5090565b828054613f1f906152ea565b90600052602060002090601f016020900481019282613f415760008555613f88565b82601f10613f5a57805160ff1916838001178555613f88565b82800160010185558215613f88579182015b82811115613f87578251825591602001919060010190613f6c565b5b509050613f959190613f99565b5090565b5b80821115613fb2576000816000905550600101613f9a565b5090565b6000613fc9613fc484615021565b614ffc565b905082815260208101848484011115613fe557613fe46154f0565b5b613ff08482856152a8565b509392505050565b600061400b61400684615052565b614ffc565b905082815260208101848484011115614027576140266154f0565b5b6140328482856152a8565b509392505050565b60008135905061404981615c1b565b92915050565b60008083601f840112614065576140646154e6565b5b8235905067ffffffffffffffff811115614082576140816154e1565b5b60208301915083602082028301111561409e5761409d6154eb565b5b9250929050565b6000813590506140b481615c32565b92915050565b6000813590506140c981615c49565b92915050565b6000815190506140de81615c49565b92915050565b600082601f8301126140f9576140f86154e6565b5b8135614109848260208601613fb6565b91505092915050565b600082601f830112614127576141266154e6565b5b8135614137848260208601613ff8565b91505092915050565b60008135905061414f81615c60565b92915050565b60008151905061416481615c60565b92915050565b6000602082840312156141805761417f6154fa565b5b600061418e8482850161403a565b91505092915050565b600080604083850312156141ae576141ad6154fa565b5b60006141bc8582860161403a565b92505060206141cd8582860161403a565b9150509250929050565b6000806000606084860312156141f0576141ef6154fa565b5b60006141fe8682870161403a565b935050602061420f8682870161403a565b925050604061422086828701614140565b9150509250925092565b60008060008060808587031215614244576142436154fa565b5b60006142528782880161403a565b94505060206142638782880161403a565b935050604061427487828801614140565b925050606085013567ffffffffffffffff811115614295576142946154f5565b5b6142a1878288016140e4565b91505092959194509250565b600080604083850312156142c4576142c36154fa565b5b60006142d28582860161403a565b92505060206142e3858286016140a5565b9150509250929050565b60008060408385031215614304576143036154fa565b5b60006143128582860161403a565b925050602061432385828601614140565b9150509250929050565b60008060208385031215614344576143436154fa565b5b600083013567ffffffffffffffff811115614362576143616154f5565b5b61436e8582860161404f565b92509250509250929050565b6000602082840312156143905761438f6154fa565b5b600061439e848285016140a5565b91505092915050565b6000602082840312156143bd576143bc6154fa565b5b60006143cb848285016140ba565b91505092915050565b6000602082840312156143ea576143e96154fa565b5b60006143f8848285016140cf565b91505092915050565b600060208284031215614417576144166154fa565b5b600082013567ffffffffffffffff811115614435576144346154f5565b5b61444184828501614112565b91505092915050565b6000602082840312156144605761445f6154fa565b5b600061446e84828501614140565b91505092915050565b60006020828403121561448d5761448c6154fa565b5b600061449b84828501614155565b91505092915050565b6000806000604084860312156144bd576144bc6154fa565b5b60006144cb86828701614140565b935050602084013567ffffffffffffffff8111156144ec576144eb6154f5565b5b6144f88682870161404f565b92509250509250925092565b60006145108383614af7565b60208301905092915050565b61452581615234565b82525050565b6000614536826150a8565b61454081856150d6565b935061454b83615083565b8060005b8381101561457c5781516145638882614504565b975061456e836150c9565b92505060018101905061454f565b5085935050505092915050565b61459281615246565b82525050565b60006145a3826150b3565b6145ad81856150e7565b93506145bd8185602086016152b7565b6145c6816154ff565b840191505092915050565b60006145dc826150be565b6145e68185615103565b93506145f68185602086016152b7565b6145ff816154ff565b840191505092915050565b6000614615826150be565b61461f8185615114565b935061462f8185602086016152b7565b80840191505092915050565b60008154614648816152ea565b6146528186615114565b9450600182166000811461466d576001811461467e576146b1565b60ff198316865281860193506146b1565b61468785615093565b60005b838110156146a95781548189015260018201915060208101905061468a565b838801955050505b50505092915050565b60006146c7600c83615103565b91506146d282615510565b602082019050919050565b60006146ea602b83615103565b91506146f582615539565b604082019050919050565b600061470d603283615103565b915061471882615588565b604082019050919050565b6000614730602683615103565b915061473b826155d7565b604082019050919050565b6000614753600b83615103565b915061475e82615626565b602082019050919050565b6000614776601c83615103565b91506147818261564f565b602082019050919050565b6000614799602483615103565b91506147a482615678565b604082019050919050565b60006147bc601983615103565b91506147c7826156c7565b602082019050919050565b60006147df602683615103565b91506147ea826156f0565b604082019050919050565b6000614802602c83615103565b915061480d8261573f565b604082019050919050565b6000614825601b83615103565b91506148308261578e565b602082019050919050565b6000614848603883615103565b9150614853826157b7565b604082019050919050565b600061486b602a83615103565b915061487682615806565b604082019050919050565b600061488e602983615103565b915061489982615855565b604082019050919050565b60006148b1602083615103565b91506148bc826158a4565b602082019050919050565b60006148d4602c83615103565b91506148df826158cd565b604082019050919050565b60006148f7602083615103565b91506149028261591c565b602082019050919050565b600061491a602983615103565b915061492582615945565b604082019050919050565b600061493d601683615103565b915061494882615994565b602082019050919050565b6000614960600d83615103565b915061496b826159bd565b602082019050919050565b6000614983601283615103565b915061498e826159e6565b602082019050919050565b60006149a6601583615103565b91506149b182615a0f565b602082019050919050565b60006149c9602183615103565b91506149d482615a38565b604082019050919050565b60006149ec602283615103565b91506149f782615a87565b604082019050919050565b6000614a0f6000836150f8565b9150614a1a82615ad6565b600082019050919050565b6000614a32601283615103565b9150614a3d82615ad9565b602082019050919050565b6000614a55603183615103565b9150614a6082615b02565b604082019050919050565b6000614a78602c83615103565b9150614a8382615b51565b604082019050919050565b6000614a9b601c83615103565b9150614aa682615ba0565b602082019050919050565b6000614abe601f83615103565b9150614ac982615bc9565b602082019050919050565b6000614ae1600e83615103565b9150614aec82615bf2565b602082019050919050565b614b008161529e565b82525050565b614b0f8161529e565b82525050565b6000614b21828661460a565b9150614b2d828561460a565b9150614b39828461463b565b9150819050949350505050565b6000614b5182614a02565b9150819050919050565b6000602082019050614b70600083018461451c565b92915050565b6000608082019050614b8b600083018761451c565b614b98602083018661451c565b614ba56040830185614b06565b8181036060830152614bb78184614598565b905095945050505050565b60006020820190508181036000830152614bdc818461452b565b905092915050565b6000602082019050614bf96000830184614589565b92915050565b60006020820190508181036000830152614c1981846145d1565b905092915050565b60006020820190508181036000830152614c3a816146ba565b9050919050565b60006020820190508181036000830152614c5a816146dd565b9050919050565b60006020820190508181036000830152614c7a81614700565b9050919050565b60006020820190508181036000830152614c9a81614723565b9050919050565b60006020820190508181036000830152614cba81614746565b9050919050565b60006020820190508181036000830152614cda81614769565b9050919050565b60006020820190508181036000830152614cfa8161478c565b9050919050565b60006020820190508181036000830152614d1a816147af565b9050919050565b60006020820190508181036000830152614d3a816147d2565b9050919050565b60006020820190508181036000830152614d5a816147f5565b9050919050565b60006020820190508181036000830152614d7a81614818565b9050919050565b60006020820190508181036000830152614d9a8161483b565b9050919050565b60006020820190508181036000830152614dba8161485e565b9050919050565b60006020820190508181036000830152614dda81614881565b9050919050565b60006020820190508181036000830152614dfa816148a4565b9050919050565b60006020820190508181036000830152614e1a816148c7565b9050919050565b60006020820190508181036000830152614e3a816148ea565b9050919050565b60006020820190508181036000830152614e5a8161490d565b9050919050565b60006020820190508181036000830152614e7a81614930565b9050919050565b60006020820190508181036000830152614e9a81614953565b9050919050565b60006020820190508181036000830152614eba81614976565b9050919050565b60006020820190508181036000830152614eda81614999565b9050919050565b60006020820190508181036000830152614efa816149bc565b9050919050565b60006020820190508181036000830152614f1a816149df565b9050919050565b60006020820190508181036000830152614f3a81614a25565b9050919050565b60006020820190508181036000830152614f5a81614a48565b9050919050565b60006020820190508181036000830152614f7a81614a6b565b9050919050565b60006020820190508181036000830152614f9a81614a8e565b9050919050565b60006020820190508181036000830152614fba81614ab1565b9050919050565b60006020820190508181036000830152614fda81614ad4565b9050919050565b6000602082019050614ff66000830184614b06565b92915050565b6000615006615017565b9050615012828261531c565b919050565b6000604051905090565b600067ffffffffffffffff82111561503c5761503b6154b2565b5b615045826154ff565b9050602081019050919050565b600067ffffffffffffffff82111561506d5761506c6154b2565b5b615076826154ff565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061512a8261529e565b91506151358361529e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561516a576151696153c7565b5b828201905092915050565b60006151808261529e565b915061518b8361529e565b92508261519b5761519a6153f6565b5b828204905092915050565b60006151b18261529e565b91506151bc8361529e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151f5576151f46153c7565b5b828202905092915050565b600061520b8261529e565b91506152168361529e565b925082821015615229576152286153c7565b5b828203905092915050565b600061523f8261527e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152d55780820151818401526020810190506152ba565b838111156152e4576000848401525b50505050565b6000600282049050600182168061530257607f821691505b6020821081141561531657615315615425565b5b50919050565b615325826154ff565b810181811067ffffffffffffffff82111715615344576153436154b2565b5b80604052505050565b60006153588261529e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561538b5761538a6153c7565b5b600182019050919050565b60006153a18261529e565b91506153ac8361529e565b9250826153bc576153bb6153f6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f636c61696d207061757365640000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f73616c6520706175736564000000000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f6d6178204e4654207065722077686974656c697374206164647265737320657860008201527f6365656465640000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f6d6178206e6674206c696d697420657863656564656400000000000000000000600082015250565b7f6e6f74207175616c696669656400000000000000000000000000000000000000600082015250565b7f77686974656c6973742072657175697265640000000000000000000000000000600082015250565b7f77686974656c697374206d696e74207061757365640000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f796f752063616e2061646f70742061206d6178696d756d206f66203230206e6660008201527f7473000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f6d6178206e667420706572206164647265737320657863656564656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f6174206c656173742031206e6674000000000000000000000000000000000000600082015250565b615c2481615234565b8114615c2f57600080fd5b50565b615c3b81615246565b8114615c4657600080fd5b50565b615c5281615252565b8114615c5d57600080fd5b50565b615c698161529e565b8114615c7457600080fd5b5056fea2646970667358221220cbd8d5fdfdf72f3fae13f8c25d8207cf0e7b8374e7431a905ba2cd6b37f10e5064736f6c63430008070033

Deployed Bytecode Sourcemap

49093:6775:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42875:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55618:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54491:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50835:718;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30409:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31968:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54140:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31491:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49983:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43515:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54570:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49810:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32718:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54764:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55070:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43183:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51804:674;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55223:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51559:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55720:145;;;:::i;:::-;;33128:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52793:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43705:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54260:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30103:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49582:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29833:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9640:103;;;;;;;;;;;;;:::i;:::-;;8989:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54675:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54052:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30578:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49368:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49520:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50276:553;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54941:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32261:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55463:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49763:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49407:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52484:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33384:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55357:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49949:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53604:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53129:469;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49444:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54364:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32487:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49721:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9898:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49550:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54847:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42875:224;42977:4;43016:35;43001:50;;;:11;:50;;;;:90;;;;43055:36;43079:11;43055:23;:36::i;:::-;43001:90;42994:97;;42875:224;;;:::o;55618:96::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55698:10:::1;55685;:23;;;;55618:96:::0;:::o;54491:73::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54552:6:::1;54543;;:15;;;;;;;;;;;;;;;;;;54491:73:::0;:::o;50835:718::-;4032:1;4628:7;;:19;;4620:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4032:1;4761:7;:18;;;;50922:19:::1;;;;;;;;;;;50921:20;50913:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;50976:14;50993:13;:11;:13::i;:::-;50976:30;;51044:9;;51030:10;51021:6;:19;;;;:::i;:::-;:32;;51013:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;51097:25;51111:10;51097:13;:25::i;:::-;51089:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;51152:24;51179:23;:35;51203:10;51179:35;;;;;;;;;;;;;;;;51152:62;;51262:18;;51248:10;51229:16;:29;;;;:::i;:::-;:51;;51221:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;51368:10;51351:14;;:27;;;;:::i;:::-;51338:9;:40;;51330:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;51415:9;51427:1;51415:13;;51410:138;51435:10;51430:1;:15;51410:138;;51461:23;:35;51485:10;51461:35;;;;;;;;;;;;;;;;:37;;;;;;;;;:::i;:::-;;;;;;51507:33;51517:10;51538:1;51529:6;:10;;;;:::i;:::-;51507:9;:33::i;:::-;51447:3;;;;;:::i;:::-;;;;51410:138;;;;50906:647;;3988:1:::0;4940:7;:22;;;;50835:718;:::o;30409:100::-;30463:13;30496:5;30489:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30409:100;:::o;31968:221::-;32044:7;32072:16;32080:7;32072;:16::i;:::-;32064:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32157:15;:24;32173:7;32157:24;;;;;;;;;;;;;;;;;;;;;32150:31;;31968:221;;;:::o;54140:114::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54232:16:::1;54216:13;:32;;;;54140:114:::0;:::o;31491:411::-;31572:13;31588:23;31603:7;31588:14;:23::i;:::-;31572:39;;31636:5;31630:11;;:2;:11;;;;31622:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31730:5;31714:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31739:37;31756:5;31763:12;:10;:12::i;:::-;31739:16;:37::i;:::-;31714:62;31692:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31873:21;31882:2;31886:7;31873:8;:21::i;:::-;31561:341;31491:411;;:::o;49983:30::-;;;;;;;;;;;;;:::o;43515:113::-;43576:7;43603:10;:17;;;;43596:24;;43515:113;:::o;54570:99::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54657:6:::1;54635:19;;:28;;;;;;;;;;;;;;;;;;54570:99:::0;:::o;49810:38::-;;;;;;;;;;;;;:::o;32718:339::-;32913:41;32932:12;:10;:12::i;:::-;32946:7;32913:18;:41::i;:::-;32905:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33021:28;33031:4;33037:2;33041:7;33021:9;:28::i;:::-;32718:339;;;:::o;54764:77::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54829:6:::1;54820;;:15;;;;;;;;;;;;;;;;;;54764:77:::0;:::o;55070:147::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55154:21:::1;;55147:28;;;;:::i;:::-;55206:5;;55182:21;:29;;;;;;;:::i;:::-;;55070:147:::0;;:::o;43183:256::-;43280:7;43316:23;43333:5;43316:16;:23::i;:::-;43308:5;:31;43300:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43405:12;:19;43418:5;43405:19;;;;;;;;;;;;;;;:26;43425:5;43405:26;;;;;;;;;;;;43398:33;;43183:256;;;;:::o;51804:674::-;4032:1;4628:7;;:19;;4620:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4032:1;4761:7;:18;;;;51875:11:::1;;;;;;;;;;;51874:12;51866:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;51910:14;51927:13;:11;:13::i;:::-;51910:30;;51978:9;;51964:10;51955:6;:19;;;;:::i;:::-;:32;;51947:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52023:15;52041:24;52054:10;52041:12;:24::i;:::-;52023:42;;52093:1;52080:10;:14;52072:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;52138:1;52125:10;;:14;52121:60;;;52163:10;;52150:23;;52121:60;52189:24;52216:15;:27;52232:10;52216:27;;;;;;;;;;;;;;;;52189:54;;52291:10;52277;52258:16;:29;;;;:::i;:::-;:43;;52250:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;52348:9;52360:1;52348:13;;52343:130;52368:10;52363:1;:15;52343:130;;52394:15;:27;52410:10;52394:27;;;;;;;;;;;;;;;;:29;;;;;;;;;:::i;:::-;;;;;;52432:33;52442:10;52463:1;52454:6;:10;;;;:::i;:::-;52432:9;:33::i;:::-;52380:3;;;;;:::i;:::-;;;;52343:130;;;;51859:619;;;3988:1:::0;4940:7;:22;;;;51804:674;:::o;55223:128::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55327:18:::1;55306;:39;;;;55223:128:::0;:::o;51559:239::-;51617:4;51635:6;51644:1;51635:10;;51630:144;51651:21;:28;;;;51647:1;:32;51630:144;;;51727:4;51699:32;;:21;51721:1;51699:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:32;;;51695:72;;;51753:4;51746:11;;;;;51695:72;51681:3;;;;;:::i;:::-;;;;51630:144;;;;51787:5;51780:12;;51559:239;;;;:::o;55720:145::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55773:7:::1;55794;:5;:7::i;:::-;55786:21;;55815;55786:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55772:69;;;55856:2;55848:11;;;::::0;::::1;;55765:100;55720:145::o:0;33128:185::-;33266:39;33283:4;33289:2;33293:7;33266:39;;;;;;;;;;;;:16;:39::i;:::-;33128:185;;;:::o;52793:330::-;52852:16;52880:23;52906:16;52916:5;52906:9;:16::i;:::-;52880:42;;52929:25;52971:15;52957:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52929:58;;52999:9;52994:102;53014:15;53010:1;:19;52994:102;;;53059:29;53079:5;53086:1;53059:19;:29::i;:::-;53045:8;53054:1;53045:11;;;;;;;;:::i;:::-;;;;;;;:43;;;;;53031:3;;;;;:::i;:::-;;;;52994:102;;;;53109:8;53102:15;;;;52793:330;;;:::o;43705:233::-;43780:7;43816:30;:28;:30::i;:::-;43808:5;:38;43800:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43913:10;43924:5;43913:17;;;;;;;;:::i;:::-;;;;;;;;;;43906:24;;43705:233;;;:::o;54260:98::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54342:10:::1;54330:9;:22;;;;;;;;;;;;:::i;:::-;;54260:98:::0;:::o;30103:239::-;30175:7;30195:13;30211:7;:16;30219:7;30211:16;;;;;;;;;;;;;;;;;;;;;30195:32;;30263:1;30246:19;;:5;:19;;;;30238:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30329:5;30322:12;;;30103:239;;;:::o;49582:26::-;;;;;;;;;;;;;:::o;29833:208::-;29905:7;29950:1;29933:19;;:5;:19;;;;29925:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30017:9;:16;30027:5;30017:16;;;;;;;;;;;;;;;;30010:23;;29833:208;;;:::o;9640:103::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9705:30:::1;9732:1;9705:18;:30::i;:::-;9640:103::o:0;8989:87::-;9035:7;9062:6;;;;;;;;;;;9055:13;;8989:87;:::o;54675:83::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54746:6:::1;54732:11;;:20;;;;;;;;;;;;;;;;;;54675:83:::0;:::o;54052:82::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54120:8:::1;54112:5;:16;;;;54052:82:::0;:::o;30578:104::-;30634:13;30667:7;30660:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30578:104;:::o;49368:34::-;;;;:::o;49520:25::-;;;;;;;;;;;;;:::o;50276:553::-;50353:1;50340:10;:14;50332:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;50382:14;50399:13;:11;:13::i;:::-;50382:30;;50450:9;;50436:10;50427:6;:19;;;;:::i;:::-;:32;;50419:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;50513:7;:5;:7::i;:::-;50499:21;;:10;:21;;;50495:229;;50540:6;;;;;;;;;;;50539:7;50531:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;50593:13;;50579:10;:27;;50571:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;50683:10;50675:5;;:18;;;;:::i;:::-;50662:9;:31;;50654:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50495:229;50737:9;50749:1;50737:13;;50732:92;50757:10;50752:1;:15;50732:92;;50783:33;50793:10;50814:1;50805:6;:10;;;;:::i;:::-;50783:9;:33::i;:::-;50769:3;;;;;:::i;:::-;;;;50732:92;;;;50325:504;50276:553;:::o;54941:123::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55043:15:::1;55024:16;:34;;;;;;;;;;;;:::i;:::-;;54941:123:::0;:::o;32261:155::-;32356:52;32375:12;:10;:12::i;:::-;32389:8;32399;32356:18;:52::i;:::-;32261:155;;:::o;55463:149::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55553:17:::1;;55546:24;;;;:::i;:::-;55597:9;;55577:17;:29;;;;;;;:::i;:::-;;55463:149:::0;;:::o;49763:42::-;;;;:::o;49407:32::-;;;;:::o;52484:303::-;52542:4;52555:15;52573:1;52555:19;;52586:6;52581:177;52602:17;:24;;;;52598:1;:28;52581:177;;;52642:22;52674:17;52692:1;52674:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52642:53;;52718:15;:25;;;52744:5;52718:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52704:46;;;;;:::i;:::-;;;52633:125;52628:3;;;;;:::i;:::-;;;;52581:177;;;;52771:10;52764:17;;;52484:303;;;:::o;33384:328::-;33559:41;33578:12;:10;:12::i;:::-;33592:7;33559:18;:41::i;:::-;33551:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33665:39;33679:4;33685:2;33689:7;33698:5;33665:13;:39::i;:::-;33384:328;;;;:::o;55357:100::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55443:8:::1;55426:14;:25;;;;55357:100:::0;:::o;49949:29::-;;;;:::o;53604:442::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53707:1:::1;53698:6;:10;53690:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;53734:14;53751:13;:11;:13::i;:::-;53734:30;;53798:9;;53788:6;53779;:15;;;;:::i;:::-;:28;;53771:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;53843:11;53857:1;53843:15;;53870:6;53865:176;53886:11;;:18;;53882:1;:22;53865:176;;;53925:9;53937:1;53925:13;;53920:114;53945:6;53940:1;:11;53920:114;;53969:39;53979:11;;53991:1;53979:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;54004:3;53995:6;:12;;;;:::i;:::-;53969:9;:39::i;:::-;54019:5;;;;;:::i;:::-;;;;53953:3;;;;;:::i;:::-;;;;53920:114;;;;53906:3;;;;;:::i;:::-;;;;53865:176;;;;53683:363;;53604:442:::0;;;:::o;53129:469::-;53202:13;53235:16;53243:7;53235;:16::i;:::-;53227:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;53292:28;53323:10;:8;:10::i;:::-;53292:41;;53355:8;;53344:7;:19;;:37;;;;53377:4;53367:14;;:6;;;;;;;;;;;:14;;;53344:37;53340:253;;;53432:1;53407:14;53401:28;:32;:138;;;;;;;;;;;;;;;;;53471:14;53487:18;:7;:16;:18::i;:::-;53507:14;53454:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53401:138;53394:145;;;;;53340:253;53569:16;53562:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53129:469;;;;:::o;49444:33::-;;;;:::o;54364:121::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54463:16:::1;54446:14;:33;;;;;;;;;;;;:::i;:::-;;54364:121:::0;:::o;32487:164::-;32584:4;32608:18;:25;32627:5;32608:25;;;;;;;;;;;;;;;:35;32634:8;32608:35;;;;;;;;;;;;;;;;;;;;;;;;;32601:42;;32487:164;;;;:::o;49721:37::-;;;;:::o;9898:201::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10007:1:::1;9987:22;;:8;:22;;;;9979:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10063:28;10082:8;10063:18;:28::i;:::-;9898:201:::0;:::o;49550:27::-;;;;:::o;54847:88::-;9220:12;:10;:12::i;:::-;9209:23;;:7;:5;:7::i;:::-;:23;;;9201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54921:8:::1;54910;:19;;;;54847:88:::0;:::o;11255:387::-;11315:4;11523:12;11590:7;11578:20;11570:28;;11633:1;11626:4;:8;11619:15;;;11255:387;;;:::o;41771:126::-;;;;:::o;29464:305::-;29566:4;29618:25;29603:40;;;:11;:40;;;;:105;;;;29675:33;29660:48;;;:11;:48;;;;29603:105;:158;;;;29725:36;29749:11;29725:23;:36::i;:::-;29603:158;29583:178;;29464:305;;;:::o;7736:98::-;7789:7;7816:10;7809:17;;7736:98;:::o;36206:110::-;36282:26;36292:2;36296:7;36282:26;;;;;;;;;;;;:9;:26::i;:::-;36206:110;;:::o;35222:127::-;35287:4;35339:1;35311:30;;:7;:16;35319:7;35311:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35304:37;;35222:127;;;:::o;39204:174::-;39306:2;39279:15;:24;39295:7;39279:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39362:7;39358:2;39324:46;;39333:23;39348:7;39333:14;:23::i;:::-;39324:46;;;;;;;;;;;;39204:174;;:::o;35516:348::-;35609:4;35634:16;35642:7;35634;:16::i;:::-;35626:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35710:13;35726:23;35741:7;35726:14;:23::i;:::-;35710:39;;35779:5;35768:16;;:7;:16;;;:51;;;;35812:7;35788:31;;:20;35800:7;35788:11;:20::i;:::-;:31;;;35768:51;:87;;;;35823:32;35840:5;35847:7;35823:16;:32::i;:::-;35768:87;35760:96;;;35516:348;;;;:::o;38508:578::-;38667:4;38640:31;;:23;38655:7;38640:14;:23::i;:::-;:31;;;38632:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38750:1;38736:16;;:2;:16;;;;38728:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38806:39;38827:4;38833:2;38837:7;38806:20;:39::i;:::-;38910:29;38927:1;38931:7;38910:8;:29::i;:::-;38971:1;38952:9;:15;38962:4;38952:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39000:1;38983:9;:13;38993:2;38983:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39031:2;39012:7;:16;39020:7;39012:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39070:7;39066:2;39051:27;;39060:4;39051:27;;;;;;;;;;;;38508:578;;;:::o;10259:191::-;10333:16;10352:6;;;;;;;;;;;10333:25;;10378:8;10369:6;;:17;;;;;;;;;;;;;;;;;;10433:8;10402:40;;10423:8;10402:40;;;;;;;;;;;;10322:128;10259:191;:::o;39520:315::-;39675:8;39666:17;;:5;:17;;;;39658:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39762:8;39724:18;:25;39743:5;39724:25;;;;;;;;;;;;;;;:35;39750:8;39724:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;39808:8;39786:41;;39801:5;39786:41;;;39818:8;39786:41;;;;;;:::i;:::-;;;;;;;;39520:315;;;:::o;34594:::-;34751:28;34761:4;34767:2;34771:7;34751:9;:28::i;:::-;34798:48;34821:4;34827:2;34831:7;34840:5;34798:22;:48::i;:::-;34790:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34594:315;;;;:::o;50153:104::-;50213:13;50242:9;50235:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50153:104;:::o;5320:723::-;5376:13;5606:1;5597:5;:10;5593:53;;;5624:10;;;;;;;;;;;;;;;;;;;;;5593:53;5656:12;5671:5;5656:20;;5687:14;5712:78;5727:1;5719:4;:9;5712:78;;5745:8;;;;;:::i;:::-;;;;5776:2;5768:10;;;;;:::i;:::-;;;5712:78;;;5800:19;5832:6;5822:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:39;;5850:154;5866:1;5857:5;:10;5850:154;;5894:1;5884:11;;;;;:::i;:::-;;;5961:2;5953:5;:10;;;;:::i;:::-;5940:2;:24;;;;:::i;:::-;5927:39;;5910:6;5917;5910:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5990:2;5981:11;;;;;:::i;:::-;;;5850:154;;;6028:6;6014:21;;;;;5320:723;;;;:::o;21298:157::-;21383:4;21422:25;21407:40;;;:11;:40;;;;21400:47;;21298:157;;;:::o;36543:321::-;36673:18;36679:2;36683:7;36673:5;:18::i;:::-;36724:54;36755:1;36759:2;36763:7;36772:5;36724:22;:54::i;:::-;36702:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36543:321;;;:::o;44551:589::-;44695:45;44722:4;44728:2;44732:7;44695:26;:45::i;:::-;44773:1;44757:18;;:4;:18;;;44753:187;;;44792:40;44824:7;44792:31;:40::i;:::-;44753:187;;;44862:2;44854:10;;:4;:10;;;44850:90;;44881:47;44914:4;44920:7;44881:32;:47::i;:::-;44850:90;44753:187;44968:1;44954:16;;:2;:16;;;44950:183;;;44987:45;45024:7;44987:36;:45::i;:::-;44950:183;;;45060:4;45054:10;;:2;:10;;;45050:83;;45081:40;45109:2;45113:7;45081:27;:40::i;:::-;45050:83;44950:183;44551:589;;;:::o;40400:799::-;40555:4;40576:15;:2;:13;;;:15::i;:::-;40572:620;;;40628:2;40612:36;;;40649:12;:10;:12::i;:::-;40663:4;40669:7;40678:5;40612:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40608:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40871:1;40854:6;:13;:18;40850:272;;;40897:60;;;;;;;;;;:::i;:::-;;;;;;;;40850:272;41072:6;41066:13;41057:6;41053:2;41049:15;41042:38;40608:529;40745:41;;;40735:51;;;:6;:51;;;;40728:58;;;;;40572:620;41176:4;41169:11;;40400:799;;;;;;;:::o;37200:382::-;37294:1;37280:16;;:2;:16;;;;37272:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37353:16;37361:7;37353;:16::i;:::-;37352:17;37344:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37415:45;37444:1;37448:2;37452:7;37415:20;:45::i;:::-;37490:1;37473:9;:13;37483:2;37473:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37521:2;37502:7;:16;37510:7;37502:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37566:7;37562:2;37541:33;;37558:1;37541:33;;;;;;;;;;;;37200:382;;:::o;45863:164::-;45967:10;:17;;;;45940:15;:24;45956:7;45940:24;;;;;;;;;;;:44;;;;45995:10;46011:7;45995:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45863:164;:::o;46654:988::-;46920:22;46970:1;46945:22;46962:4;46945:16;:22::i;:::-;:26;;;;:::i;:::-;46920:51;;46982:18;47003:17;:26;47021:7;47003:26;;;;;;;;;;;;46982:47;;47150:14;47136:10;:28;47132:328;;47181:19;47203:12;:18;47216:4;47203:18;;;;;;;;;;;;;;;:34;47222:14;47203:34;;;;;;;;;;;;47181:56;;47287:11;47254:12;:18;47267:4;47254:18;;;;;;;;;;;;;;;:30;47273:10;47254:30;;;;;;;;;;;:44;;;;47404:10;47371:17;:30;47389:11;47371:30;;;;;;;;;;;:43;;;;47166:294;47132:328;47556:17;:26;47574:7;47556:26;;;;;;;;;;;47549:33;;;47600:12;:18;47613:4;47600:18;;;;;;;;;;;;;;;:34;47619:14;47600:34;;;;;;;;;;;47593:41;;;46735:907;;46654:988;;:::o;47937:1079::-;48190:22;48235:1;48215:10;:17;;;;:21;;;;:::i;:::-;48190:46;;48247:18;48268:15;:24;48284:7;48268:24;;;;;;;;;;;;48247:45;;48619:19;48641:10;48652:14;48641:26;;;;;;;;:::i;:::-;;;;;;;;;;48619:48;;48705:11;48680:10;48691;48680:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48816:10;48785:15;:28;48801:11;48785:28;;;;;;;;;;;:41;;;;48957:15;:24;48973:7;48957:24;;;;;;;;;;;48950:31;;;48992:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48008:1008;;;47937:1079;:::o;45441:221::-;45526:14;45543:20;45560:2;45543:16;:20::i;:::-;45526:37;;45601:7;45574:12;:16;45587:2;45574:16;;;;;;;;;;;;;;;:24;45591:6;45574:24;;;;;;;;;;;:34;;;;45648:6;45619:17;:26;45637:7;45619:26;;;;;;;;;;;:35;;;;45515:147;45441:221;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:143::-;2925:5;2956:6;2950:13;2941:22;;2972:33;2999:5;2972:33;:::i;:::-;2868:143;;;;:::o;3017:329::-;3076:6;3125:2;3113:9;3104:7;3100:23;3096:32;3093:119;;;3131:79;;:::i;:::-;3093:119;3251:1;3276:53;3321:7;3312:6;3301:9;3297:22;3276:53;:::i;:::-;3266:63;;3222:117;3017:329;;;;:::o;3352:474::-;3420:6;3428;3477:2;3465:9;3456:7;3452:23;3448:32;3445:119;;;3483:79;;:::i;:::-;3445:119;3603:1;3628:53;3673:7;3664:6;3653:9;3649:22;3628:53;:::i;:::-;3618:63;;3574:117;3730:2;3756:53;3801:7;3792:6;3781:9;3777:22;3756:53;:::i;:::-;3746:63;;3701:118;3352:474;;;;;:::o;3832:619::-;3909:6;3917;3925;3974:2;3962:9;3953:7;3949:23;3945:32;3942:119;;;3980:79;;:::i;:::-;3942:119;4100:1;4125:53;4170:7;4161:6;4150:9;4146:22;4125:53;:::i;:::-;4115:63;;4071:117;4227:2;4253:53;4298:7;4289:6;4278:9;4274:22;4253:53;:::i;:::-;4243:63;;4198:118;4355:2;4381:53;4426:7;4417:6;4406:9;4402:22;4381:53;:::i;:::-;4371:63;;4326:118;3832:619;;;;;:::o;4457:943::-;4552:6;4560;4568;4576;4625:3;4613:9;4604:7;4600:23;4596:33;4593:120;;;4632:79;;:::i;:::-;4593:120;4752:1;4777:53;4822:7;4813:6;4802:9;4798:22;4777:53;:::i;:::-;4767:63;;4723:117;4879:2;4905:53;4950:7;4941:6;4930:9;4926:22;4905:53;:::i;:::-;4895:63;;4850:118;5007:2;5033:53;5078:7;5069:6;5058:9;5054:22;5033:53;:::i;:::-;5023:63;;4978:118;5163:2;5152:9;5148:18;5135:32;5194:18;5186:6;5183:30;5180:117;;;5216:79;;:::i;:::-;5180:117;5321:62;5375:7;5366:6;5355:9;5351:22;5321:62;:::i;:::-;5311:72;;5106:287;4457:943;;;;;;;:::o;5406:468::-;5471:6;5479;5528:2;5516:9;5507:7;5503:23;5499:32;5496:119;;;5534:79;;:::i;:::-;5496:119;5654:1;5679:53;5724:7;5715:6;5704:9;5700:22;5679:53;:::i;:::-;5669:63;;5625:117;5781:2;5807:50;5849:7;5840:6;5829:9;5825:22;5807:50;:::i;:::-;5797:60;;5752:115;5406:468;;;;;:::o;5880:474::-;5948:6;5956;6005:2;5993:9;5984:7;5980:23;5976:32;5973:119;;;6011:79;;:::i;:::-;5973:119;6131:1;6156:53;6201:7;6192:6;6181:9;6177:22;6156:53;:::i;:::-;6146:63;;6102:117;6258:2;6284:53;6329:7;6320:6;6309:9;6305:22;6284:53;:::i;:::-;6274:63;;6229:118;5880:474;;;;;:::o;6360:559::-;6446:6;6454;6503:2;6491:9;6482:7;6478:23;6474:32;6471:119;;;6509:79;;:::i;:::-;6471:119;6657:1;6646:9;6642:17;6629:31;6687:18;6679:6;6676:30;6673:117;;;6709:79;;:::i;:::-;6673:117;6822:80;6894:7;6885:6;6874:9;6870:22;6822:80;:::i;:::-;6804:98;;;;6600:312;6360:559;;;;;:::o;6925:323::-;6981:6;7030:2;7018:9;7009:7;7005:23;7001:32;6998:119;;;7036:79;;:::i;:::-;6998:119;7156:1;7181:50;7223:7;7214:6;7203:9;7199:22;7181:50;:::i;:::-;7171:60;;7127:114;6925:323;;;;:::o;7254:327::-;7312:6;7361:2;7349:9;7340:7;7336:23;7332:32;7329:119;;;7367:79;;:::i;:::-;7329:119;7487:1;7512:52;7556:7;7547:6;7536:9;7532:22;7512:52;:::i;:::-;7502:62;;7458:116;7254:327;;;;:::o;7587:349::-;7656:6;7705:2;7693:9;7684:7;7680:23;7676:32;7673:119;;;7711:79;;:::i;:::-;7673:119;7831:1;7856:63;7911:7;7902:6;7891:9;7887:22;7856:63;:::i;:::-;7846:73;;7802:127;7587:349;;;;:::o;7942:509::-;8011:6;8060:2;8048:9;8039:7;8035:23;8031:32;8028:119;;;8066:79;;:::i;:::-;8028:119;8214:1;8203:9;8199:17;8186:31;8244:18;8236:6;8233:30;8230:117;;;8266:79;;:::i;:::-;8230:117;8371:63;8426:7;8417:6;8406:9;8402:22;8371:63;:::i;:::-;8361:73;;8157:287;7942:509;;;;:::o;8457:329::-;8516:6;8565:2;8553:9;8544:7;8540:23;8536:32;8533:119;;;8571:79;;:::i;:::-;8533:119;8691:1;8716:53;8761:7;8752:6;8741:9;8737:22;8716:53;:::i;:::-;8706:63;;8662:117;8457:329;;;;:::o;8792:351::-;8862:6;8911:2;8899:9;8890:7;8886:23;8882:32;8879:119;;;8917:79;;:::i;:::-;8879:119;9037:1;9062:64;9118:7;9109:6;9098:9;9094:22;9062:64;:::i;:::-;9052:74;;9008:128;8792:351;;;;:::o;9149:704::-;9244:6;9252;9260;9309:2;9297:9;9288:7;9284:23;9280:32;9277:119;;;9315:79;;:::i;:::-;9277:119;9435:1;9460:53;9505:7;9496:6;9485:9;9481:22;9460:53;:::i;:::-;9450:63;;9406:117;9590:2;9579:9;9575:18;9562:32;9621:18;9613:6;9610:30;9607:117;;;9643:79;;:::i;:::-;9607:117;9756:80;9828:7;9819:6;9808:9;9804:22;9756:80;:::i;:::-;9738:98;;;;9533:313;9149:704;;;;;:::o;9859:179::-;9928:10;9949:46;9991:3;9983:6;9949:46;:::i;:::-;10027:4;10022:3;10018:14;10004:28;;9859:179;;;;:::o;10044:118::-;10131:24;10149:5;10131:24;:::i;:::-;10126:3;10119:37;10044:118;;:::o;10198:732::-;10317:3;10346:54;10394:5;10346:54;:::i;:::-;10416:86;10495:6;10490:3;10416:86;:::i;:::-;10409:93;;10526:56;10576:5;10526:56;:::i;:::-;10605:7;10636:1;10621:284;10646:6;10643:1;10640:13;10621:284;;;10722:6;10716:13;10749:63;10808:3;10793:13;10749:63;:::i;:::-;10742:70;;10835:60;10888:6;10835:60;:::i;:::-;10825:70;;10681:224;10668:1;10665;10661:9;10656:14;;10621:284;;;10625:14;10921:3;10914:10;;10322:608;;;10198:732;;;;:::o;10936:109::-;11017:21;11032:5;11017:21;:::i;:::-;11012:3;11005:34;10936:109;;:::o;11051:360::-;11137:3;11165:38;11197:5;11165:38;:::i;:::-;11219:70;11282:6;11277:3;11219:70;:::i;:::-;11212:77;;11298:52;11343:6;11338:3;11331:4;11324:5;11320:16;11298:52;:::i;:::-;11375:29;11397:6;11375:29;:::i;:::-;11370:3;11366:39;11359:46;;11141:270;11051:360;;;;:::o;11417:364::-;11505:3;11533:39;11566:5;11533:39;:::i;:::-;11588:71;11652:6;11647:3;11588:71;:::i;:::-;11581:78;;11668:52;11713:6;11708:3;11701:4;11694:5;11690:16;11668:52;:::i;:::-;11745:29;11767:6;11745:29;:::i;:::-;11740:3;11736:39;11729:46;;11509:272;11417:364;;;;:::o;11787:377::-;11893:3;11921:39;11954:5;11921:39;:::i;:::-;11976:89;12058:6;12053:3;11976:89;:::i;:::-;11969:96;;12074:52;12119:6;12114:3;12107:4;12100:5;12096:16;12074:52;:::i;:::-;12151:6;12146:3;12142:16;12135:23;;11897:267;11787:377;;;;:::o;12194:845::-;12297:3;12334:5;12328:12;12363:36;12389:9;12363:36;:::i;:::-;12415:89;12497:6;12492:3;12415:89;:::i;:::-;12408:96;;12535:1;12524:9;12520:17;12551:1;12546:137;;;;12697:1;12692:341;;;;12513:520;;12546:137;12630:4;12626:9;12615;12611:25;12606:3;12599:38;12666:6;12661:3;12657:16;12650:23;;12546:137;;12692:341;12759:38;12791:5;12759:38;:::i;:::-;12819:1;12833:154;12847:6;12844:1;12841:13;12833:154;;;12921:7;12915:14;12911:1;12906:3;12902:11;12895:35;12971:1;12962:7;12958:15;12947:26;;12869:4;12866:1;12862:12;12857:17;;12833:154;;;13016:6;13011:3;13007:16;13000:23;;12699:334;;12513:520;;12301:738;;12194:845;;;;:::o;13045:366::-;13187:3;13208:67;13272:2;13267:3;13208:67;:::i;:::-;13201:74;;13284:93;13373:3;13284:93;:::i;:::-;13402:2;13397:3;13393:12;13386:19;;13045:366;;;:::o;13417:::-;13559:3;13580:67;13644:2;13639:3;13580:67;:::i;:::-;13573:74;;13656:93;13745:3;13656:93;:::i;:::-;13774:2;13769:3;13765:12;13758:19;;13417:366;;;:::o;13789:::-;13931:3;13952:67;14016:2;14011:3;13952:67;:::i;:::-;13945:74;;14028:93;14117:3;14028:93;:::i;:::-;14146:2;14141:3;14137:12;14130:19;;13789:366;;;:::o;14161:::-;14303:3;14324:67;14388:2;14383:3;14324:67;:::i;:::-;14317:74;;14400:93;14489:3;14400:93;:::i;:::-;14518:2;14513:3;14509:12;14502:19;;14161:366;;;:::o;14533:::-;14675:3;14696:67;14760:2;14755:3;14696:67;:::i;:::-;14689:74;;14772:93;14861:3;14772:93;:::i;:::-;14890:2;14885:3;14881:12;14874:19;;14533:366;;;:::o;14905:::-;15047:3;15068:67;15132:2;15127:3;15068:67;:::i;:::-;15061:74;;15144:93;15233:3;15144:93;:::i;:::-;15262:2;15257:3;15253:12;15246:19;;14905:366;;;:::o;15277:::-;15419:3;15440:67;15504:2;15499:3;15440:67;:::i;:::-;15433:74;;15516:93;15605:3;15516:93;:::i;:::-;15634:2;15629:3;15625:12;15618:19;;15277:366;;;:::o;15649:::-;15791:3;15812:67;15876:2;15871:3;15812:67;:::i;:::-;15805:74;;15888:93;15977:3;15888:93;:::i;:::-;16006:2;16001:3;15997:12;15990:19;;15649:366;;;:::o;16021:::-;16163:3;16184:67;16248:2;16243:3;16184:67;:::i;:::-;16177:74;;16260:93;16349:3;16260:93;:::i;:::-;16378:2;16373:3;16369:12;16362:19;;16021:366;;;:::o;16393:::-;16535:3;16556:67;16620:2;16615:3;16556:67;:::i;:::-;16549:74;;16632:93;16721:3;16632:93;:::i;:::-;16750:2;16745:3;16741:12;16734:19;;16393:366;;;:::o;16765:::-;16907:3;16928:67;16992:2;16987:3;16928:67;:::i;:::-;16921:74;;17004:93;17093:3;17004:93;:::i;:::-;17122:2;17117:3;17113:12;17106:19;;16765:366;;;:::o;17137:::-;17279:3;17300:67;17364:2;17359:3;17300:67;:::i;:::-;17293:74;;17376:93;17465:3;17376:93;:::i;:::-;17494:2;17489:3;17485:12;17478:19;;17137:366;;;:::o;17509:::-;17651:3;17672:67;17736:2;17731:3;17672:67;:::i;:::-;17665:74;;17748:93;17837:3;17748:93;:::i;:::-;17866:2;17861:3;17857:12;17850:19;;17509:366;;;:::o;17881:::-;18023:3;18044:67;18108:2;18103:3;18044:67;:::i;:::-;18037:74;;18120:93;18209:3;18120:93;:::i;:::-;18238:2;18233:3;18229:12;18222:19;;17881:366;;;:::o;18253:::-;18395:3;18416:67;18480:2;18475:3;18416:67;:::i;:::-;18409:74;;18492:93;18581:3;18492:93;:::i;:::-;18610:2;18605:3;18601:12;18594:19;;18253:366;;;:::o;18625:::-;18767:3;18788:67;18852:2;18847:3;18788:67;:::i;:::-;18781:74;;18864:93;18953:3;18864:93;:::i;:::-;18982:2;18977:3;18973:12;18966:19;;18625:366;;;:::o;18997:::-;19139:3;19160:67;19224:2;19219:3;19160:67;:::i;:::-;19153:74;;19236:93;19325:3;19236:93;:::i;:::-;19354:2;19349:3;19345:12;19338:19;;18997:366;;;:::o;19369:::-;19511:3;19532:67;19596:2;19591:3;19532:67;:::i;:::-;19525:74;;19608:93;19697:3;19608:93;:::i;:::-;19726:2;19721:3;19717:12;19710:19;;19369:366;;;:::o;19741:::-;19883:3;19904:67;19968:2;19963:3;19904:67;:::i;:::-;19897:74;;19980:93;20069:3;19980:93;:::i;:::-;20098:2;20093:3;20089:12;20082:19;;19741:366;;;:::o;20113:::-;20255:3;20276:67;20340:2;20335:3;20276:67;:::i;:::-;20269:74;;20352:93;20441:3;20352:93;:::i;:::-;20470:2;20465:3;20461:12;20454:19;;20113:366;;;:::o;20485:::-;20627:3;20648:67;20712:2;20707:3;20648:67;:::i;:::-;20641:74;;20724:93;20813:3;20724:93;:::i;:::-;20842:2;20837:3;20833:12;20826:19;;20485:366;;;:::o;20857:::-;20999:3;21020:67;21084:2;21079:3;21020:67;:::i;:::-;21013:74;;21096:93;21185:3;21096:93;:::i;:::-;21214:2;21209:3;21205:12;21198:19;;20857:366;;;:::o;21229:::-;21371:3;21392:67;21456:2;21451:3;21392:67;:::i;:::-;21385:74;;21468:93;21557:3;21468:93;:::i;:::-;21586:2;21581:3;21577:12;21570:19;;21229:366;;;:::o;21601:::-;21743:3;21764:67;21828:2;21823:3;21764:67;:::i;:::-;21757:74;;21840:93;21929:3;21840:93;:::i;:::-;21958:2;21953:3;21949:12;21942:19;;21601:366;;;:::o;21973:398::-;22132:3;22153:83;22234:1;22229:3;22153:83;:::i;:::-;22146:90;;22245:93;22334:3;22245:93;:::i;:::-;22363:1;22358:3;22354:11;22347:18;;21973:398;;;:::o;22377:366::-;22519:3;22540:67;22604:2;22599:3;22540:67;:::i;:::-;22533:74;;22616:93;22705:3;22616:93;:::i;:::-;22734:2;22729:3;22725:12;22718:19;;22377:366;;;:::o;22749:::-;22891:3;22912:67;22976:2;22971:3;22912:67;:::i;:::-;22905:74;;22988:93;23077:3;22988:93;:::i;:::-;23106:2;23101:3;23097:12;23090:19;;22749:366;;;:::o;23121:::-;23263:3;23284:67;23348:2;23343:3;23284:67;:::i;:::-;23277:74;;23360:93;23449:3;23360:93;:::i;:::-;23478:2;23473:3;23469:12;23462:19;;23121:366;;;:::o;23493:::-;23635:3;23656:67;23720:2;23715:3;23656:67;:::i;:::-;23649:74;;23732:93;23821:3;23732:93;:::i;:::-;23850:2;23845:3;23841:12;23834:19;;23493:366;;;:::o;23865:::-;24007:3;24028:67;24092:2;24087:3;24028:67;:::i;:::-;24021:74;;24104:93;24193:3;24104:93;:::i;:::-;24222:2;24217:3;24213:12;24206:19;;23865:366;;;:::o;24237:::-;24379:3;24400:67;24464:2;24459:3;24400:67;:::i;:::-;24393:74;;24476:93;24565:3;24476:93;:::i;:::-;24594:2;24589:3;24585:12;24578:19;;24237:366;;;:::o;24609:108::-;24686:24;24704:5;24686:24;:::i;:::-;24681:3;24674:37;24609:108;;:::o;24723:118::-;24810:24;24828:5;24810:24;:::i;:::-;24805:3;24798:37;24723:118;;:::o;24847:589::-;25072:3;25094:95;25185:3;25176:6;25094:95;:::i;:::-;25087:102;;25206:95;25297:3;25288:6;25206:95;:::i;:::-;25199:102;;25318:92;25406:3;25397:6;25318:92;:::i;:::-;25311:99;;25427:3;25420:10;;24847:589;;;;;;:::o;25442:379::-;25626:3;25648:147;25791:3;25648:147;:::i;:::-;25641:154;;25812:3;25805:10;;25442:379;;;:::o;25827:222::-;25920:4;25958:2;25947:9;25943:18;25935:26;;25971:71;26039:1;26028:9;26024:17;26015:6;25971:71;:::i;:::-;25827:222;;;;:::o;26055:640::-;26250:4;26288:3;26277:9;26273:19;26265:27;;26302:71;26370:1;26359:9;26355:17;26346:6;26302:71;:::i;:::-;26383:72;26451:2;26440:9;26436:18;26427:6;26383:72;:::i;:::-;26465;26533:2;26522:9;26518:18;26509:6;26465:72;:::i;:::-;26584:9;26578:4;26574:20;26569:2;26558:9;26554:18;26547:48;26612:76;26683:4;26674:6;26612:76;:::i;:::-;26604:84;;26055:640;;;;;;;:::o;26701:373::-;26844:4;26882:2;26871:9;26867:18;26859:26;;26931:9;26925:4;26921:20;26917:1;26906:9;26902:17;26895:47;26959:108;27062:4;27053:6;26959:108;:::i;:::-;26951:116;;26701:373;;;;:::o;27080:210::-;27167:4;27205:2;27194:9;27190:18;27182:26;;27218:65;27280:1;27269:9;27265:17;27256:6;27218:65;:::i;:::-;27080:210;;;;:::o;27296:313::-;27409:4;27447:2;27436:9;27432:18;27424:26;;27496:9;27490:4;27486:20;27482:1;27471:9;27467:17;27460:47;27524:78;27597:4;27588:6;27524:78;:::i;:::-;27516:86;;27296:313;;;;:::o;27615:419::-;27781:4;27819:2;27808:9;27804:18;27796:26;;27868:9;27862:4;27858:20;27854:1;27843:9;27839:17;27832:47;27896:131;28022:4;27896:131;:::i;:::-;27888:139;;27615:419;;;:::o;28040:::-;28206:4;28244:2;28233:9;28229:18;28221:26;;28293:9;28287:4;28283:20;28279:1;28268:9;28264:17;28257:47;28321:131;28447:4;28321:131;:::i;:::-;28313:139;;28040:419;;;:::o;28465:::-;28631:4;28669:2;28658:9;28654:18;28646:26;;28718:9;28712:4;28708:20;28704:1;28693:9;28689:17;28682:47;28746:131;28872:4;28746:131;:::i;:::-;28738:139;;28465:419;;;:::o;28890:::-;29056:4;29094:2;29083:9;29079:18;29071:26;;29143:9;29137:4;29133:20;29129:1;29118:9;29114:17;29107:47;29171:131;29297:4;29171:131;:::i;:::-;29163:139;;28890:419;;;:::o;29315:::-;29481:4;29519:2;29508:9;29504:18;29496:26;;29568:9;29562:4;29558:20;29554:1;29543:9;29539:17;29532:47;29596:131;29722:4;29596:131;:::i;:::-;29588:139;;29315:419;;;:::o;29740:::-;29906:4;29944:2;29933:9;29929:18;29921:26;;29993:9;29987:4;29983:20;29979:1;29968:9;29964:17;29957:47;30021:131;30147:4;30021:131;:::i;:::-;30013:139;;29740:419;;;:::o;30165:::-;30331:4;30369:2;30358:9;30354:18;30346:26;;30418:9;30412:4;30408:20;30404:1;30393:9;30389:17;30382:47;30446:131;30572:4;30446:131;:::i;:::-;30438:139;;30165:419;;;:::o;30590:::-;30756:4;30794:2;30783:9;30779:18;30771:26;;30843:9;30837:4;30833:20;30829:1;30818:9;30814:17;30807:47;30871:131;30997:4;30871:131;:::i;:::-;30863:139;;30590:419;;;:::o;31015:::-;31181:4;31219:2;31208:9;31204:18;31196:26;;31268:9;31262:4;31258:20;31254:1;31243:9;31239:17;31232:47;31296:131;31422:4;31296:131;:::i;:::-;31288:139;;31015:419;;;:::o;31440:::-;31606:4;31644:2;31633:9;31629:18;31621:26;;31693:9;31687:4;31683:20;31679:1;31668:9;31664:17;31657:47;31721:131;31847:4;31721:131;:::i;:::-;31713:139;;31440:419;;;:::o;31865:::-;32031:4;32069:2;32058:9;32054:18;32046:26;;32118:9;32112:4;32108:20;32104:1;32093:9;32089:17;32082:47;32146:131;32272:4;32146:131;:::i;:::-;32138:139;;31865:419;;;:::o;32290:::-;32456:4;32494:2;32483:9;32479:18;32471:26;;32543:9;32537:4;32533:20;32529:1;32518:9;32514:17;32507:47;32571:131;32697:4;32571:131;:::i;:::-;32563:139;;32290:419;;;:::o;32715:::-;32881:4;32919:2;32908:9;32904:18;32896:26;;32968:9;32962:4;32958:20;32954:1;32943:9;32939:17;32932:47;32996:131;33122:4;32996:131;:::i;:::-;32988:139;;32715:419;;;:::o;33140:::-;33306:4;33344:2;33333:9;33329:18;33321:26;;33393:9;33387:4;33383:20;33379:1;33368:9;33364:17;33357:47;33421:131;33547:4;33421:131;:::i;:::-;33413:139;;33140:419;;;:::o;33565:::-;33731:4;33769:2;33758:9;33754:18;33746:26;;33818:9;33812:4;33808:20;33804:1;33793:9;33789:17;33782:47;33846:131;33972:4;33846:131;:::i;:::-;33838:139;;33565:419;;;:::o;33990:::-;34156:4;34194:2;34183:9;34179:18;34171:26;;34243:9;34237:4;34233:20;34229:1;34218:9;34214:17;34207:47;34271:131;34397:4;34271:131;:::i;:::-;34263:139;;33990:419;;;:::o;34415:::-;34581:4;34619:2;34608:9;34604:18;34596:26;;34668:9;34662:4;34658:20;34654:1;34643:9;34639:17;34632:47;34696:131;34822:4;34696:131;:::i;:::-;34688:139;;34415:419;;;:::o;34840:::-;35006:4;35044:2;35033:9;35029:18;35021:26;;35093:9;35087:4;35083:20;35079:1;35068:9;35064:17;35057:47;35121:131;35247:4;35121:131;:::i;:::-;35113:139;;34840:419;;;:::o;35265:::-;35431:4;35469:2;35458:9;35454:18;35446:26;;35518:9;35512:4;35508:20;35504:1;35493:9;35489:17;35482:47;35546:131;35672:4;35546:131;:::i;:::-;35538:139;;35265:419;;;:::o;35690:::-;35856:4;35894:2;35883:9;35879:18;35871:26;;35943:9;35937:4;35933:20;35929:1;35918:9;35914:17;35907:47;35971:131;36097:4;35971:131;:::i;:::-;35963:139;;35690:419;;;:::o;36115:::-;36281:4;36319:2;36308:9;36304:18;36296:26;;36368:9;36362:4;36358:20;36354:1;36343:9;36339:17;36332:47;36396:131;36522:4;36396:131;:::i;:::-;36388:139;;36115:419;;;:::o;36540:::-;36706:4;36744:2;36733:9;36729:18;36721:26;;36793:9;36787:4;36783:20;36779:1;36768:9;36764:17;36757:47;36821:131;36947:4;36821:131;:::i;:::-;36813:139;;36540:419;;;:::o;36965:::-;37131:4;37169:2;37158:9;37154:18;37146:26;;37218:9;37212:4;37208:20;37204:1;37193:9;37189:17;37182:47;37246:131;37372:4;37246:131;:::i;:::-;37238:139;;36965:419;;;:::o;37390:::-;37556:4;37594:2;37583:9;37579:18;37571:26;;37643:9;37637:4;37633:20;37629:1;37618:9;37614:17;37607:47;37671:131;37797:4;37671:131;:::i;:::-;37663:139;;37390:419;;;:::o;37815:::-;37981:4;38019:2;38008:9;38004:18;37996:26;;38068:9;38062:4;38058:20;38054:1;38043:9;38039:17;38032:47;38096:131;38222:4;38096:131;:::i;:::-;38088:139;;37815:419;;;:::o;38240:::-;38406:4;38444:2;38433:9;38429:18;38421:26;;38493:9;38487:4;38483:20;38479:1;38468:9;38464:17;38457:47;38521:131;38647:4;38521:131;:::i;:::-;38513:139;;38240:419;;;:::o;38665:::-;38831:4;38869:2;38858:9;38854:18;38846:26;;38918:9;38912:4;38908:20;38904:1;38893:9;38889:17;38882:47;38946:131;39072:4;38946:131;:::i;:::-;38938:139;;38665:419;;;:::o;39090:::-;39256:4;39294:2;39283:9;39279:18;39271:26;;39343:9;39337:4;39333:20;39329:1;39318:9;39314:17;39307:47;39371:131;39497:4;39371:131;:::i;:::-;39363:139;;39090:419;;;:::o;39515:::-;39681:4;39719:2;39708:9;39704:18;39696:26;;39768:9;39762:4;39758:20;39754:1;39743:9;39739:17;39732:47;39796:131;39922:4;39796:131;:::i;:::-;39788:139;;39515:419;;;:::o;39940:::-;40106:4;40144:2;40133:9;40129:18;40121:26;;40193:9;40187:4;40183:20;40179:1;40168:9;40164:17;40157:47;40221:131;40347:4;40221:131;:::i;:::-;40213:139;;39940:419;;;:::o;40365:222::-;40458:4;40496:2;40485:9;40481:18;40473:26;;40509:71;40577:1;40566:9;40562:17;40553:6;40509:71;:::i;:::-;40365:222;;;;:::o;40593:129::-;40627:6;40654:20;;:::i;:::-;40644:30;;40683:33;40711:4;40703:6;40683:33;:::i;:::-;40593:129;;;:::o;40728:75::-;40761:6;40794:2;40788:9;40778:19;;40728:75;:::o;40809:307::-;40870:4;40960:18;40952:6;40949:30;40946:56;;;40982:18;;:::i;:::-;40946:56;41020:29;41042:6;41020:29;:::i;:::-;41012:37;;41104:4;41098;41094:15;41086:23;;40809:307;;;:::o;41122:308::-;41184:4;41274:18;41266:6;41263:30;41260:56;;;41296:18;;:::i;:::-;41260:56;41334:29;41356:6;41334:29;:::i;:::-;41326:37;;41418:4;41412;41408:15;41400:23;;41122:308;;;:::o;41436:132::-;41503:4;41526:3;41518:11;;41556:4;41551:3;41547:14;41539:22;;41436:132;;;:::o;41574:141::-;41623:4;41646:3;41638:11;;41669:3;41666:1;41659:14;41703:4;41700:1;41690:18;41682:26;;41574:141;;;:::o;41721:114::-;41788:6;41822:5;41816:12;41806:22;;41721:114;;;:::o;41841:98::-;41892:6;41926:5;41920:12;41910:22;;41841:98;;;:::o;41945:99::-;41997:6;42031:5;42025:12;42015:22;;41945:99;;;:::o;42050:113::-;42120:4;42152;42147:3;42143:14;42135:22;;42050:113;;;:::o;42169:184::-;42268:11;42302:6;42297:3;42290:19;42342:4;42337:3;42333:14;42318:29;;42169:184;;;;:::o;42359:168::-;42442:11;42476:6;42471:3;42464:19;42516:4;42511:3;42507:14;42492:29;;42359:168;;;;:::o;42533:147::-;42634:11;42671:3;42656:18;;42533:147;;;;:::o;42686:169::-;42770:11;42804:6;42799:3;42792:19;42844:4;42839:3;42835:14;42820:29;;42686:169;;;;:::o;42861:148::-;42963:11;43000:3;42985:18;;42861:148;;;;:::o;43015:305::-;43055:3;43074:20;43092:1;43074:20;:::i;:::-;43069:25;;43108:20;43126:1;43108:20;:::i;:::-;43103:25;;43262:1;43194:66;43190:74;43187:1;43184:81;43181:107;;;43268:18;;:::i;:::-;43181:107;43312:1;43309;43305:9;43298:16;;43015:305;;;;:::o;43326:185::-;43366:1;43383:20;43401:1;43383:20;:::i;:::-;43378:25;;43417:20;43435:1;43417:20;:::i;:::-;43412:25;;43456:1;43446:35;;43461:18;;:::i;:::-;43446:35;43503:1;43500;43496:9;43491:14;;43326:185;;;;:::o;43517:348::-;43557:7;43580:20;43598:1;43580:20;:::i;:::-;43575:25;;43614:20;43632:1;43614:20;:::i;:::-;43609:25;;43802:1;43734:66;43730:74;43727:1;43724:81;43719:1;43712:9;43705:17;43701:105;43698:131;;;43809:18;;:::i;:::-;43698:131;43857:1;43854;43850:9;43839:20;;43517:348;;;;:::o;43871:191::-;43911:4;43931:20;43949:1;43931:20;:::i;:::-;43926:25;;43965:20;43983:1;43965:20;:::i;:::-;43960:25;;44004:1;44001;43998:8;43995:34;;;44009:18;;:::i;:::-;43995:34;44054:1;44051;44047:9;44039:17;;43871:191;;;;:::o;44068:96::-;44105:7;44134:24;44152:5;44134:24;:::i;:::-;44123:35;;44068:96;;;:::o;44170:90::-;44204:7;44247:5;44240:13;44233:21;44222:32;;44170:90;;;:::o;44266:149::-;44302:7;44342:66;44335:5;44331:78;44320:89;;44266:149;;;:::o;44421:126::-;44458:7;44498:42;44491:5;44487:54;44476:65;;44421:126;;;:::o;44553:77::-;44590:7;44619:5;44608:16;;44553:77;;;:::o;44636:154::-;44720:6;44715:3;44710;44697:30;44782:1;44773:6;44768:3;44764:16;44757:27;44636:154;;;:::o;44796:307::-;44864:1;44874:113;44888:6;44885:1;44882:13;44874:113;;;44973:1;44968:3;44964:11;44958:18;44954:1;44949:3;44945:11;44938:39;44910:2;44907:1;44903:10;44898:15;;44874:113;;;45005:6;45002:1;44999:13;44996:101;;;45085:1;45076:6;45071:3;45067:16;45060:27;44996:101;44845:258;44796:307;;;:::o;45109:320::-;45153:6;45190:1;45184:4;45180:12;45170:22;;45237:1;45231:4;45227:12;45258:18;45248:81;;45314:4;45306:6;45302:17;45292:27;;45248:81;45376:2;45368:6;45365:14;45345:18;45342:38;45339:84;;;45395:18;;:::i;:::-;45339:84;45160:269;45109:320;;;:::o;45435:281::-;45518:27;45540:4;45518:27;:::i;:::-;45510:6;45506:40;45648:6;45636:10;45633:22;45612:18;45600:10;45597:34;45594:62;45591:88;;;45659:18;;:::i;:::-;45591:88;45699:10;45695:2;45688:22;45478:238;45435:281;;:::o;45722:233::-;45761:3;45784:24;45802:5;45784:24;:::i;:::-;45775:33;;45830:66;45823:5;45820:77;45817:103;;;45900:18;;:::i;:::-;45817:103;45947:1;45940:5;45936:13;45929:20;;45722:233;;;:::o;45961:176::-;45993:1;46010:20;46028:1;46010:20;:::i;:::-;46005:25;;46044:20;46062:1;46044:20;:::i;:::-;46039:25;;46083:1;46073:35;;46088:18;;:::i;:::-;46073:35;46129:1;46126;46122:9;46117:14;;45961:176;;;;:::o;46143:180::-;46191:77;46188:1;46181:88;46288:4;46285:1;46278:15;46312:4;46309:1;46302:15;46329:180;46377:77;46374:1;46367:88;46474:4;46471:1;46464:15;46498:4;46495:1;46488:15;46515:180;46563:77;46560:1;46553:88;46660:4;46657:1;46650:15;46684:4;46681:1;46674:15;46701:180;46749:77;46746:1;46739:88;46846:4;46843:1;46836:15;46870:4;46867:1;46860:15;46887:180;46935:77;46932:1;46925:88;47032:4;47029:1;47022:15;47056:4;47053:1;47046:15;47073:180;47121:77;47118:1;47111:88;47218:4;47215:1;47208:15;47242:4;47239:1;47232:15;47259:117;47368:1;47365;47358:12;47382:117;47491:1;47488;47481:12;47505:117;47614:1;47611;47604:12;47628:117;47737:1;47734;47727:12;47751:117;47860:1;47857;47850:12;47874:117;47983:1;47980;47973:12;47997:102;48038:6;48089:2;48085:7;48080:2;48073:5;48069:14;48065:28;48055:38;;47997:102;;;:::o;48105:162::-;48245:14;48241:1;48233:6;48229:14;48222:38;48105:162;:::o;48273:230::-;48413:34;48409:1;48401:6;48397:14;48390:58;48482:13;48477:2;48469:6;48465:15;48458:38;48273:230;:::o;48509:237::-;48649:34;48645:1;48637:6;48633:14;48626:58;48718:20;48713:2;48705:6;48701:15;48694:45;48509:237;:::o;48752:225::-;48892:34;48888:1;48880:6;48876:14;48869:58;48961:8;48956:2;48948:6;48944:15;48937:33;48752:225;:::o;48983:161::-;49123:13;49119:1;49111:6;49107:14;49100:37;48983:161;:::o;49150:178::-;49290:30;49286:1;49278:6;49274:14;49267:54;49150:178;:::o;49334:223::-;49474:34;49470:1;49462:6;49458:14;49451:58;49543:6;49538:2;49530:6;49526:15;49519:31;49334:223;:::o;49563:175::-;49703:27;49699:1;49691:6;49687:14;49680:51;49563:175;:::o;49744:225::-;49884:34;49880:1;49872:6;49868:14;49861:58;49953:8;49948:2;49940:6;49936:15;49929:33;49744:225;:::o;49975:231::-;50115:34;50111:1;50103:6;50099:14;50092:58;50184:14;50179:2;50171:6;50167:15;50160:39;49975:231;:::o;50212:177::-;50352:29;50348:1;50340:6;50336:14;50329:53;50212:177;:::o;50395:243::-;50535:34;50531:1;50523:6;50519:14;50512:58;50604:26;50599:2;50591:6;50587:15;50580:51;50395:243;:::o;50644:229::-;50784:34;50780:1;50772:6;50768:14;50761:58;50853:12;50848:2;50840:6;50836:15;50829:37;50644:229;:::o;50879:228::-;51019:34;51015:1;51007:6;51003:14;50996:58;51088:11;51083:2;51075:6;51071:15;51064:36;50879:228;:::o;51113:182::-;51253:34;51249:1;51241:6;51237:14;51230:58;51113:182;:::o;51301:231::-;51441:34;51437:1;51429:6;51425:14;51418:58;51510:14;51505:2;51497:6;51493:15;51486:39;51301:231;:::o;51538:182::-;51678:34;51674:1;51666:6;51662:14;51655:58;51538:182;:::o;51726:228::-;51866:34;51862:1;51854:6;51850:14;51843:58;51935:11;51930:2;51922:6;51918:15;51911:36;51726:228;:::o;51960:172::-;52100:24;52096:1;52088:6;52084:14;52077:48;51960:172;:::o;52138:163::-;52278:15;52274:1;52266:6;52262:14;52255:39;52138:163;:::o;52307:168::-;52447:20;52443:1;52435:6;52431:14;52424:44;52307:168;:::o;52481:171::-;52621:23;52617:1;52609:6;52605:14;52598:47;52481:171;:::o;52658:220::-;52798:34;52794:1;52786:6;52782:14;52775:58;52867:3;52862:2;52854:6;52850:15;52843:28;52658:220;:::o;52884:221::-;53024:34;53020:1;53012:6;53008:14;53001:58;53093:4;53088:2;53080:6;53076:15;53069:29;52884:221;:::o;53111:114::-;;:::o;53231:168::-;53371:20;53367:1;53359:6;53355:14;53348:44;53231:168;:::o;53405:236::-;53545:34;53541:1;53533:6;53529:14;53522:58;53614:19;53609:2;53601:6;53597:15;53590:44;53405:236;:::o;53647:231::-;53787:34;53783:1;53775:6;53771:14;53764:58;53856:14;53851:2;53843:6;53839:15;53832:39;53647:231;:::o;53884:178::-;54024:30;54020:1;54012:6;54008:14;54001:54;53884:178;:::o;54068:181::-;54208:33;54204:1;54196:6;54192:14;54185:57;54068:181;:::o;54255:164::-;54395:16;54391:1;54383:6;54379:14;54372:40;54255:164;:::o;54425:122::-;54498:24;54516:5;54498:24;:::i;:::-;54491:5;54488:35;54478:63;;54537:1;54534;54527:12;54478:63;54425:122;:::o;54553:116::-;54623:21;54638:5;54623:21;:::i;:::-;54616:5;54613:32;54603:60;;54659:1;54656;54649:12;54603:60;54553:116;:::o;54675:120::-;54747:23;54764:5;54747:23;:::i;:::-;54740:5;54737:34;54727:62;;54785:1;54782;54775:12;54727:62;54675:120;:::o;54801:122::-;54874:24;54892:5;54874:24;:::i;:::-;54867:5;54864:35;54854:63;;54913:1;54910;54903:12;54854:63;54801:122;:::o

Swarm Source

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