ETH Price: $3,362.15 (-0.60%)
Gas: 11 Gwei

Token

Toodle Loot Bag (BAG)
 

Overview

Max Total Supply

764 BAG

Holders

195

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
miaflusa.eth
Balance
1 BAG
0xfd9a6cd1670fe8eb4012d8abb9cdf25741a6ff04
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:
ToodleLootBag

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-06
*/

/**
 *Submitted for verification at Etherscan.io on 2021-09-06
*/

// SPDX-License-Identifier: MIT

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






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




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




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

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









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

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

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

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

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

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

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

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





/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and 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;
    }
}














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







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





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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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









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


/**
 * @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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 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(to).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 {}
}







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


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


contract ToodleLootBag is ERC721Enumerable, ReentrancyGuard, Ownable {

        string[] private weapons = [
        "Rifle",
        "Phaser",
        "Zapper",
        "Equalizer",
        "Sniper",
        "Laser",
        "Saber",
        "Disruptor",
        "Missile",
        "Launcher",
        "Rail Gun",
        "Staff",
        "Whip",
        "Dagger",
        "Katana",
        "Greatsword"
        "Bolt",
        "Cannon",
        "Crossbow",
        "Bow",
        "Dagger",
        "Knuckles",
        "Fusion Gun",
        "Flamethrower",
        "Drone",
        "Beam"
    ];
    
    string[] private chestArmor = [
        "Body Suit",
        "Nano Suit",
        "Combat Suit",
        "Agile Suit",
        "Launch Suit",
        "Space Suit",
        "Escape Suit",
        "Vanguard Armor",
        "Civilian Armor",
        "Assault Armor",
        "Power Armor",
        "Giga Suit",
        "Standard Suit",
        "Standard Armor"
    ];
    
    string[] private headArmor = [
        "Helmet",
        "Scanner",
        "Glasses",
        "Ear Piece",
        "Scanner",
        "Visor",
        "Ceremonial Piece",
        "Antenna",
        "Beacon",
        "Pulverizer",
        "Bacteria",
        "Brain",
        "Sensor",
        "Acid"
    ];
    
    string[] private waistArmor = [
        "Translator",
        "Assistant",
        "Messenger",
        "Droid",
        "Jet Pack",
        "Portal Gun",
        "Tool",
        "Neutralizer",
        "Replicator",
        "Relic",
        "Time Machine",
        "Emote"
    ];
    
    string[] private footArmor = [
        "Pod",
        "Scout",
        "Shuttle",
        "Carrier",
        "Destroyer",
        "Frigate",
        "Cruiser",
        "Fighter Jet",
        "Starchaser",
        "Freight Ship",
        "Repair Ship",
        "Yacht",
        "Courier",
        "Vessel",
        "Star Base",
        "Voyager"
    ];
    
    string[] private handArmor = [
        "Gauntlets",
        "Hands",
        "One Hand",
        "Blaster",
        "Gauntlets",
        "Watch",
        "File",
        "Autowrench",
        "Spanner",
        "Screwdriver",
        "Pliers",
        "Mallet",
        "Link",
        "Cloak",
        "Module",
        "Shield",
        "Slicer",
        "Warper",
        "Drill"
    ];
    
    string[] private necklaces = [
        "Fusion Core",
        "Reactor",
        "Pendant", 
        "Antimatter",
        "Shield",
        "Crystal",
        "Capsule",
        "Plate",
        "Fission",
        "Energy",
        "Collar"
    ];
    
    string[] private rings = [
        "Warp Ring",
        "Phase Ring",
        "Galactic Ring",
        "Ring",
        "Star Ring",
        "Ion Ring",
        "Neutron Ring",
        "Civilian Ring",
        "Giga Ring",
        "Power Ring",
        "Force Field"
    ];
    
    string[] private suffixes = [
        "of Exploration",
        "of Nanotech",
        "of Technocracy",
        "of Mortality",
        "of Immortality",
        "of Terraforming",
        "of Computation",
        "of Enlightenment",
        "of Brilliance",
        "of Radiation",
        "of Sentience",
        "of a Galaxy",
        "of Protection",
        "of Computation",
        "of Cybernetics",
        "of Dimensions",
        "of a Cosmos"
    ];
    
    string[] private namePrefixes = [
        "Cyber",
        "Hyper",
        "Super",
        "Dynamic",
        "Quantum",
        "Atomic",
        "Cosmic",
        "Genetic",
        "Phantom",
        "Bionic",
        "Stealthy"
    ];
    
    string[] private nameSuffixes = [
        "Might",
        "Fragment",
        "Booster",
        "Blitz",
        "Echo",
        "Shifter",
        "Flow",
        "Bringer",
        "Stasis",
        "Explorer",
        "Particle",
        "Tech",
        "Network",
        "Virus",
        "Breaker",
        "Medic",
        "Encoder",
        "Aura",
        "Flux",
        "Ruler"
    ];
    
    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }
    
    function getWeapon(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "WEAPON", weapons);
    }
    
    function getChest(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "CHEST", chestArmor);
    }
    
    function getHead(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "HEAD", headArmor);
    }
    
    function getWaist(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "WAIST", waistArmor);
    }

    function getFoot(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "FOOT", footArmor);
    }
    
    function getHand(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "HAND", handArmor);
    }
    
    function getNeck(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "NECK", necklaces);
    }
    
    function getRing(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "RING", rings);
    }
    
    function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 21;
        if (greatness > 14) {
            output = string(abi.encodePacked(output, " ", suffixes[rand % suffixes.length]));
        }
        if (greatness >= 19) {
            string[2] memory name;
            name[0] = namePrefixes[rand % namePrefixes.length];
            name[1] = nameSuffixes[rand % nameSuffixes.length];
            if (greatness == 19) {
                output = string(abi.encodePacked('"', name[0], ' ', name[1], '" ', output));
            } else {
                output = string(abi.encodePacked('"', name[0], ' ', name[1], '" ', output, " +1"));
            }
        }
        return output;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        string[17] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: mediumspringgreen; font-family: Courier New; font-size: 10px; }</style><rect width="100%" height="100%" fill="steelblue" /><text x="10" y="20" class="base">';

        parts[1] = getWeapon(tokenId);

        parts[2] = '</text><text x="10" y="40" class="base">';

        parts[3] = getChest(tokenId);

        parts[4] = '</text><text x="10" y="60" class="base">';

        parts[5] = getHead(tokenId);

        parts[6] = '</text><text x="10" y="80" class="base">';

        parts[7] = getWaist(tokenId);

        parts[8] = '</text><text x="10" y="100" class="base">';

        parts[9] = getFoot(tokenId);

        parts[10] = '</text><text x="10" y="120" class="base">';

        parts[11] = getHand(tokenId);

        parts[12] = '</text><text x="10" y="140" class="base">';

        parts[13] = getNeck(tokenId);

        parts[14] = '</text><text x="10" y="160" class="base">';

        parts[15] = getRing(tokenId);

        parts[16] = '</text></svg>';

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]));
        output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12], parts[13], parts[14], parts[15], parts[16]));
        
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Toodle Loot Bag #', toString(tokenId), '", "description": "Toodle Loot Bag is an official NFT collection for the Cryptoodle Ecosystem. There are only 10,000 Toodle Loot Bags available.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function claim(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 9000, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
    }
    
    function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 8999 && tokenId < 10001, "Token ID invalid");
        _safeMint(owner(), tokenId);
    }
    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    
    constructor() ERC721("Toodle Loot Bag", "BAG") Ownable() {}
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

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":[{"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":"tokenId","type":"uint256"}],"name":"claim","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":"tokenId","type":"uint256"}],"name":"getChest","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFoot","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHand","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHead","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getNeck","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRing","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWaist","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWeapon","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":[],"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":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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"}]

60806040526040518061032001604052806040518060400160405280600581526020017f5269666c6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f506861736572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5a6170706572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f457175616c697a6572000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536e69706572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c6173657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f536162657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f446973727570746f72000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4d697373696c650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4c61756e6368657200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f5261696c2047756e00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f537461666600000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f576869700000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f446167676572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4b6174616e61000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f477265617473776f7264426f6c7400000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f43616e6e6f6e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f43726f7373626f7700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f426f77000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f446167676572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4b6e75636b6c657300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f467573696f6e2047756e0000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f466c616d657468726f776572000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f44726f6e6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4265616d00000000000000000000000000000000000000000000000000000000815250815250600c906019620005e392919062002a1b565b50604051806101c001604052806040518060400160405280600981526020017f426f64792053756974000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4e616e6f2053756974000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f436f6d626174205375697400000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f4167696c6520537569740000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f4c61756e6368205375697400000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f537061636520537569740000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f457363617065205375697400000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f56616e67756172642041726d6f7200000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f436976696c69616e2041726d6f7200000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f41737361756c742041726d6f720000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f506f7765722041726d6f7200000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f476967612053756974000000000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f5374616e6461726420537569740000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f5374616e646172642041726d6f72000000000000000000000000000000000000815250815250600d90600e6200093a92919062002a82565b50604051806101c001604052806040518060400160405280600681526020017f48656c6d6574000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5363616e6e65720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f476c61737365730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f456172205069656365000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5363616e6e65720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f5669736f7200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f436572656d6f6e69616c2050696563650000000000000000000000000000000081525081526020016040518060400160405280600781526020017f416e74656e6e610000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f426561636f6e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f50756c766572697a65720000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f426163746572696100000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f427261696e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f53656e736f72000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4163696400000000000000000000000000000000000000000000000000000000815250815250600e90600e62000c9192919062002a82565b506040518061018001604052806040518060400160405280600a81526020017f5472616e736c61746f720000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f417373697374616e74000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4d657373656e676572000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f44726f696400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4a6574205061636b00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f506f7274616c2047756e0000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f546f6f6c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f4e65757472616c697a657200000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f5265706c696361746f720000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f52656c696300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f54696d65204d616368696e65000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f456d6f7465000000000000000000000000000000000000000000000000000000815250815250600f90600c62000f7292919062002ae9565b506040518061020001604052806040518060400160405280600381526020017f506f64000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53636f757400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f53687574746c650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f436172726965720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f44657374726f796572000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f467269676174650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f437275697365720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f46696768746572204a657400000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f537461726368617365720000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f467265696768742053686970000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f526570616972205368697000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f596163687400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f436f75726965720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f56657373656c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f537461722042617365000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f566f79616765720000000000000000000000000000000000000000000000000081525081525060109060106200133f92919062002b50565b506040518061026001604052806040518060400160405280600981526020017f4761756e746c657473000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f48616e647300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4f6e652048616e6400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f426c61737465720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4761756e746c657473000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f576174636800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f46696c650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f4175746f7772656e63680000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5370616e6e65720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f536372657764726976657200000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f506c69657273000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d616c6c6574000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c696e6b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f436c6f616b00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d6f64756c65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536869656c64000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536c69636572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f576172706572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4472696c6c0000000000000000000000000000000000000000000000000000008152508152506011906013620017bd92919062002bb7565b506040518061016001604052806040518060400160405280600b81526020017f467573696f6e20436f726500000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f52656163746f720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f50656e64616e740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f416e74696d61747465720000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536869656c64000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4372797374616c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f43617073756c650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506c61746500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f46697373696f6e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f456e65726779000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f436f6c6c61720000000000000000000000000000000000000000000000000000815250815250601290600b62001a6392919062002c1e565b506040518061016001604052806040518060400160405280600981526020017f576172702052696e67000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f50686173652052696e670000000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f47616c61637469632052696e670000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f52696e670000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f537461722052696e67000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f496f6e2052696e6700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f4e657574726f6e2052696e67000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f436976696c69616e2052696e670000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f476967612052696e67000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f506f7765722052696e670000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f466f726365204669656c64000000000000000000000000000000000000000000815250815250601390600b62001d0992919062002c1e565b506040518061022001604052806040518060400160405280600e81526020017f6f66204578706c6f726174696f6e00000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6f66204e616e6f7465636800000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f6f6620546563686e6f637261637900000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f6f66204d6f7274616c697479000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f6f6620496d6d6f7274616c69747900000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f6f66205465727261666f726d696e67000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f6f6620436f6d7075746174696f6e00000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f6f6620456e6c69676874656e6d656e740000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f6f66204272696c6c69616e63650000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f6f6620526164696174696f6e000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f6f662053656e7469656e6365000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6f6620612047616c61787900000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f6f662050726f74656374696f6e0000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f6f6620436f6d7075746174696f6e00000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f6f662043796265726e657469637300000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f6f662044696d656e73696f6e730000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6f66206120436f736d6f7300000000000000000000000000000000000000000081525081525060149060116200211192919062002c85565b506040518061016001604052806040518060400160405280600581526020017f437962657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f487970657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f537570657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f44796e616d69630000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5175616e74756d0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f41746f6d6963000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f436f736d6963000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f47656e657469630000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5068616e746f6d0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f42696f6e6963000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f537465616c746879000000000000000000000000000000000000000000000000815250815250601590600b620023b792919062002c1e565b506040518061028001604052806040518060400160405280600581526020017f4d6967687400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f467261676d656e7400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f426f6f737465720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f426c69747a00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4563686f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f536869667465720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f466c6f770000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4272696e6765720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f537461736973000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4578706c6f72657200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f5061727469636c6500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f546563680000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4e6574776f726b0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f566972757300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f427265616b65720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d6564696300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f456e636f6465720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f417572610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f466c75780000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f52756c657200000000000000000000000000000000000000000000000000000081525081525060169060146200287092919062002cec565b503480156200287e57600080fd5b506040518060400160405280600f81526020017f546f6f646c65204c6f6f742042616700000000000000000000000000000000008152506040518060400160405280600381526020017f424147000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200290392919062002d53565b5080600190805190602001906200291c92919062002d53565b5050506001600a81905550620029476200293b6200294d60201b60201c565b6200295560201b60201c565b62002ed6565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562002a6f579160200282015b8281111562002a6e57825182908051906020019062002a5d92919062002d53565b509160200191906001019062002a3c565b5b50905062002a7e919062002de4565b5090565b82805482825590600052602060002090810192821562002ad6579160200282015b8281111562002ad557825182908051906020019062002ac492919062002d53565b509160200191906001019062002aa3565b5b50905062002ae5919062002de4565b5090565b82805482825590600052602060002090810192821562002b3d579160200282015b8281111562002b3c57825182908051906020019062002b2b92919062002d53565b509160200191906001019062002b0a565b5b50905062002b4c919062002de4565b5090565b82805482825590600052602060002090810192821562002ba4579160200282015b8281111562002ba357825182908051906020019062002b9292919062002d53565b509160200191906001019062002b71565b5b50905062002bb3919062002de4565b5090565b82805482825590600052602060002090810192821562002c0b579160200282015b8281111562002c0a57825182908051906020019062002bf992919062002d53565b509160200191906001019062002bd8565b5b50905062002c1a919062002de4565b5090565b82805482825590600052602060002090810192821562002c72579160200282015b8281111562002c7157825182908051906020019062002c6092919062002d53565b509160200191906001019062002c3f565b5b50905062002c81919062002de4565b5090565b82805482825590600052602060002090810192821562002cd9579160200282015b8281111562002cd857825182908051906020019062002cc792919062002d53565b509160200191906001019062002ca6565b5b50905062002ce8919062002de4565b5090565b82805482825590600052602060002090810192821562002d40579160200282015b8281111562002d3f57825182908051906020019062002d2e92919062002d53565b509160200191906001019062002d0d565b5b50905062002d4f919062002de4565b5090565b82805462002d619062002e71565b90600052602060002090601f01602090048101928262002d85576000855562002dd1565b82601f1062002da057805160ff191683800117855562002dd1565b8280016001018555821562002dd1579182015b8281111562002dd057825182559160200191906001019062002db3565b5b50905062002de0919062002e0c565b5090565b5b8082111562002e08576000818162002dfe919062002e2b565b5060010162002de5565b5090565b5b8082111562002e2757600081600090555060010162002e0d565b5090565b50805462002e399062002e71565b6000825580601f1062002e4d575062002e6e565b601f01602090049060005260206000209081019062002e6d919062002e0c565b5b50565b6000600282049050600182168062002e8a57607f821691505b6020821081141562002ea15762002ea062002ea7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61527a8062002ee66000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063a22cb465116100a2578063d47f269e11610071578063d47f269e1461058a578063e985e9c5146105ba578063ef68075a146105ea578063f2fde38b1461061a576101cf565b8063a22cb465146104f2578063b88d4fde1461050e578063c08a5dd51461052a578063c87b56dd1461055a576101cf565b806395d89b41116100de57806395d89b41146104445780639720c969146104625780639bdc1b69146104925780639e41b73f146104c2576101cf565b806370a08231146103ec578063715018a61461041c5780638da5cb5b14610426576101cf565b80632f745c5911610171578063434f48c41161014b578063434f48c4146103405780634f6ccce71461035c5780636352211e1461038c57806367209aa8146103bc576101cf565b80632f745c59146102d8578063379607f51461030857806342842e0e14610324576101cf565b8063095ea7b3116101ad578063095ea7b3146102525780630e99990d1461026e57806318160ddd1461029e57806323b872dd146102bc576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e99190613940565b610636565b6040516101fb919061412d565b60405180910390f35b61020c6106b0565b6040516102199190614148565b60405180910390f35b61023c6004803603810190610237919061399a565b610742565b60405161024991906140c6565b60405180910390f35b61026c60048036038101906102679190613900565b6107c7565b005b6102886004803603810190610283919061399a565b6108df565b6040516102959190614148565b60405180910390f35b6102a66109f9565b6040516102b391906143ca565b60405180910390f35b6102d660048036038101906102d191906137ea565b610a06565b005b6102f260048036038101906102ed9190613900565b610a66565b6040516102ff91906143ca565b60405180910390f35b610322600480360381019061031d919061399a565b610b0b565b005b61033e600480360381019061033991906137ea565b610bc5565b005b61035a6004803603810190610355919061399a565b610be5565b005b6103766004803603810190610371919061399a565b610d1c565b60405161038391906143ca565b60405180910390f35b6103a660048036038101906103a1919061399a565b610d8d565b6040516103b391906140c6565b60405180910390f35b6103d660048036038101906103d1919061399a565b610e3f565b6040516103e39190614148565b60405180910390f35b6104066004803603810190610401919061377d565b610f59565b60405161041391906143ca565b60405180910390f35b610424611011565b005b61042e611099565b60405161043b91906140c6565b60405180910390f35b61044c6110c3565b6040516104599190614148565b60405180910390f35b61047c6004803603810190610477919061399a565b611155565b6040516104899190614148565b60405180910390f35b6104ac60048036038101906104a7919061399a565b61126f565b6040516104b99190614148565b60405180910390f35b6104dc60048036038101906104d7919061399a565b611389565b6040516104e99190614148565b60405180910390f35b61050c600480360381019061050791906138c0565b6114a3565b005b6105286004803603810190610523919061383d565b611624565b005b610544600480360381019061053f919061399a565b611686565b6040516105519190614148565b60405180910390f35b610574600480360381019061056f919061399a565b6117a0565b6040516105819190614148565b60405180910390f35b6105a4600480360381019061059f919061399a565b611d38565b6040516105b19190614148565b60405180910390f35b6105d460048036038101906105cf91906137aa565b611e52565b6040516105e1919061412d565b60405180910390f35b61060460048036038101906105ff919061399a565b611ee6565b6040516106119190614148565b60405180910390f35b610634600480360381019061062f919061377d565b612000565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106a957506106a8826120f8565b5b9050919050565b6060600080546106bf9061465e565b80601f01602080910402602001604051908101604052809291908181526020018280546106eb9061465e565b80156107385780601f1061070d57610100808354040283529160200191610738565b820191906000526020600020905b81548152906001019060200180831161071b57829003601f168201915b5050505050905090565b600061074d826121da565b61078c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610783906142ca565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107d282610d8d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083a9061434a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610862612246565b73ffffffffffffffffffffffffffffffffffffffff16148061089157506108908161088b612246565b611e52565b5b6108d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c79061424a565b60405180910390fd5b6108da838361224e565b505050565b60606109f2826040518060400160405280600481526020017f464f4f54000000000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b828210156109e957838290600052602060002001805461095c9061465e565b80601f01602080910402602001604051908101604052809291908181526020018280546109889061465e565b80156109d55780601f106109aa576101008083540402835291602001916109d5565b820191906000526020600020905b8154815290600101906020018083116109b857829003601f168201915b50505050508152602001906001019061093d565b50505050612307565b9050919050565b6000600880549050905090565b610a17610a11612246565b82612653565b610a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4d9061436a565b60405180910390fd5b610a61838383612731565b505050565b6000610a7183610f59565b8210610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa99061416a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a541415610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b48906143aa565b60405180910390fd5b6002600a81905550600081118015610b6a575061232881105b610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba09061430a565b60405180910390fd5b610bba610bb4612246565b8261298d565b6001600a8190555050565b610be083838360405180602001604052806000815250611624565b505050565b6002600a541415610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c22906143aa565b60405180910390fd5b6002600a81905550610c3b612246565b73ffffffffffffffffffffffffffffffffffffffff16610c59611099565b73ffffffffffffffffffffffffffffffffffffffff1614610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca6906142ea565b60405180910390fd5b61232781118015610cc1575061271181105b610d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf79061430a565b60405180910390fd5b610d11610d0b611099565b8261298d565b6001600a8190555050565b6000610d266109f9565b8210610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e9061438a565b60405180910390fd5b60088281548110610d7b57610d7a6147f7565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d9061428a565b60405180910390fd5b80915050919050565b6060610f52826040518060400160405280600481526020017f4e45434b000000000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015610f49578382906000526020600020018054610ebc9061465e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee89061465e565b8015610f355780601f10610f0a57610100808354040283529160200191610f35565b820191906000526020600020905b815481529060010190602001808311610f1857829003601f168201915b505050505081526020019060010190610e9d565b50505050612307565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc19061426a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611019612246565b73ffffffffffffffffffffffffffffffffffffffff16611037611099565b73ffffffffffffffffffffffffffffffffffffffff161461108d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611084906142ea565b60405180910390fd5b61109760006129ab565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546110d29061465e565b80601f01602080910402602001604051908101604052809291908181526020018280546110fe9061465e565b801561114b5780601f106111205761010080835404028352916020019161114b565b820191906000526020600020905b81548152906001019060200180831161112e57829003601f168201915b5050505050905090565b6060611268826040518060400160405280600481526020017f4845414400000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b8282101561125f5783829060005260206000200180546111d29061465e565b80601f01602080910402602001604051908101604052809291908181526020018280546111fe9061465e565b801561124b5780601f106112205761010080835404028352916020019161124b565b820191906000526020600020905b81548152906001019060200180831161122e57829003601f168201915b5050505050815260200190600101906111b3565b50505050612307565b9050919050565b6060611382826040518060400160405280600581526020017f5741495354000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b828210156113795783829060005260206000200180546112ec9061465e565b80601f01602080910402602001604051908101604052809291908181526020018280546113189061465e565b80156113655780601f1061133a57610100808354040283529160200191611365565b820191906000526020600020905b81548152906001019060200180831161134857829003601f168201915b5050505050815260200190600101906112cd565b50505050612307565b9050919050565b606061149c826040518060400160405280600681526020017f574541504f4e0000000000000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b828210156114935783829060005260206000200180546114069061465e565b80601f01602080910402602001604051908101604052809291908181526020018280546114329061465e565b801561147f5780601f106114545761010080835404028352916020019161147f565b820191906000526020600020905b81548152906001019060200180831161146257829003601f168201915b5050505050815260200190600101906113e7565b50505050612307565b9050919050565b6114ab612246565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611519576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115109061420a565b60405180910390fd5b8060056000611526612246565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115d3612246565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611618919061412d565b60405180910390a35050565b61163561162f612246565b83612653565b611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b9061436a565b60405180910390fd5b61168084848484612a71565b50505050565b6060611799826040518060400160405280600481526020017f52494e47000000000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b828210156117905783829060005260206000200180546117039061465e565b80601f016020809104026020016040519081016040528092919081815260200182805461172f9061465e565b801561177c5780601f106117515761010080835404028352916020019161177c565b820191906000526020600020905b81548152906001019060200180831161175f57829003601f168201915b5050505050815260200190600101906116e4565b50505050612307565b9050919050565b60606117aa613655565b604051806101400160405280610113815260200161510a6101139139816000601181106117da576117d96147f7565b5b60200201819052506117eb83611389565b816001601181106117ff576117fe6147f7565b5b602002018190525060405180606001604052806028815260200161521d6028913981600260118110611834576118336147f7565b5b602002018190525061184583611ee6565b81600360118110611859576118586147f7565b5b6020020181905250604051806060016040528060288152602001614fd6602891398160046011811061188e5761188d6147f7565b5b602002018190525061189f83611155565b816005601181106118b3576118b26147f7565b5b602002018190525060405180606001604052806028815260200161505060289139816006601181106118e8576118e76147f7565b5b60200201819052506118f98361126f565b8160076011811061190d5761190c6147f7565b5b60200201819052506040518060600160405280602981526020016150786029913981600860118110611942576119416147f7565b5b6020020181905250611953836108df565b81600960118110611967576119666147f7565b5b60200201819052506040518060600160405280602981526020016150276029913981600a6011811061199c5761199b6147f7565b5b60200201819052506119ad83611d38565b81600b601181106119c1576119c06147f7565b5b60200201819052506040518060600160405280602981526020016150a16029913981600c601181106119f6576119f56147f7565b5b6020020181905250611a0783610e3f565b81600d60118110611a1b57611a1a6147f7565b5b6020020181905250604051806060016040528060298152602001614ffe6029913981600e60118110611a5057611a4f6147f7565b5b6020020181905250611a6183611686565b81600f60118110611a7557611a746147f7565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081601060118110611ac757611ac66147f7565b5b6020020181905250600081600060118110611ae557611ae46147f7565b5b602002015182600160118110611afe57611afd6147f7565b5b602002015183600260118110611b1757611b166147f7565b5b602002015184600360118110611b3057611b2f6147f7565b5b602002015185600460118110611b4957611b486147f7565b5b602002015186600560118110611b6257611b616147f7565b5b602002015187600660118110611b7b57611b7a6147f7565b5b602002015188600760118110611b9457611b936147f7565b5b602002015189600860118110611bad57611bac6147f7565b5b6020020151604051602001611bca99989796959493929190613f02565b60405160208183030381529060405290508082600960118110611bf057611bef6147f7565b5b602002015183600a60118110611c0957611c086147f7565b5b602002015184600b60118110611c2257611c216147f7565b5b602002015185600c60118110611c3b57611c3a6147f7565b5b602002015186600d60118110611c5457611c536147f7565b5b602002015187600e60118110611c6d57611c6c6147f7565b5b602002015188600f60118110611c8657611c856147f7565b5b602002015189601060118110611c9f57611c9e6147f7565b5b6020020151604051602001611cbc99989796959493929190613f02565b60405160208183030381529060405290506000611d09611cdb86612acd565b611ce484612c2e565b604051602001611cf5929190614081565b604051602081830303815290604052612c2e565b905080604051602001611d1c919061405f565b6040516020818303038152906040529150819350505050919050565b6060611e4b826040518060400160405280600481526020017f48414e44000000000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b82821015611e42578382906000526020600020018054611db59061465e565b80601f0160208091040260200160405190810160405280929190818152602001828054611de19061465e565b8015611e2e5780601f10611e0357610100808354040283529160200191611e2e565b820191906000526020600020905b815481529060010190602001808311611e1157829003601f168201915b505050505081526020019060010190611d96565b50505050612307565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060611ff9826040518060400160405280600581526020017f4348455354000000000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b82821015611ff0578382906000526020600020018054611f639061465e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8f9061465e565b8015611fdc5780601f10611fb157610100808354040283529160200191611fdc565b820191906000526020600020905b815481529060010190602001808311611fbf57829003601f168201915b505050505081526020019060010190611f44565b50505050612307565b9050919050565b612008612246565b73ffffffffffffffffffffffffffffffffffffffff16612026611099565b73ffffffffffffffffffffffffffffffffffffffff161461207c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612073906142ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e3906141aa565b60405180910390fd5b6120f5816129ab565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121c357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121d357506121d282612dc6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122c183610d8d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060600061233d8461231887612acd565b604051602001612329929190613ede565b604051602081830303815290604052612e30565b905060008384518361234f919061470a565b815181106123605761235f6147f7565b5b602002602001015190506000601583612379919061470a565b9050600e8111156123d557816014808054905085612397919061470a565b815481106123a8576123a76147f7565b5b906000526020600020016040516020016123c3929190613f81565b60405160208183030381529060405291505b60138110612646576123e561367d565b60158080549050856123f7919061470a565b81548110612408576124076147f7565b5b90600052602060002001805461241d9061465e565b80601f01602080910402602001604051908101604052809291908181526020018280546124499061465e565b80156124965780601f1061246b57610100808354040283529160200191612496565b820191906000526020600020905b81548152906001019060200180831161247957829003601f168201915b5050505050816000600281106124af576124ae6147f7565b5b602002018190525060168080549050856124c9919061470a565b815481106124da576124d96147f7565b5b9060005260206000200180546124ef9061465e565b80601f016020809104026020016040519081016040528092919081815260200182805461251b9061465e565b80156125685780601f1061253d57610100808354040283529160200191612568565b820191906000526020600020905b81548152906001019060200180831161254b57829003601f168201915b505050505081600160028110612581576125806147f7565b5b602002018190525060138214156125ed57806000600281106125a6576125a56147f7565b5b6020020151816001600281106125bf576125be6147f7565b5b6020020151846040516020016125d793929190613fb0565b6040516020818303038152906040529250612644565b80600060028110612601576126006147f7565b5b60200201518160016002811061261a576126196147f7565b5b60200201518460405160200161263293929190614002565b60405160208183030381529060405292505b505b8193505050509392505050565b600061265e826121da565b61269d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126949061422a565b60405180910390fd5b60006126a883610d8d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061271757508373ffffffffffffffffffffffffffffffffffffffff166126ff84610742565b73ffffffffffffffffffffffffffffffffffffffff16145b8061272857506127278185611e52565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661275182610d8d565b73ffffffffffffffffffffffffffffffffffffffff16146127a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279e9061432a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280e906141ea565b60405180910390fd5b612822838383612e63565b61282d60008261224e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461287d9190614574565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128d49190614493565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6129a7828260405180602001604052806000815250612f77565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a7c848484612731565b612a8884848484612fd2565b612ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abe9061418a565b60405180910390fd5b50505050565b60606000821415612b15576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c29565b600082905060005b60008214612b47578080612b30906146c1565b915050600a82612b4091906144e9565b9150612b1d565b60008167ffffffffffffffff811115612b6357612b62614826565b5b6040519080825280601f01601f191660200182016040528015612b955781602001600182028036833780820191505090505b5090505b60008514612c2257600182612bae9190614574565b9150600a85612bbd919061470a565b6030612bc99190614493565b60f81b818381518110612bdf57612bde6147f7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c1b91906144e9565b9450612b99565b8093505050505b919050565b60606000825190506000811415612c575760405180602001604052806000815250915050612dc1565b60006003600283612c689190614493565b612c7291906144e9565b6004612c7e919061451a565b90506000602082612c8f9190614493565b67ffffffffffffffff811115612ca857612ca7614826565b5b6040519080825280601f01601f191660200182016040528015612cda5781602001600182028036833780820191505090505b50905060006040518060600160405280604081526020016150ca604091399050600181016020830160005b86811015612d7e5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612d05565b506003860660018114612d985760028114612da857612db3565b613d3d60f01b6002830352612db3565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081604051602001612e439190613ec7565b6040516020818303038152906040528051906020012060001c9050919050565b612e6e838383613169565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612eb157612eac8161316e565b612ef0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612eef57612eee83826131b7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f3357612f2e81613324565b612f72565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f7157612f7082826133f5565b5b5b505050565b612f818383613474565b612f8e6000848484612fd2565b612fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc49061418a565b60405180910390fd5b505050565b6000612ff38473ffffffffffffffffffffffffffffffffffffffff16613642565b1561315c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261301c612246565b8786866040518563ffffffff1660e01b815260040161303e94939291906140e1565b602060405180830381600087803b15801561305857600080fd5b505af192505050801561308957506040513d601f19601f82011682018060405250810190613086919061396d565b60015b61310c573d80600081146130b9576040519150601f19603f3d011682016040523d82523d6000602084013e6130be565b606091505b50600081511415613104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fb9061418a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613161565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131c484610f59565b6131ce9190614574565b90506000600760008481526020019081526020016000205490508181146132b3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133389190614574565b9050600060096000848152602001908152602001600020549050600060088381548110613368576133676147f7565b5b90600052602060002001549050806008838154811061338a576133896147f7565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133d9576133d86147c8565b5b6001900381819060005260206000200160009055905550505050565b600061340083610f59565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134db906142aa565b60405180910390fd5b6134ed816121da565b1561352d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613524906141ca565b60405180910390fd5b61353960008383612e63565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135899190614493565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518061022001604052806011905b60608152602001906001900390816136655790505090565b60405180604001604052806002905b606081526020019060019003908161368c5790505090565b60006136b76136b28461440a565b6143e5565b9050828152602081018484840111156136d3576136d261485a565b5b6136de84828561461c565b509392505050565b6000813590506136f581614f79565b92915050565b60008135905061370a81614f90565b92915050565b60008135905061371f81614fa7565b92915050565b60008151905061373481614fa7565b92915050565b600082601f83011261374f5761374e614855565b5b813561375f8482602086016136a4565b91505092915050565b60008135905061377781614fbe565b92915050565b60006020828403121561379357613792614864565b5b60006137a1848285016136e6565b91505092915050565b600080604083850312156137c1576137c0614864565b5b60006137cf858286016136e6565b92505060206137e0858286016136e6565b9150509250929050565b60008060006060848603121561380357613802614864565b5b6000613811868287016136e6565b9350506020613822868287016136e6565b925050604061383386828701613768565b9150509250925092565b6000806000806080858703121561385757613856614864565b5b6000613865878288016136e6565b9450506020613876878288016136e6565b935050604061388787828801613768565b925050606085013567ffffffffffffffff8111156138a8576138a761485f565b5b6138b48782880161373a565b91505092959194509250565b600080604083850312156138d7576138d6614864565b5b60006138e5858286016136e6565b92505060206138f6858286016136fb565b9150509250929050565b6000806040838503121561391757613916614864565b5b6000613925858286016136e6565b925050602061393685828601613768565b9150509250929050565b60006020828403121561395657613955614864565b5b600061396484828501613710565b91505092915050565b60006020828403121561398357613982614864565b5b600061399184828501613725565b91505092915050565b6000602082840312156139b0576139af614864565b5b60006139be84828501613768565b91505092915050565b6139d0816145a8565b82525050565b6139df816145ba565b82525050565b60006139f082614450565b6139fa8185614466565b9350613a0a81856020860161462b565b613a1381614869565b840191505092915050565b6000613a298261445b565b613a338185614477565b9350613a4381856020860161462b565b613a4c81614869565b840191505092915050565b6000613a628261445b565b613a6c8185614488565b9350613a7c81856020860161462b565b80840191505092915050565b60008154613a958161465e565b613a9f8186614488565b94506001821660008114613aba5760018114613acb57613afe565b60ff19831686528186019350613afe565b613ad48561443b565b60005b83811015613af657815481890152600182019150602081019050613ad7565b838801955050505b50505092915050565b6000613b14602b83614477565b9150613b1f8261487a565b604082019050919050565b6000613b37603283614477565b9150613b42826148c9565b604082019050919050565b6000613b5a602683614477565b9150613b6582614918565b604082019050919050565b6000613b7d601c83614477565b9150613b8882614967565b602082019050919050565b6000613ba0602483614477565b9150613bab82614990565b604082019050919050565b6000613bc3601983614477565b9150613bce826149df565b602082019050919050565b6000613be6600283614488565b9150613bf182614a08565b600282019050919050565b6000613c09602c83614477565b9150613c1482614a31565b604082019050919050565b6000613c2c600183614488565b9150613c3782614a80565b600182019050919050565b6000613c4f603883614477565b9150613c5a82614aa9565b604082019050919050565b6000613c72600183614488565b9150613c7d82614af8565b600182019050919050565b6000613c95602a83614477565b9150613ca082614b21565b604082019050919050565b6000613cb8602983614477565b9150613cc382614b70565b604082019050919050565b6000613cdb600283614488565b9150613ce682614bbf565b600282019050919050565b6000613cfe602083614477565b9150613d0982614be8565b602082019050919050565b6000613d2160b783614488565b9150613d2c82614c11565b60b782019050919050565b6000613d44602c83614477565b9150613d4f82614cf8565b604082019050919050565b6000613d67602083614477565b9150613d7282614d47565b602082019050919050565b6000613d8a601083614477565b9150613d9582614d70565b602082019050919050565b6000613dad602983614477565b9150613db882614d99565b604082019050919050565b6000613dd0602183614477565b9150613ddb82614de8565b604082019050919050565b6000613df3601d83614488565b9150613dfe82614e37565b601d82019050919050565b6000613e16600383614488565b9150613e2182614e60565b600382019050919050565b6000613e39603183614477565b9150613e4482614e89565b604082019050919050565b6000613e5c601b83614488565b9150613e6782614ed8565b601b82019050919050565b6000613e7f602c83614477565b9150613e8a82614f01565b604082019050919050565b6000613ea2601f83614477565b9150613ead82614f50565b602082019050919050565b613ec181614612565b82525050565b6000613ed38284613a57565b915081905092915050565b6000613eea8285613a57565b9150613ef68284613a57565b91508190509392505050565b6000613f0e828c613a57565b9150613f1a828b613a57565b9150613f26828a613a57565b9150613f328289613a57565b9150613f3e8288613a57565b9150613f4a8287613a57565b9150613f568286613a57565b9150613f628285613a57565b9150613f6e8284613a57565b91508190509a9950505050505050505050565b6000613f8d8285613a57565b9150613f9882613c1f565b9150613fa48284613a88565b91508190509392505050565b6000613fbb82613c65565b9150613fc78286613a57565b9150613fd282613c1f565b9150613fde8285613a57565b9150613fe982613bd9565b9150613ff58284613a57565b9150819050949350505050565b600061400d82613c65565b91506140198286613a57565b915061402482613c1f565b91506140308285613a57565b915061403b82613bd9565b91506140478284613a57565b915061405282613e09565b9150819050949350505050565b600061406a82613de6565b91506140768284613a57565b915081905092915050565b600061408c82613e4f565b91506140988285613a57565b91506140a382613d14565b91506140af8284613a57565b91506140ba82613cce565b91508190509392505050565b60006020820190506140db60008301846139c7565b92915050565b60006080820190506140f660008301876139c7565b61410360208301866139c7565b6141106040830185613eb8565b818103606083015261412281846139e5565b905095945050505050565b600060208201905061414260008301846139d6565b92915050565b600060208201905081810360008301526141628184613a1e565b905092915050565b6000602082019050818103600083015261418381613b07565b9050919050565b600060208201905081810360008301526141a381613b2a565b9050919050565b600060208201905081810360008301526141c381613b4d565b9050919050565b600060208201905081810360008301526141e381613b70565b9050919050565b6000602082019050818103600083015261420381613b93565b9050919050565b6000602082019050818103600083015261422381613bb6565b9050919050565b6000602082019050818103600083015261424381613bfc565b9050919050565b6000602082019050818103600083015261426381613c42565b9050919050565b6000602082019050818103600083015261428381613c88565b9050919050565b600060208201905081810360008301526142a381613cab565b9050919050565b600060208201905081810360008301526142c381613cf1565b9050919050565b600060208201905081810360008301526142e381613d37565b9050919050565b6000602082019050818103600083015261430381613d5a565b9050919050565b6000602082019050818103600083015261432381613d7d565b9050919050565b6000602082019050818103600083015261434381613da0565b9050919050565b6000602082019050818103600083015261436381613dc3565b9050919050565b6000602082019050818103600083015261438381613e2c565b9050919050565b600060208201905081810360008301526143a381613e72565b9050919050565b600060208201905081810360008301526143c381613e95565b9050919050565b60006020820190506143df6000830184613eb8565b92915050565b60006143ef614400565b90506143fb8282614690565b919050565b6000604051905090565b600067ffffffffffffffff82111561442557614424614826565b5b61442e82614869565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061449e82614612565b91506144a983614612565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144de576144dd61473b565b5b828201905092915050565b60006144f482614612565b91506144ff83614612565b92508261450f5761450e61476a565b5b828204905092915050565b600061452582614612565b915061453083614612565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145695761456861473b565b5b828202905092915050565b600061457f82614612565b915061458a83614612565b92508282101561459d5761459c61473b565b5b828203905092915050565b60006145b3826145f2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561464957808201518184015260208101905061462e565b83811115614658576000848401525b50505050565b6000600282049050600182168061467657607f821691505b6020821081141561468a57614689614799565b5b50919050565b61469982614869565b810181811067ffffffffffffffff821117156146b8576146b7614826565b5b80604052505050565b60006146cc82614612565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146ff576146fe61473b565b5b600182019050919050565b600061471582614612565b915061472083614612565b9250826147305761472f61476a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f2220000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f222c20226465736372697074696f6e223a2022546f6f646c65204c6f6f74204260008201527f616720697320616e206f6666696369616c204e465420636f6c6c656374696f6e60208201527f20666f72207468652043727970746f6f646c652045636f73797374656d2e205460408201527f6865726520617265206f6e6c792031302c30303020546f6f646c65204c6f6f7460608201527f204261677320617661696c61626c652e222c2022696d616765223a202264617460808201527f613a696d6167652f7376672b786d6c3b6261736536342c00000000000000000060a082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f202b310000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f7b226e616d65223a2022546f6f646c65204c6f6f742042616720230000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614f82816145a8565b8114614f8d57600080fd5b50565b614f99816145ba565b8114614fa457600080fd5b50565b614fb0816145c6565b8114614fbb57600080fd5b50565b614fc781614612565b8114614fd257600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a206d656469756d737072696e67677265656e3b20666f6e742d66616d696c793a20436f7572696572204e65773b20666f6e742d73697a653a20313070783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22737465656c626c756522202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212206275f3dd7eb15a08da8171d18190afaa597ae88116e7b7d8c5737a2768b8030e64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063a22cb465116100a2578063d47f269e11610071578063d47f269e1461058a578063e985e9c5146105ba578063ef68075a146105ea578063f2fde38b1461061a576101cf565b8063a22cb465146104f2578063b88d4fde1461050e578063c08a5dd51461052a578063c87b56dd1461055a576101cf565b806395d89b41116100de57806395d89b41146104445780639720c969146104625780639bdc1b69146104925780639e41b73f146104c2576101cf565b806370a08231146103ec578063715018a61461041c5780638da5cb5b14610426576101cf565b80632f745c5911610171578063434f48c41161014b578063434f48c4146103405780634f6ccce71461035c5780636352211e1461038c57806367209aa8146103bc576101cf565b80632f745c59146102d8578063379607f51461030857806342842e0e14610324576101cf565b8063095ea7b3116101ad578063095ea7b3146102525780630e99990d1461026e57806318160ddd1461029e57806323b872dd146102bc576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e99190613940565b610636565b6040516101fb919061412d565b60405180910390f35b61020c6106b0565b6040516102199190614148565b60405180910390f35b61023c6004803603810190610237919061399a565b610742565b60405161024991906140c6565b60405180910390f35b61026c60048036038101906102679190613900565b6107c7565b005b6102886004803603810190610283919061399a565b6108df565b6040516102959190614148565b60405180910390f35b6102a66109f9565b6040516102b391906143ca565b60405180910390f35b6102d660048036038101906102d191906137ea565b610a06565b005b6102f260048036038101906102ed9190613900565b610a66565b6040516102ff91906143ca565b60405180910390f35b610322600480360381019061031d919061399a565b610b0b565b005b61033e600480360381019061033991906137ea565b610bc5565b005b61035a6004803603810190610355919061399a565b610be5565b005b6103766004803603810190610371919061399a565b610d1c565b60405161038391906143ca565b60405180910390f35b6103a660048036038101906103a1919061399a565b610d8d565b6040516103b391906140c6565b60405180910390f35b6103d660048036038101906103d1919061399a565b610e3f565b6040516103e39190614148565b60405180910390f35b6104066004803603810190610401919061377d565b610f59565b60405161041391906143ca565b60405180910390f35b610424611011565b005b61042e611099565b60405161043b91906140c6565b60405180910390f35b61044c6110c3565b6040516104599190614148565b60405180910390f35b61047c6004803603810190610477919061399a565b611155565b6040516104899190614148565b60405180910390f35b6104ac60048036038101906104a7919061399a565b61126f565b6040516104b99190614148565b60405180910390f35b6104dc60048036038101906104d7919061399a565b611389565b6040516104e99190614148565b60405180910390f35b61050c600480360381019061050791906138c0565b6114a3565b005b6105286004803603810190610523919061383d565b611624565b005b610544600480360381019061053f919061399a565b611686565b6040516105519190614148565b60405180910390f35b610574600480360381019061056f919061399a565b6117a0565b6040516105819190614148565b60405180910390f35b6105a4600480360381019061059f919061399a565b611d38565b6040516105b19190614148565b60405180910390f35b6105d460048036038101906105cf91906137aa565b611e52565b6040516105e1919061412d565b60405180910390f35b61060460048036038101906105ff919061399a565b611ee6565b6040516106119190614148565b60405180910390f35b610634600480360381019061062f919061377d565b612000565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106a957506106a8826120f8565b5b9050919050565b6060600080546106bf9061465e565b80601f01602080910402602001604051908101604052809291908181526020018280546106eb9061465e565b80156107385780601f1061070d57610100808354040283529160200191610738565b820191906000526020600020905b81548152906001019060200180831161071b57829003601f168201915b5050505050905090565b600061074d826121da565b61078c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610783906142ca565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107d282610d8d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083a9061434a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610862612246565b73ffffffffffffffffffffffffffffffffffffffff16148061089157506108908161088b612246565b611e52565b5b6108d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c79061424a565b60405180910390fd5b6108da838361224e565b505050565b60606109f2826040518060400160405280600481526020017f464f4f54000000000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b828210156109e957838290600052602060002001805461095c9061465e565b80601f01602080910402602001604051908101604052809291908181526020018280546109889061465e565b80156109d55780601f106109aa576101008083540402835291602001916109d5565b820191906000526020600020905b8154815290600101906020018083116109b857829003601f168201915b50505050508152602001906001019061093d565b50505050612307565b9050919050565b6000600880549050905090565b610a17610a11612246565b82612653565b610a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4d9061436a565b60405180910390fd5b610a61838383612731565b505050565b6000610a7183610f59565b8210610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa99061416a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a541415610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b48906143aa565b60405180910390fd5b6002600a81905550600081118015610b6a575061232881105b610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba09061430a565b60405180910390fd5b610bba610bb4612246565b8261298d565b6001600a8190555050565b610be083838360405180602001604052806000815250611624565b505050565b6002600a541415610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c22906143aa565b60405180910390fd5b6002600a81905550610c3b612246565b73ffffffffffffffffffffffffffffffffffffffff16610c59611099565b73ffffffffffffffffffffffffffffffffffffffff1614610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca6906142ea565b60405180910390fd5b61232781118015610cc1575061271181105b610d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf79061430a565b60405180910390fd5b610d11610d0b611099565b8261298d565b6001600a8190555050565b6000610d266109f9565b8210610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e9061438a565b60405180910390fd5b60088281548110610d7b57610d7a6147f7565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d9061428a565b60405180910390fd5b80915050919050565b6060610f52826040518060400160405280600481526020017f4e45434b000000000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015610f49578382906000526020600020018054610ebc9061465e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee89061465e565b8015610f355780601f10610f0a57610100808354040283529160200191610f35565b820191906000526020600020905b815481529060010190602001808311610f1857829003601f168201915b505050505081526020019060010190610e9d565b50505050612307565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc19061426a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611019612246565b73ffffffffffffffffffffffffffffffffffffffff16611037611099565b73ffffffffffffffffffffffffffffffffffffffff161461108d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611084906142ea565b60405180910390fd5b61109760006129ab565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546110d29061465e565b80601f01602080910402602001604051908101604052809291908181526020018280546110fe9061465e565b801561114b5780601f106111205761010080835404028352916020019161114b565b820191906000526020600020905b81548152906001019060200180831161112e57829003601f168201915b5050505050905090565b6060611268826040518060400160405280600481526020017f4845414400000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b8282101561125f5783829060005260206000200180546111d29061465e565b80601f01602080910402602001604051908101604052809291908181526020018280546111fe9061465e565b801561124b5780601f106112205761010080835404028352916020019161124b565b820191906000526020600020905b81548152906001019060200180831161122e57829003601f168201915b5050505050815260200190600101906111b3565b50505050612307565b9050919050565b6060611382826040518060400160405280600581526020017f5741495354000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b828210156113795783829060005260206000200180546112ec9061465e565b80601f01602080910402602001604051908101604052809291908181526020018280546113189061465e565b80156113655780601f1061133a57610100808354040283529160200191611365565b820191906000526020600020905b81548152906001019060200180831161134857829003601f168201915b5050505050815260200190600101906112cd565b50505050612307565b9050919050565b606061149c826040518060400160405280600681526020017f574541504f4e0000000000000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b828210156114935783829060005260206000200180546114069061465e565b80601f01602080910402602001604051908101604052809291908181526020018280546114329061465e565b801561147f5780601f106114545761010080835404028352916020019161147f565b820191906000526020600020905b81548152906001019060200180831161146257829003601f168201915b5050505050815260200190600101906113e7565b50505050612307565b9050919050565b6114ab612246565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611519576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115109061420a565b60405180910390fd5b8060056000611526612246565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115d3612246565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611618919061412d565b60405180910390a35050565b61163561162f612246565b83612653565b611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b9061436a565b60405180910390fd5b61168084848484612a71565b50505050565b6060611799826040518060400160405280600481526020017f52494e47000000000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b828210156117905783829060005260206000200180546117039061465e565b80601f016020809104026020016040519081016040528092919081815260200182805461172f9061465e565b801561177c5780601f106117515761010080835404028352916020019161177c565b820191906000526020600020905b81548152906001019060200180831161175f57829003601f168201915b5050505050815260200190600101906116e4565b50505050612307565b9050919050565b60606117aa613655565b604051806101400160405280610113815260200161510a6101139139816000601181106117da576117d96147f7565b5b60200201819052506117eb83611389565b816001601181106117ff576117fe6147f7565b5b602002018190525060405180606001604052806028815260200161521d6028913981600260118110611834576118336147f7565b5b602002018190525061184583611ee6565b81600360118110611859576118586147f7565b5b6020020181905250604051806060016040528060288152602001614fd6602891398160046011811061188e5761188d6147f7565b5b602002018190525061189f83611155565b816005601181106118b3576118b26147f7565b5b602002018190525060405180606001604052806028815260200161505060289139816006601181106118e8576118e76147f7565b5b60200201819052506118f98361126f565b8160076011811061190d5761190c6147f7565b5b60200201819052506040518060600160405280602981526020016150786029913981600860118110611942576119416147f7565b5b6020020181905250611953836108df565b81600960118110611967576119666147f7565b5b60200201819052506040518060600160405280602981526020016150276029913981600a6011811061199c5761199b6147f7565b5b60200201819052506119ad83611d38565b81600b601181106119c1576119c06147f7565b5b60200201819052506040518060600160405280602981526020016150a16029913981600c601181106119f6576119f56147f7565b5b6020020181905250611a0783610e3f565b81600d60118110611a1b57611a1a6147f7565b5b6020020181905250604051806060016040528060298152602001614ffe6029913981600e60118110611a5057611a4f6147f7565b5b6020020181905250611a6183611686565b81600f60118110611a7557611a746147f7565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081601060118110611ac757611ac66147f7565b5b6020020181905250600081600060118110611ae557611ae46147f7565b5b602002015182600160118110611afe57611afd6147f7565b5b602002015183600260118110611b1757611b166147f7565b5b602002015184600360118110611b3057611b2f6147f7565b5b602002015185600460118110611b4957611b486147f7565b5b602002015186600560118110611b6257611b616147f7565b5b602002015187600660118110611b7b57611b7a6147f7565b5b602002015188600760118110611b9457611b936147f7565b5b602002015189600860118110611bad57611bac6147f7565b5b6020020151604051602001611bca99989796959493929190613f02565b60405160208183030381529060405290508082600960118110611bf057611bef6147f7565b5b602002015183600a60118110611c0957611c086147f7565b5b602002015184600b60118110611c2257611c216147f7565b5b602002015185600c60118110611c3b57611c3a6147f7565b5b602002015186600d60118110611c5457611c536147f7565b5b602002015187600e60118110611c6d57611c6c6147f7565b5b602002015188600f60118110611c8657611c856147f7565b5b602002015189601060118110611c9f57611c9e6147f7565b5b6020020151604051602001611cbc99989796959493929190613f02565b60405160208183030381529060405290506000611d09611cdb86612acd565b611ce484612c2e565b604051602001611cf5929190614081565b604051602081830303815290604052612c2e565b905080604051602001611d1c919061405f565b6040516020818303038152906040529150819350505050919050565b6060611e4b826040518060400160405280600481526020017f48414e44000000000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b82821015611e42578382906000526020600020018054611db59061465e565b80601f0160208091040260200160405190810160405280929190818152602001828054611de19061465e565b8015611e2e5780601f10611e0357610100808354040283529160200191611e2e565b820191906000526020600020905b815481529060010190602001808311611e1157829003601f168201915b505050505081526020019060010190611d96565b50505050612307565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060611ff9826040518060400160405280600581526020017f4348455354000000000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b82821015611ff0578382906000526020600020018054611f639061465e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8f9061465e565b8015611fdc5780601f10611fb157610100808354040283529160200191611fdc565b820191906000526020600020905b815481529060010190602001808311611fbf57829003601f168201915b505050505081526020019060010190611f44565b50505050612307565b9050919050565b612008612246565b73ffffffffffffffffffffffffffffffffffffffff16612026611099565b73ffffffffffffffffffffffffffffffffffffffff161461207c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612073906142ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e3906141aa565b60405180910390fd5b6120f5816129ab565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121c357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121d357506121d282612dc6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122c183610d8d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060600061233d8461231887612acd565b604051602001612329929190613ede565b604051602081830303815290604052612e30565b905060008384518361234f919061470a565b815181106123605761235f6147f7565b5b602002602001015190506000601583612379919061470a565b9050600e8111156123d557816014808054905085612397919061470a565b815481106123a8576123a76147f7565b5b906000526020600020016040516020016123c3929190613f81565b60405160208183030381529060405291505b60138110612646576123e561367d565b60158080549050856123f7919061470a565b81548110612408576124076147f7565b5b90600052602060002001805461241d9061465e565b80601f01602080910402602001604051908101604052809291908181526020018280546124499061465e565b80156124965780601f1061246b57610100808354040283529160200191612496565b820191906000526020600020905b81548152906001019060200180831161247957829003601f168201915b5050505050816000600281106124af576124ae6147f7565b5b602002018190525060168080549050856124c9919061470a565b815481106124da576124d96147f7565b5b9060005260206000200180546124ef9061465e565b80601f016020809104026020016040519081016040528092919081815260200182805461251b9061465e565b80156125685780601f1061253d57610100808354040283529160200191612568565b820191906000526020600020905b81548152906001019060200180831161254b57829003601f168201915b505050505081600160028110612581576125806147f7565b5b602002018190525060138214156125ed57806000600281106125a6576125a56147f7565b5b6020020151816001600281106125bf576125be6147f7565b5b6020020151846040516020016125d793929190613fb0565b6040516020818303038152906040529250612644565b80600060028110612601576126006147f7565b5b60200201518160016002811061261a576126196147f7565b5b60200201518460405160200161263293929190614002565b60405160208183030381529060405292505b505b8193505050509392505050565b600061265e826121da565b61269d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126949061422a565b60405180910390fd5b60006126a883610d8d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061271757508373ffffffffffffffffffffffffffffffffffffffff166126ff84610742565b73ffffffffffffffffffffffffffffffffffffffff16145b8061272857506127278185611e52565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661275182610d8d565b73ffffffffffffffffffffffffffffffffffffffff16146127a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279e9061432a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280e906141ea565b60405180910390fd5b612822838383612e63565b61282d60008261224e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461287d9190614574565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128d49190614493565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6129a7828260405180602001604052806000815250612f77565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a7c848484612731565b612a8884848484612fd2565b612ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abe9061418a565b60405180910390fd5b50505050565b60606000821415612b15576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c29565b600082905060005b60008214612b47578080612b30906146c1565b915050600a82612b4091906144e9565b9150612b1d565b60008167ffffffffffffffff811115612b6357612b62614826565b5b6040519080825280601f01601f191660200182016040528015612b955781602001600182028036833780820191505090505b5090505b60008514612c2257600182612bae9190614574565b9150600a85612bbd919061470a565b6030612bc99190614493565b60f81b818381518110612bdf57612bde6147f7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c1b91906144e9565b9450612b99565b8093505050505b919050565b60606000825190506000811415612c575760405180602001604052806000815250915050612dc1565b60006003600283612c689190614493565b612c7291906144e9565b6004612c7e919061451a565b90506000602082612c8f9190614493565b67ffffffffffffffff811115612ca857612ca7614826565b5b6040519080825280601f01601f191660200182016040528015612cda5781602001600182028036833780820191505090505b50905060006040518060600160405280604081526020016150ca604091399050600181016020830160005b86811015612d7e5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612d05565b506003860660018114612d985760028114612da857612db3565b613d3d60f01b6002830352612db3565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081604051602001612e439190613ec7565b6040516020818303038152906040528051906020012060001c9050919050565b612e6e838383613169565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612eb157612eac8161316e565b612ef0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612eef57612eee83826131b7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f3357612f2e81613324565b612f72565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f7157612f7082826133f5565b5b5b505050565b612f818383613474565b612f8e6000848484612fd2565b612fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc49061418a565b60405180910390fd5b505050565b6000612ff38473ffffffffffffffffffffffffffffffffffffffff16613642565b1561315c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261301c612246565b8786866040518563ffffffff1660e01b815260040161303e94939291906140e1565b602060405180830381600087803b15801561305857600080fd5b505af192505050801561308957506040513d601f19601f82011682018060405250810190613086919061396d565b60015b61310c573d80600081146130b9576040519150601f19603f3d011682016040523d82523d6000602084013e6130be565b606091505b50600081511415613104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fb9061418a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613161565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131c484610f59565b6131ce9190614574565b90506000600760008481526020019081526020016000205490508181146132b3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133389190614574565b9050600060096000848152602001908152602001600020549050600060088381548110613368576133676147f7565b5b90600052602060002001549050806008838154811061338a576133896147f7565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133d9576133d86147c8565b5b6001900381819060005260206000200160009055905550505050565b600061340083610f59565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134db906142aa565b60405180910390fd5b6134ed816121da565b1561352d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613524906141ca565b60405180910390fd5b61353960008383612e63565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135899190614493565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518061022001604052806011905b60608152602001906001900390816136655790505090565b60405180604001604052806002905b606081526020019060019003908161368c5790505090565b60006136b76136b28461440a565b6143e5565b9050828152602081018484840111156136d3576136d261485a565b5b6136de84828561461c565b509392505050565b6000813590506136f581614f79565b92915050565b60008135905061370a81614f90565b92915050565b60008135905061371f81614fa7565b92915050565b60008151905061373481614fa7565b92915050565b600082601f83011261374f5761374e614855565b5b813561375f8482602086016136a4565b91505092915050565b60008135905061377781614fbe565b92915050565b60006020828403121561379357613792614864565b5b60006137a1848285016136e6565b91505092915050565b600080604083850312156137c1576137c0614864565b5b60006137cf858286016136e6565b92505060206137e0858286016136e6565b9150509250929050565b60008060006060848603121561380357613802614864565b5b6000613811868287016136e6565b9350506020613822868287016136e6565b925050604061383386828701613768565b9150509250925092565b6000806000806080858703121561385757613856614864565b5b6000613865878288016136e6565b9450506020613876878288016136e6565b935050604061388787828801613768565b925050606085013567ffffffffffffffff8111156138a8576138a761485f565b5b6138b48782880161373a565b91505092959194509250565b600080604083850312156138d7576138d6614864565b5b60006138e5858286016136e6565b92505060206138f6858286016136fb565b9150509250929050565b6000806040838503121561391757613916614864565b5b6000613925858286016136e6565b925050602061393685828601613768565b9150509250929050565b60006020828403121561395657613955614864565b5b600061396484828501613710565b91505092915050565b60006020828403121561398357613982614864565b5b600061399184828501613725565b91505092915050565b6000602082840312156139b0576139af614864565b5b60006139be84828501613768565b91505092915050565b6139d0816145a8565b82525050565b6139df816145ba565b82525050565b60006139f082614450565b6139fa8185614466565b9350613a0a81856020860161462b565b613a1381614869565b840191505092915050565b6000613a298261445b565b613a338185614477565b9350613a4381856020860161462b565b613a4c81614869565b840191505092915050565b6000613a628261445b565b613a6c8185614488565b9350613a7c81856020860161462b565b80840191505092915050565b60008154613a958161465e565b613a9f8186614488565b94506001821660008114613aba5760018114613acb57613afe565b60ff19831686528186019350613afe565b613ad48561443b565b60005b83811015613af657815481890152600182019150602081019050613ad7565b838801955050505b50505092915050565b6000613b14602b83614477565b9150613b1f8261487a565b604082019050919050565b6000613b37603283614477565b9150613b42826148c9565b604082019050919050565b6000613b5a602683614477565b9150613b6582614918565b604082019050919050565b6000613b7d601c83614477565b9150613b8882614967565b602082019050919050565b6000613ba0602483614477565b9150613bab82614990565b604082019050919050565b6000613bc3601983614477565b9150613bce826149df565b602082019050919050565b6000613be6600283614488565b9150613bf182614a08565b600282019050919050565b6000613c09602c83614477565b9150613c1482614a31565b604082019050919050565b6000613c2c600183614488565b9150613c3782614a80565b600182019050919050565b6000613c4f603883614477565b9150613c5a82614aa9565b604082019050919050565b6000613c72600183614488565b9150613c7d82614af8565b600182019050919050565b6000613c95602a83614477565b9150613ca082614b21565b604082019050919050565b6000613cb8602983614477565b9150613cc382614b70565b604082019050919050565b6000613cdb600283614488565b9150613ce682614bbf565b600282019050919050565b6000613cfe602083614477565b9150613d0982614be8565b602082019050919050565b6000613d2160b783614488565b9150613d2c82614c11565b60b782019050919050565b6000613d44602c83614477565b9150613d4f82614cf8565b604082019050919050565b6000613d67602083614477565b9150613d7282614d47565b602082019050919050565b6000613d8a601083614477565b9150613d9582614d70565b602082019050919050565b6000613dad602983614477565b9150613db882614d99565b604082019050919050565b6000613dd0602183614477565b9150613ddb82614de8565b604082019050919050565b6000613df3601d83614488565b9150613dfe82614e37565b601d82019050919050565b6000613e16600383614488565b9150613e2182614e60565b600382019050919050565b6000613e39603183614477565b9150613e4482614e89565b604082019050919050565b6000613e5c601b83614488565b9150613e6782614ed8565b601b82019050919050565b6000613e7f602c83614477565b9150613e8a82614f01565b604082019050919050565b6000613ea2601f83614477565b9150613ead82614f50565b602082019050919050565b613ec181614612565b82525050565b6000613ed38284613a57565b915081905092915050565b6000613eea8285613a57565b9150613ef68284613a57565b91508190509392505050565b6000613f0e828c613a57565b9150613f1a828b613a57565b9150613f26828a613a57565b9150613f328289613a57565b9150613f3e8288613a57565b9150613f4a8287613a57565b9150613f568286613a57565b9150613f628285613a57565b9150613f6e8284613a57565b91508190509a9950505050505050505050565b6000613f8d8285613a57565b9150613f9882613c1f565b9150613fa48284613a88565b91508190509392505050565b6000613fbb82613c65565b9150613fc78286613a57565b9150613fd282613c1f565b9150613fde8285613a57565b9150613fe982613bd9565b9150613ff58284613a57565b9150819050949350505050565b600061400d82613c65565b91506140198286613a57565b915061402482613c1f565b91506140308285613a57565b915061403b82613bd9565b91506140478284613a57565b915061405282613e09565b9150819050949350505050565b600061406a82613de6565b91506140768284613a57565b915081905092915050565b600061408c82613e4f565b91506140988285613a57565b91506140a382613d14565b91506140af8284613a57565b91506140ba82613cce565b91508190509392505050565b60006020820190506140db60008301846139c7565b92915050565b60006080820190506140f660008301876139c7565b61410360208301866139c7565b6141106040830185613eb8565b818103606083015261412281846139e5565b905095945050505050565b600060208201905061414260008301846139d6565b92915050565b600060208201905081810360008301526141628184613a1e565b905092915050565b6000602082019050818103600083015261418381613b07565b9050919050565b600060208201905081810360008301526141a381613b2a565b9050919050565b600060208201905081810360008301526141c381613b4d565b9050919050565b600060208201905081810360008301526141e381613b70565b9050919050565b6000602082019050818103600083015261420381613b93565b9050919050565b6000602082019050818103600083015261422381613bb6565b9050919050565b6000602082019050818103600083015261424381613bfc565b9050919050565b6000602082019050818103600083015261426381613c42565b9050919050565b6000602082019050818103600083015261428381613c88565b9050919050565b600060208201905081810360008301526142a381613cab565b9050919050565b600060208201905081810360008301526142c381613cf1565b9050919050565b600060208201905081810360008301526142e381613d37565b9050919050565b6000602082019050818103600083015261430381613d5a565b9050919050565b6000602082019050818103600083015261432381613d7d565b9050919050565b6000602082019050818103600083015261434381613da0565b9050919050565b6000602082019050818103600083015261436381613dc3565b9050919050565b6000602082019050818103600083015261438381613e2c565b9050919050565b600060208201905081810360008301526143a381613e72565b9050919050565b600060208201905081810360008301526143c381613e95565b9050919050565b60006020820190506143df6000830184613eb8565b92915050565b60006143ef614400565b90506143fb8282614690565b919050565b6000604051905090565b600067ffffffffffffffff82111561442557614424614826565b5b61442e82614869565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061449e82614612565b91506144a983614612565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144de576144dd61473b565b5b828201905092915050565b60006144f482614612565b91506144ff83614612565b92508261450f5761450e61476a565b5b828204905092915050565b600061452582614612565b915061453083614612565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145695761456861473b565b5b828202905092915050565b600061457f82614612565b915061458a83614612565b92508282101561459d5761459c61473b565b5b828203905092915050565b60006145b3826145f2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561464957808201518184015260208101905061462e565b83811115614658576000848401525b50505050565b6000600282049050600182168061467657607f821691505b6020821081141561468a57614689614799565b5b50919050565b61469982614869565b810181811067ffffffffffffffff821117156146b8576146b7614826565b5b80604052505050565b60006146cc82614612565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146ff576146fe61473b565b5b600182019050919050565b600061471582614612565b915061472083614612565b9250826147305761472f61476a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f2220000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f222c20226465736372697074696f6e223a2022546f6f646c65204c6f6f74204260008201527f616720697320616e206f6666696369616c204e465420636f6c6c656374696f6e60208201527f20666f72207468652043727970746f6f646c652045636f73797374656d2e205460408201527f6865726520617265206f6e6c792031302c30303020546f6f646c65204c6f6f7460608201527f204261677320617661696c61626c652e222c2022696d616765223a202264617460808201527f613a696d6167652f7376672b786d6c3b6261736536342c00000000000000000060a082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f202b310000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f7b226e616d65223a2022546f6f646c65204c6f6f742042616720230000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614f82816145a8565b8114614f8d57600080fd5b50565b614f99816145ba565b8114614fa457600080fd5b50565b614fb0816145c6565b8114614fbb57600080fd5b50565b614fc781614612565b8114614fd257600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a206d656469756d737072696e67677265656e3b20666f6e742d66616d696c793a20436f7572696572204e65773b20666f6e742d73697a653a20313070783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22737465656c626c756522202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212206275f3dd7eb15a08da8171d18190afaa597ae88116e7b7d8c5737a2768b8030e64736f6c63430008070033

Deployed Bytecode Sourcemap

44571:9671:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38421:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25535:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27094:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26617:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49509:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39061:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27984:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38729:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53071:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28394:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53255:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39251:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25229:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49791:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24959:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9927:94;;;:::i;:::-;;9276:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25704:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49228:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49369:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48941:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27387:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28650:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49932:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51047:2016;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49650:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27753:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49084:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10176:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38421:224;38523:4;38562:35;38547:50;;;:11;:50;;;;:90;;;;38601:36;38625:11;38601:23;:36::i;:::-;38547:90;38540:97;;38421:224;;;:::o;25535:100::-;25589:13;25622:5;25615:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25535:100;:::o;27094:221::-;27170:7;27198:16;27206:7;27198;:16::i;:::-;27190:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27283:15;:24;27299:7;27283:24;;;;;;;;;;;;;;;;;;;;;27276:31;;27094:221;;;:::o;26617:411::-;26698:13;26714:23;26729:7;26714:14;:23::i;:::-;26698:39;;26762:5;26756:11;;:2;:11;;;;26748:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26856:5;26840:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26865:37;26882:5;26889:12;:10;:12::i;:::-;26865:16;:37::i;:::-;26840:62;26818:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26999:21;27008:2;27012:7;26999:8;:21::i;:::-;26687:341;26617:411;;:::o;49509:129::-;49564:13;49597:33;49603:7;49597:33;;;;;;;;;;;;;;;;;49620:9;49597:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;49590:40;;49509:129;;;:::o;39061:113::-;39122:7;39149:10;:17;;;;39142:24;;39061:113;:::o;27984:339::-;28179:41;28198:12;:10;:12::i;:::-;28212:7;28179:18;:41::i;:::-;28171:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28287:28;28297:4;28303:2;28307:7;28287:9;:28::i;:::-;27984:339;;;:::o;38729:256::-;38826:7;38862:23;38879:5;38862:16;:23::i;:::-;38854:5;:31;38846:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38951:12;:19;38964:5;38951:19;;;;;;;;;;;;;;;:26;38971:5;38951:26;;;;;;;;;;;;38944:33;;38729:256;;;;:::o;53071:172::-;12215:1;12811:7;;:19;;12803:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12215:1;12944:7;:18;;;;53152:1:::1;53142:7;:11;:29;;;;;53167:4;53157:7;:14;53142:29;53134:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53203:32;53213:12;:10;:12::i;:::-;53227:7;53203:9;:32::i;:::-;12171:1:::0;13123:7;:22;;;;53071:172;:::o;28394:185::-;28532:39;28549:4;28555:2;28559:7;28532:39;;;;;;;;;;;;:16;:39::i;:::-;28394:185;;;:::o;53255:186::-;12215:1;12811:7;;:19;;12803:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12215:1;12944:7;:18;;;;9507:12:::1;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53351:4:::2;53341:7;:14;:33;;;;;53369:5;53359:7;:15;53341:33;53333:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;53406:27;53416:7;:5;:7::i;:::-;53425;53406:9;:27::i;:::-;12171:1:::0;13123:7;:22;;;;53255:186;:::o;39251:233::-;39326:7;39362:30;:28;:30::i;:::-;39354:5;:38;39346:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39459:10;39470:5;39459:17;;;;;;;;:::i;:::-;;;;;;;;;;39452:24;;39251:233;;;:::o;25229:239::-;25301:7;25321:13;25337:7;:16;25345:7;25337:16;;;;;;;;;;;;;;;;;;;;;25321:32;;25389:1;25372:19;;:5;:19;;;;25364:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25455:5;25448:12;;;25229:239;;;:::o;49791:129::-;49846:13;49879:33;49885:7;49879:33;;;;;;;;;;;;;;;;;49902:9;49879:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;49872:40;;49791:129;;;:::o;24959:208::-;25031:7;25076:1;25059:19;;:5;:19;;;;25051:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25143:9;:16;25153:5;25143:16;;;;;;;;;;;;;;;;25136:23;;24959:208;;;:::o;9927:94::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9992:21:::1;10010:1;9992:9;:21::i;:::-;9927:94::o:0;9276:87::-;9322:7;9349:6;;;;;;;;;;;9342:13;;9276:87;:::o;25704:104::-;25760:13;25793:7;25786:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25704:104;:::o;49228:129::-;49283:13;49316:33;49322:7;49316:33;;;;;;;;;;;;;;;;;49339:9;49316:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;49309:40;;49228:129;;;:::o;49369:132::-;49425:13;49458:35;49464:7;49458:35;;;;;;;;;;;;;;;;;49482:10;49458:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:35::i;:::-;49451:42;;49369:132;;;:::o;48941:131::-;48998:13;49031:33;49037:7;49031:33;;;;;;;;;;;;;;;;;49056:7;49031:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;49024:40;;48941:131;;;:::o;27387:295::-;27502:12;:10;:12::i;:::-;27490:24;;:8;:24;;;;27482:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27602:8;27557:18;:32;27576:12;:10;:12::i;:::-;27557:32;;;;;;;;;;;;;;;:42;27590:8;27557:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27655:8;27626:48;;27641:12;:10;:12::i;:::-;27626:48;;;27665:8;27626:48;;;;;;:::i;:::-;;;;;;;;27387:295;;:::o;28650:328::-;28825:41;28844:12;:10;:12::i;:::-;28858:7;28825:18;:41::i;:::-;28817:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28931:39;28945:4;28951:2;28955:7;28964:5;28931:13;:39::i;:::-;28650:328;;;;:::o;49932:125::-;49987:13;50020:29;50026:7;50020:29;;;;;;;;;;;;;;;;;50043:5;50020:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:29::i;:::-;50013:36;;49932:125;;;:::o;51047:2016::-;51112:13;51138:23;;:::i;:::-;51172:288;;;;;;;;;;;;;;;;;:5;51178:1;51172:8;;;;;;;:::i;:::-;;;;;:288;;;;51484:18;51494:7;51484:9;:18::i;:::-;51473:5;51479:1;51473:8;;;;;;;:::i;:::-;;;;;:29;;;;51515:53;;;;;;;;;;;;;;;;;:5;51521:1;51515:8;;;;;;;:::i;:::-;;;;;:53;;;;51592:17;51601:7;51592:8;:17::i;:::-;51581:5;51587:1;51581:8;;;;;;;:::i;:::-;;;;;:28;;;;51622:53;;;;;;;;;;;;;;;;;:5;51628:1;51622:8;;;;;;;:::i;:::-;;;;;:53;;;;51699:16;51707:7;51699;:16::i;:::-;51688:5;51694:1;51688:8;;;;;;;:::i;:::-;;;;;:27;;;;51728:53;;;;;;;;;;;;;;;;;:5;51734:1;51728:8;;;;;;;:::i;:::-;;;;;:53;;;;51805:17;51814:7;51805:8;:17::i;:::-;51794:5;51800:1;51794:8;;;;;;;:::i;:::-;;;;;:28;;;;51835:54;;;;;;;;;;;;;;;;;:5;51841:1;51835:8;;;;;;;:::i;:::-;;;;;:54;;;;51913:16;51921:7;51913;:16::i;:::-;51902:5;51908:1;51902:8;;;;;;;:::i;:::-;;;;;:27;;;;51942:55;;;;;;;;;;;;;;;;;:5;51948:2;51942:9;;;;;;;:::i;:::-;;;;;:55;;;;52022:16;52030:7;52022;:16::i;:::-;52010:5;52016:2;52010:9;;;;;;;:::i;:::-;;;;;:28;;;;52051:55;;;;;;;;;;;;;;;;;:5;52057:2;52051:9;;;;;;;:::i;:::-;;;;;:55;;;;52131:16;52139:7;52131;:16::i;:::-;52119:5;52125:2;52119:9;;;;;;;:::i;:::-;;;;;:28;;;;52160:55;;;;;;;;;;;;;;;;;:5;52166:2;52160:9;;;;;;;:::i;:::-;;;;;:55;;;;52240:16;52248:7;52240;:16::i;:::-;52228:5;52234:2;52228:9;;;;;;;:::i;:::-;;;;;:28;;;;52269:27;;;;;;;;;;;;;;;;;:5;52275:2;52269:9;;;;;;;:::i;:::-;;;;;:27;;;;52309:20;52356:5;52362:1;52356:8;;;;;;;:::i;:::-;;;;;;52366:5;52372:1;52366:8;;;;;;;:::i;:::-;;;;;;52376:5;52382:1;52376:8;;;;;;;:::i;:::-;;;;;;52386:5;52392:1;52386:8;;;;;;;:::i;:::-;;;;;;52396:5;52402:1;52396:8;;;;;;;:::i;:::-;;;;;;52406:5;52412:1;52406:8;;;;;;;:::i;:::-;;;;;;52416:5;52422:1;52416:8;;;;;;;:::i;:::-;;;;;;52426:5;52432:1;52426:8;;;;;;;:::i;:::-;;;;;;52436:5;52442:1;52436:8;;;;;;;:::i;:::-;;;;;;52339:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52309:137;;52490:6;52498:5;52504:1;52498:8;;;;;;;:::i;:::-;;;;;;52508:5;52514:2;52508:9;;;;;;;:::i;:::-;;;;;;52519:5;52525:2;52519:9;;;;;;;:::i;:::-;;;;;;52530:5;52536:2;52530:9;;;;;;;:::i;:::-;;;;;;52541:5;52547:2;52541:9;;;;;;;:::i;:::-;;;;;;52552:5;52558:2;52552:9;;;;;;;:::i;:::-;;;;;;52563:5;52569:2;52563:9;;;;;;;:::i;:::-;;;;;;52574:5;52580:2;52574:9;;;;;;;:::i;:::-;;;;;;52473:111;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52457:128;;52606:18;52627:319;52702:17;52711:7;52702:8;:17::i;:::-;52908:28;52928:6;52908:13;:28::i;:::-;52654:289;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52627:13;:319::i;:::-;52606:340;;53023:4;52973:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;52957:72;;53049:6;53042:13;;;;;51047:2016;;;:::o;49650:129::-;49705:13;49738:33;49744:7;49738:33;;;;;;;;;;;;;;;;;49761:9;49738:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;49731:40;;49650:129;;;:::o;27753:164::-;27850:4;27874:18;:25;27893:5;27874:25;;;;;;;;;;;;;;;:35;27900:8;27874:35;;;;;;;;;;;;;;;;;;;;;;;;;27867:42;;27753:164;;;;:::o;49084:132::-;49140:13;49173:35;49179:7;49173:35;;;;;;;;;;;;;;;;;49197:10;49173:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:35::i;:::-;49166:42;;49084:132;;;:::o;10176:192::-;9507:12;:10;:12::i;:::-;9496:23;;:7;:5;:7::i;:::-;:23;;;9488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10285:1:::1;10265:22;;:8;:22;;;;10257:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10341:19;10351:8;10341:9;:19::i;:::-;10176:192:::0;:::o;24590:305::-;24692:4;24744:25;24729:40;;;:11;:40;;;;:105;;;;24801:33;24786:48;;;:11;:48;;;;24729:105;:158;;;;24851:36;24875:11;24851:23;:36::i;:::-;24729:158;24709:178;;24590:305;;;:::o;30488:127::-;30553:4;30605:1;30577:30;;:7;:16;30585:7;30577:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30570:37;;30488:127;;;:::o;8136:98::-;8189:7;8216:10;8209:17;;8136:98;:::o;34470:174::-;34572:2;34545:15;:24;34561:7;34545:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34628:7;34624:2;34590:46;;34599:23;34614:7;34599:14;:23::i;:::-;34590:46;;;;;;;;;;;;34470:174;;:::o;50069:970::-;50178:13;50204:12;50219:62;50250:9;50261:17;50270:7;50261:8;:17::i;:::-;50233:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50219:6;:62::i;:::-;50204:77;;50292:20;50315:11;50334;:18;50327:4;:25;;;;:::i;:::-;50315:38;;;;;;;;:::i;:::-;;;;;;;;50292:61;;50364:17;50391:2;50384:4;:9;;;;:::i;:::-;50364:29;;50420:2;50408:9;:14;50404:127;;;50472:6;50485:8;50501;:15;;;;50494:4;:22;;;;:::i;:::-;50485:32;;;;;;;;:::i;:::-;;;;;;;;;50455:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50439:80;;50404:127;50558:2;50545:9;:15;50541:467;;50577:21;;:::i;:::-;50623:12;50643;:19;;;;50636:4;:26;;;;:::i;:::-;50623:40;;;;;;;;:::i;:::-;;;;;;;;;50613:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;50618:1;50613:7;;;;;;;:::i;:::-;;;;;:50;;;;50688:12;50708;:19;;;;50701:4;:26;;;;:::i;:::-;50688:40;;;;;;;;:::i;:::-;;;;;;;;;50678:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;50683:1;50678:7;;;;;;;:::i;:::-;;;;;:50;;;;50760:2;50747:9;:15;50743:254;;;50821:4;50826:1;50821:7;;;;;;;:::i;:::-;;;;;;50835:4;50840:1;50835:7;;;;;;;:::i;:::-;;;;;;50850:6;50799:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50783:75;;50743:254;;;50937:4;50942:1;50937:7;;;;;;;:::i;:::-;;;;;;50951:4;50956:1;50951:7;;;;;;;:::i;:::-;;;;;;50966:6;50915:65;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50899:82;;50743:254;50562:446;50541:467;51025:6;51018:13;;;;;50069:970;;;;;:::o;30782:348::-;30875:4;30900:16;30908:7;30900;:16::i;:::-;30892:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30976:13;30992:23;31007:7;30992:14;:23::i;:::-;30976:39;;31045:5;31034:16;;:7;:16;;;:51;;;;31078:7;31054:31;;:20;31066:7;31054:11;:20::i;:::-;:31;;;31034:51;:87;;;;31089:32;31106:5;31113:7;31089:16;:32::i;:::-;31034:87;31026:96;;;30782:348;;;;:::o;33774:578::-;33933:4;33906:31;;:23;33921:7;33906:14;:23::i;:::-;:31;;;33898:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34016:1;34002:16;;:2;:16;;;;33994:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34072:39;34093:4;34099:2;34103:7;34072:20;:39::i;:::-;34176:29;34193:1;34197:7;34176:8;:29::i;:::-;34237:1;34218:9;:15;34228:4;34218:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34266:1;34249:9;:13;34259:2;34249:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34297:2;34278:7;:16;34286:7;34278:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34336:7;34332:2;34317:27;;34326:4;34317:27;;;;;;;;;;;;33774:578;;;:::o;31472:110::-;31548:26;31558:2;31562:7;31548:26;;;;;;;;;;;;:9;:26::i;:::-;31472:110;;:::o;10376:173::-;10432:16;10451:6;;;;;;;;;;;10432:25;;10477:8;10468:6;;:17;;;;;;;;;;;;;;;;;;10532:8;10501:40;;10522:8;10501:40;;;;;;;;;;;;10421:128;10376:173;:::o;29860:315::-;30017:28;30027:4;30033:2;30037:7;30017:9;:28::i;:::-;30064:48;30087:4;30093:2;30097:7;30106:5;30064:22;:48::i;:::-;30056:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29860:315;;;;:::o;53453:715::-;53509:13;53731:1;53722:5;:10;53718:53;;;53749:10;;;;;;;;;;;;;;;;;;;;;53718:53;53781:12;53796:5;53781:20;;53812:14;53837:78;53852:1;53844:4;:9;53837:78;;53870:8;;;;;:::i;:::-;;;;53901:2;53893:10;;;;;:::i;:::-;;;53837:78;;;53925:19;53957:6;53947:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53925:39;;53975:154;53991:1;53982:5;:10;53975:154;;54019:1;54009:11;;;;;:::i;:::-;;;54086:2;54078:5;:10;;;;:::i;:::-;54065:2;:24;;;;:::i;:::-;54052:39;;54035:6;54042;54035:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;54115:2;54106:11;;;;;:::i;:::-;;;53975:154;;;54153:6;54139:21;;;;;53453:715;;;;:::o;54593:1607::-;54651:13;54677:11;54691:4;:11;54677:25;;54724:1;54717:3;:8;54713:23;;;54727:9;;;;;;;;;;;;;;;;;54713:23;54788:18;54826:1;54821;54815:3;:7;;;;:::i;:::-;54814:13;;;;:::i;:::-;54809:1;:19;;;;:::i;:::-;54788:40;;54886:19;54931:2;54918:10;:15;;;;:::i;:::-;54908:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54886:48;;54947:18;54968:5;;;;;;;;;;;;;;;;;54947:26;;55037:1;55030:5;55026:13;55082:2;55074:6;55070:15;55133:1;55101:777;55156:3;55153:1;55150:10;55101:777;;;55211:1;55208;55204:9;55199:14;;55269:8;55264:1;55258:4;55254:12;55248:19;55244:34;55349:4;55341:5;55337:2;55333:14;55329:25;55319:8;55315:40;55309:47;55388:3;55385:1;55381:11;55374:18;;55479:4;55470;55462:5;55458:2;55454:14;55450:25;55440:8;55436:40;55430:47;55426:58;55421:3;55417:68;55410:75;;55517:3;55514:1;55510:11;55503:18;;55607:4;55598;55590:5;55587:1;55583:13;55579:24;55569:8;55565:39;55559:46;55555:57;55550:3;55546:67;55539:74;;55645:3;55642:1;55638:11;55631:18;;55727:4;55718;55711:5;55707:16;55697:8;55693:31;55687:38;55683:49;55678:3;55674:59;55667:66;;55767:3;55762;55758:13;55751:20;;55809:3;55798:9;55791:22;55861:1;55850:9;55846:17;55833:30;;55180:698;;55101:777;;;55105:44;55910:1;55905:3;55901:11;55931:1;55926:84;;;;56029:1;56024:82;;;;55894:212;;55926:84;55987:6;55982:3;55978:16;55974:1;55963:9;55959:17;55952:43;55926:84;;56024:82;56085:4;56080:3;56076:14;56072:1;56061:9;56057:17;56050:41;55894:212;;56137:10;56129:6;56122:26;54995:1164;;56185:6;56171:21;;;;;;54593:1607;;;;:::o;23197:157::-;23282:4;23321:25;23306:40;;;:11;:40;;;;23299:47;;23197:157;;;:::o;48791:138::-;48851:7;48913:5;48896:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;48886:34;;;;;;48878:43;;48871:50;;48791:138;;;:::o;40097:589::-;40241:45;40268:4;40274:2;40278:7;40241:26;:45::i;:::-;40319:1;40303:18;;:4;:18;;;40299:187;;;40338:40;40370:7;40338:31;:40::i;:::-;40299:187;;;40408:2;40400:10;;:4;:10;;;40396:90;;40427:47;40460:4;40466:7;40427:32;:47::i;:::-;40396:90;40299:187;40514:1;40500:16;;:2;:16;;;40496:183;;;40533:45;40570:7;40533:36;:45::i;:::-;40496:183;;;40606:4;40600:10;;:2;:10;;;40596:83;;40627:40;40655:2;40659:7;40627:27;:40::i;:::-;40596:83;40496:183;40097:589;;;:::o;31809:321::-;31939:18;31945:2;31949:7;31939:5;:18::i;:::-;31990:54;32021:1;32025:2;32029:7;32038:5;31990:22;:54::i;:::-;31968:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31809:321;;;:::o;35209:803::-;35364:4;35385:15;:2;:13;;;:15::i;:::-;35381:624;;;35437:2;35421:36;;;35458:12;:10;:12::i;:::-;35472:4;35478:7;35487:5;35421:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35417:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35684:1;35667:6;:13;:18;35663:272;;;35710:60;;;;;;;;;;:::i;:::-;;;;;;;;35663:272;35885:6;35879:13;35870:6;35866:2;35862:15;35855:38;35417:533;35554:45;;;35544:55;;;:6;:55;;;;35537:62;;;;;35381:624;35989:4;35982:11;;35209:803;;;;;;;:::o;36584:126::-;;;;:::o;41409:164::-;41513:10;:17;;;;41486:15;:24;41502:7;41486:24;;;;;;;;;;;:44;;;;41541:10;41557:7;41541:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41409:164;:::o;42200:988::-;42466:22;42516:1;42491:22;42508:4;42491:16;:22::i;:::-;:26;;;;:::i;:::-;42466:51;;42528:18;42549:17;:26;42567:7;42549:26;;;;;;;;;;;;42528:47;;42696:14;42682:10;:28;42678:328;;42727:19;42749:12;:18;42762:4;42749:18;;;;;;;;;;;;;;;:34;42768:14;42749:34;;;;;;;;;;;;42727:56;;42833:11;42800:12;:18;42813:4;42800:18;;;;;;;;;;;;;;;:30;42819:10;42800:30;;;;;;;;;;;:44;;;;42950:10;42917:17;:30;42935:11;42917:30;;;;;;;;;;;:43;;;;42712:294;42678:328;43102:17;:26;43120:7;43102:26;;;;;;;;;;;43095:33;;;43146:12;:18;43159:4;43146:18;;;;;;;;;;;;;;;:34;43165:14;43146:34;;;;;;;;;;;43139:41;;;42281:907;;42200:988;;:::o;43483:1079::-;43736:22;43781:1;43761:10;:17;;;;:21;;;;:::i;:::-;43736:46;;43793:18;43814:15;:24;43830:7;43814:24;;;;;;;;;;;;43793:45;;44165:19;44187:10;44198:14;44187:26;;;;;;;;:::i;:::-;;;;;;;;;;44165:48;;44251:11;44226:10;44237;44226:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44362:10;44331:15;:28;44347:11;44331:28;;;;;;;;;;;:41;;;;44503:15;:24;44519:7;44503:24;;;;;;;;;;;44496:31;;;44538:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43554:1008;;;43483:1079;:::o;40987:221::-;41072:14;41089:20;41106:2;41089:16;:20::i;:::-;41072:37;;41147:7;41120:12;:16;41133:2;41120:16;;;;;;;;;;;;;;;:24;41137:6;41120:24;;;;;;;;;;;:34;;;;41194:6;41165:17;:26;41183:7;41165:26;;;;;;;;;;;:35;;;;41061:147;40987:221;;:::o;32466:382::-;32560:1;32546:16;;:2;:16;;;;32538:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32619:16;32627:7;32619;:16::i;:::-;32618:17;32610:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32681:45;32710:1;32714:2;32718:7;32681:20;:45::i;:::-;32756:1;32739:9;:13;32749:2;32739:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32787:2;32768:7;:16;32776:7;32768:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32832:7;32828:2;32807:33;;32824:1;32807:33;;;;;;;;;;;;32466:382;;:::o;15369:387::-;15429:4;15637:12;15704:7;15692:20;15684:28;;15747:1;15740:4;:8;15733:15;;;15369:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:327::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:52;5144:7;5135:6;5124:9;5120:22;5100:52;:::i;:::-;5090:62;;5046:116;4842:327;;;;:::o;5175:349::-;5244:6;5293:2;5281:9;5272:7;5268:23;5264:32;5261:119;;;5299:79;;:::i;:::-;5261:119;5419:1;5444:63;5499:7;5490:6;5479:9;5475:22;5444:63;:::i;:::-;5434:73;;5390:127;5175:349;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:118::-;5952:24;5970:5;5952:24;:::i;:::-;5947:3;5940:37;5865:118;;:::o;5989:109::-;6070:21;6085:5;6070:21;:::i;:::-;6065:3;6058:34;5989:109;;:::o;6104:360::-;6190:3;6218:38;6250:5;6218:38;:::i;:::-;6272:70;6335:6;6330:3;6272:70;:::i;:::-;6265:77;;6351:52;6396:6;6391:3;6384:4;6377:5;6373:16;6351:52;:::i;:::-;6428:29;6450:6;6428:29;:::i;:::-;6423:3;6419:39;6412:46;;6194:270;6104:360;;;;:::o;6470:364::-;6558:3;6586:39;6619:5;6586:39;:::i;:::-;6641:71;6705:6;6700:3;6641:71;:::i;:::-;6634:78;;6721:52;6766:6;6761:3;6754:4;6747:5;6743:16;6721:52;:::i;:::-;6798:29;6820:6;6798:29;:::i;:::-;6793:3;6789:39;6782:46;;6562:272;6470:364;;;;:::o;6840:377::-;6946:3;6974:39;7007:5;6974:39;:::i;:::-;7029:89;7111:6;7106:3;7029:89;:::i;:::-;7022:96;;7127:52;7172:6;7167:3;7160:4;7153:5;7149:16;7127:52;:::i;:::-;7204:6;7199:3;7195:16;7188:23;;6950:267;6840:377;;;;:::o;7247:845::-;7350:3;7387:5;7381:12;7416:36;7442:9;7416:36;:::i;:::-;7468:89;7550:6;7545:3;7468:89;:::i;:::-;7461:96;;7588:1;7577:9;7573:17;7604:1;7599:137;;;;7750:1;7745:341;;;;7566:520;;7599:137;7683:4;7679:9;7668;7664:25;7659:3;7652:38;7719:6;7714:3;7710:16;7703:23;;7599:137;;7745:341;7812:38;7844:5;7812:38;:::i;:::-;7872:1;7886:154;7900:6;7897:1;7894:13;7886:154;;;7974:7;7968:14;7964:1;7959:3;7955:11;7948:35;8024:1;8015:7;8011:15;8000:26;;7922:4;7919:1;7915:12;7910:17;;7886:154;;;8069:6;8064:3;8060:16;8053:23;;7752:334;;7566:520;;7354:738;;7247:845;;;;:::o;8098:366::-;8240:3;8261:67;8325:2;8320:3;8261:67;:::i;:::-;8254:74;;8337:93;8426:3;8337:93;:::i;:::-;8455:2;8450:3;8446:12;8439:19;;8098:366;;;:::o;8470:::-;8612:3;8633:67;8697:2;8692:3;8633:67;:::i;:::-;8626:74;;8709:93;8798:3;8709:93;:::i;:::-;8827:2;8822:3;8818:12;8811:19;;8470:366;;;:::o;8842:::-;8984:3;9005:67;9069:2;9064:3;9005:67;:::i;:::-;8998:74;;9081:93;9170:3;9081:93;:::i;:::-;9199:2;9194:3;9190:12;9183:19;;8842:366;;;:::o;9214:::-;9356:3;9377:67;9441:2;9436:3;9377:67;:::i;:::-;9370:74;;9453:93;9542:3;9453:93;:::i;:::-;9571:2;9566:3;9562:12;9555:19;;9214:366;;;:::o;9586:::-;9728:3;9749:67;9813:2;9808:3;9749:67;:::i;:::-;9742:74;;9825:93;9914:3;9825:93;:::i;:::-;9943:2;9938:3;9934:12;9927:19;;9586:366;;;:::o;9958:::-;10100:3;10121:67;10185:2;10180:3;10121:67;:::i;:::-;10114:74;;10197:93;10286:3;10197:93;:::i;:::-;10315:2;10310:3;10306:12;10299:19;;9958:366;;;:::o;10330:400::-;10490:3;10511:84;10593:1;10588:3;10511:84;:::i;:::-;10504:91;;10604:93;10693:3;10604:93;:::i;:::-;10722:1;10717:3;10713:11;10706:18;;10330:400;;;:::o;10736:366::-;10878:3;10899:67;10963:2;10958:3;10899:67;:::i;:::-;10892:74;;10975:93;11064:3;10975:93;:::i;:::-;11093:2;11088:3;11084:12;11077:19;;10736:366;;;:::o;11108:400::-;11268:3;11289:84;11371:1;11366:3;11289:84;:::i;:::-;11282:91;;11382:93;11471:3;11382:93;:::i;:::-;11500:1;11495:3;11491:11;11484:18;;11108:400;;;:::o;11514:366::-;11656:3;11677:67;11741:2;11736:3;11677:67;:::i;:::-;11670:74;;11753:93;11842:3;11753:93;:::i;:::-;11871:2;11866:3;11862:12;11855:19;;11514:366;;;:::o;11886:400::-;12046:3;12067:84;12149:1;12144:3;12067:84;:::i;:::-;12060:91;;12160:93;12249:3;12160:93;:::i;:::-;12278:1;12273:3;12269:11;12262:18;;11886:400;;;:::o;12292:366::-;12434:3;12455:67;12519:2;12514:3;12455:67;:::i;:::-;12448:74;;12531:93;12620:3;12531:93;:::i;:::-;12649:2;12644:3;12640:12;12633:19;;12292:366;;;:::o;12664:::-;12806:3;12827:67;12891:2;12886:3;12827:67;:::i;:::-;12820:74;;12903:93;12992:3;12903:93;:::i;:::-;13021:2;13016:3;13012:12;13005:19;;12664:366;;;:::o;13036:400::-;13196:3;13217:84;13299:1;13294:3;13217:84;:::i;:::-;13210:91;;13310:93;13399:3;13310:93;:::i;:::-;13428:1;13423:3;13419:11;13412:18;;13036:400;;;:::o;13442:366::-;13584:3;13605:67;13669:2;13664:3;13605:67;:::i;:::-;13598:74;;13681:93;13770:3;13681:93;:::i;:::-;13799:2;13794:3;13790:12;13783:19;;13442:366;;;:::o;13814:404::-;13974:3;13995:86;14077:3;14072;13995:86;:::i;:::-;13988:93;;14090;14179:3;14090:93;:::i;:::-;14208:3;14203;14199:13;14192:20;;13814:404;;;:::o;14224:366::-;14366:3;14387:67;14451:2;14446:3;14387:67;:::i;:::-;14380:74;;14463:93;14552:3;14463:93;:::i;:::-;14581:2;14576:3;14572:12;14565:19;;14224:366;;;:::o;14596:::-;14738:3;14759:67;14823:2;14818:3;14759:67;:::i;:::-;14752:74;;14835:93;14924:3;14835:93;:::i;:::-;14953:2;14948:3;14944:12;14937:19;;14596:366;;;:::o;14968:::-;15110:3;15131:67;15195:2;15190:3;15131:67;:::i;:::-;15124:74;;15207:93;15296:3;15207:93;:::i;:::-;15325:2;15320:3;15316:12;15309:19;;14968:366;;;:::o;15340:::-;15482:3;15503:67;15567:2;15562:3;15503:67;:::i;:::-;15496:74;;15579:93;15668:3;15579:93;:::i;:::-;15697:2;15692:3;15688:12;15681:19;;15340:366;;;:::o;15712:::-;15854:3;15875:67;15939:2;15934:3;15875:67;:::i;:::-;15868:74;;15951:93;16040:3;15951:93;:::i;:::-;16069:2;16064:3;16060:12;16053:19;;15712:366;;;:::o;16084:402::-;16244:3;16265:85;16347:2;16342:3;16265:85;:::i;:::-;16258:92;;16359:93;16448:3;16359:93;:::i;:::-;16477:2;16472:3;16468:12;16461:19;;16084:402;;;:::o;16492:400::-;16652:3;16673:84;16755:1;16750:3;16673:84;:::i;:::-;16666:91;;16766:93;16855:3;16766:93;:::i;:::-;16884:1;16879:3;16875:11;16868:18;;16492:400;;;:::o;16898:366::-;17040:3;17061:67;17125:2;17120:3;17061:67;:::i;:::-;17054:74;;17137:93;17226:3;17137:93;:::i;:::-;17255:2;17250:3;17246:12;17239:19;;16898:366;;;:::o;17270:402::-;17430:3;17451:85;17533:2;17528:3;17451:85;:::i;:::-;17444:92;;17545:93;17634:3;17545:93;:::i;:::-;17663:2;17658:3;17654:12;17647:19;;17270:402;;;:::o;17678:366::-;17820:3;17841:67;17905:2;17900:3;17841:67;:::i;:::-;17834:74;;17917:93;18006:3;17917:93;:::i;:::-;18035:2;18030:3;18026:12;18019:19;;17678:366;;;:::o;18050:::-;18192:3;18213:67;18277:2;18272:3;18213:67;:::i;:::-;18206:74;;18289:93;18378:3;18289:93;:::i;:::-;18407:2;18402:3;18398:12;18391:19;;18050:366;;;:::o;18422:118::-;18509:24;18527:5;18509:24;:::i;:::-;18504:3;18497:37;18422:118;;:::o;18546:275::-;18678:3;18700:95;18791:3;18782:6;18700:95;:::i;:::-;18693:102;;18812:3;18805:10;;18546:275;;;;:::o;18827:435::-;19007:3;19029:95;19120:3;19111:6;19029:95;:::i;:::-;19022:102;;19141:95;19232:3;19223:6;19141:95;:::i;:::-;19134:102;;19253:3;19246:10;;18827:435;;;;;:::o;19268:1555::-;19784:3;19806:95;19897:3;19888:6;19806:95;:::i;:::-;19799:102;;19918:95;20009:3;20000:6;19918:95;:::i;:::-;19911:102;;20030:95;20121:3;20112:6;20030:95;:::i;:::-;20023:102;;20142:95;20233:3;20224:6;20142:95;:::i;:::-;20135:102;;20254:95;20345:3;20336:6;20254:95;:::i;:::-;20247:102;;20366:95;20457:3;20448:6;20366:95;:::i;:::-;20359:102;;20478:95;20569:3;20560:6;20478:95;:::i;:::-;20471:102;;20590:95;20681:3;20672:6;20590:95;:::i;:::-;20583:102;;20702:95;20793:3;20784:6;20702:95;:::i;:::-;20695:102;;20814:3;20807:10;;19268:1555;;;;;;;;;;;;:::o;20829:695::-;21107:3;21129:95;21220:3;21211:6;21129:95;:::i;:::-;21122:102;;21241:148;21385:3;21241:148;:::i;:::-;21234:155;;21406:92;21494:3;21485:6;21406:92;:::i;:::-;21399:99;;21515:3;21508:10;;20829:695;;;;;:::o;21530:1393::-;22061:3;22083:148;22227:3;22083:148;:::i;:::-;22076:155;;22248:95;22339:3;22330:6;22248:95;:::i;:::-;22241:102;;22360:148;22504:3;22360:148;:::i;:::-;22353:155;;22525:95;22616:3;22607:6;22525:95;:::i;:::-;22518:102;;22637:148;22781:3;22637:148;:::i;:::-;22630:155;;22802:95;22893:3;22884:6;22802:95;:::i;:::-;22795:102;;22914:3;22907:10;;21530:1393;;;;;;:::o;22929:1659::-;23561:3;23583:148;23727:3;23583:148;:::i;:::-;23576:155;;23748:95;23839:3;23830:6;23748:95;:::i;:::-;23741:102;;23860:148;24004:3;23860:148;:::i;:::-;23853:155;;24025:95;24116:3;24107:6;24025:95;:::i;:::-;24018:102;;24137:148;24281:3;24137:148;:::i;:::-;24130:155;;24302:95;24393:3;24384:6;24302:95;:::i;:::-;24295:102;;24414:148;24558:3;24414:148;:::i;:::-;24407:155;;24579:3;24572:10;;22929:1659;;;;;;:::o;24594:541::-;24827:3;24849:148;24993:3;24849:148;:::i;:::-;24842:155;;25014:95;25105:3;25096:6;25014:95;:::i;:::-;25007:102;;25126:3;25119:10;;24594:541;;;;:::o;25141:1233::-;25624:3;25646:148;25790:3;25646:148;:::i;:::-;25639:155;;25811:95;25902:3;25893:6;25811:95;:::i;:::-;25804:102;;25923:148;26067:3;25923:148;:::i;:::-;25916:155;;26088:95;26179:3;26170:6;26088:95;:::i;:::-;26081:102;;26200:148;26344:3;26200:148;:::i;:::-;26193:155;;26365:3;26358:10;;25141:1233;;;;;:::o;26380:222::-;26473:4;26511:2;26500:9;26496:18;26488:26;;26524:71;26592:1;26581:9;26577:17;26568:6;26524:71;:::i;:::-;26380:222;;;;:::o;26608:640::-;26803:4;26841:3;26830:9;26826:19;26818:27;;26855:71;26923:1;26912:9;26908:17;26899:6;26855:71;:::i;:::-;26936:72;27004:2;26993:9;26989:18;26980:6;26936:72;:::i;:::-;27018;27086:2;27075:9;27071:18;27062:6;27018:72;:::i;:::-;27137:9;27131:4;27127:20;27122:2;27111:9;27107:18;27100:48;27165:76;27236:4;27227:6;27165:76;:::i;:::-;27157:84;;26608:640;;;;;;;:::o;27254:210::-;27341:4;27379:2;27368:9;27364:18;27356:26;;27392:65;27454:1;27443:9;27439:17;27430:6;27392:65;:::i;:::-;27254:210;;;;:::o;27470:313::-;27583:4;27621:2;27610:9;27606:18;27598:26;;27670:9;27664:4;27660:20;27656:1;27645:9;27641:17;27634:47;27698:78;27771:4;27762:6;27698:78;:::i;:::-;27690:86;;27470:313;;;;:::o;27789:419::-;27955:4;27993:2;27982:9;27978:18;27970:26;;28042:9;28036:4;28032:20;28028:1;28017:9;28013:17;28006:47;28070:131;28196:4;28070:131;:::i;:::-;28062:139;;27789:419;;;:::o;28214:::-;28380:4;28418:2;28407:9;28403:18;28395:26;;28467:9;28461:4;28457:20;28453:1;28442:9;28438:17;28431:47;28495:131;28621:4;28495:131;:::i;:::-;28487:139;;28214:419;;;:::o;28639:::-;28805:4;28843:2;28832:9;28828:18;28820:26;;28892:9;28886:4;28882:20;28878:1;28867:9;28863:17;28856:47;28920:131;29046:4;28920:131;:::i;:::-;28912:139;;28639:419;;;:::o;29064:::-;29230:4;29268:2;29257:9;29253:18;29245:26;;29317:9;29311:4;29307:20;29303:1;29292:9;29288:17;29281:47;29345:131;29471:4;29345:131;:::i;:::-;29337:139;;29064:419;;;:::o;29489:::-;29655:4;29693:2;29682:9;29678:18;29670:26;;29742:9;29736:4;29732:20;29728:1;29717:9;29713:17;29706:47;29770:131;29896:4;29770:131;:::i;:::-;29762:139;;29489:419;;;:::o;29914:::-;30080:4;30118:2;30107:9;30103:18;30095:26;;30167:9;30161:4;30157:20;30153:1;30142:9;30138:17;30131:47;30195:131;30321:4;30195:131;:::i;:::-;30187:139;;29914:419;;;:::o;30339:::-;30505:4;30543:2;30532:9;30528:18;30520:26;;30592:9;30586:4;30582:20;30578:1;30567:9;30563:17;30556:47;30620:131;30746:4;30620:131;:::i;:::-;30612:139;;30339:419;;;:::o;30764:::-;30930:4;30968:2;30957:9;30953:18;30945:26;;31017:9;31011:4;31007:20;31003:1;30992:9;30988:17;30981:47;31045:131;31171:4;31045:131;:::i;:::-;31037:139;;30764:419;;;:::o;31189:::-;31355:4;31393:2;31382:9;31378:18;31370:26;;31442:9;31436:4;31432:20;31428:1;31417:9;31413:17;31406:47;31470:131;31596:4;31470:131;:::i;:::-;31462:139;;31189:419;;;:::o;31614:::-;31780:4;31818:2;31807:9;31803:18;31795:26;;31867:9;31861:4;31857:20;31853:1;31842:9;31838:17;31831:47;31895:131;32021:4;31895:131;:::i;:::-;31887:139;;31614:419;;;:::o;32039:::-;32205:4;32243:2;32232:9;32228:18;32220:26;;32292:9;32286:4;32282:20;32278:1;32267:9;32263:17;32256:47;32320:131;32446:4;32320:131;:::i;:::-;32312:139;;32039:419;;;:::o;32464:::-;32630:4;32668:2;32657:9;32653:18;32645:26;;32717:9;32711:4;32707:20;32703:1;32692:9;32688:17;32681:47;32745:131;32871:4;32745:131;:::i;:::-;32737:139;;32464:419;;;:::o;32889:::-;33055:4;33093:2;33082:9;33078:18;33070:26;;33142:9;33136:4;33132:20;33128:1;33117:9;33113:17;33106:47;33170:131;33296:4;33170:131;:::i;:::-;33162:139;;32889:419;;;:::o;33314:::-;33480:4;33518:2;33507:9;33503:18;33495:26;;33567:9;33561:4;33557:20;33553:1;33542:9;33538:17;33531:47;33595:131;33721:4;33595:131;:::i;:::-;33587:139;;33314:419;;;:::o;33739:::-;33905:4;33943:2;33932:9;33928:18;33920:26;;33992:9;33986:4;33982:20;33978:1;33967:9;33963:17;33956:47;34020:131;34146:4;34020:131;:::i;:::-;34012:139;;33739:419;;;:::o;34164:::-;34330:4;34368:2;34357:9;34353:18;34345:26;;34417:9;34411:4;34407:20;34403:1;34392:9;34388:17;34381:47;34445:131;34571:4;34445:131;:::i;:::-;34437:139;;34164:419;;;:::o;34589:::-;34755:4;34793:2;34782:9;34778:18;34770:26;;34842:9;34836:4;34832:20;34828:1;34817:9;34813:17;34806:47;34870:131;34996:4;34870:131;:::i;:::-;34862:139;;34589:419;;;:::o;35014:::-;35180:4;35218:2;35207:9;35203:18;35195:26;;35267:9;35261:4;35257:20;35253:1;35242:9;35238:17;35231:47;35295:131;35421:4;35295:131;:::i;:::-;35287:139;;35014:419;;;:::o;35439:::-;35605:4;35643:2;35632:9;35628:18;35620:26;;35692:9;35686:4;35682:20;35678:1;35667:9;35663:17;35656:47;35720:131;35846:4;35720:131;:::i;:::-;35712:139;;35439:419;;;:::o;35864:222::-;35957:4;35995:2;35984:9;35980:18;35972:26;;36008:71;36076:1;36065:9;36061:17;36052:6;36008:71;:::i;:::-;35864:222;;;;:::o;36092:129::-;36126:6;36153:20;;:::i;:::-;36143:30;;36182:33;36210:4;36202:6;36182:33;:::i;:::-;36092:129;;;:::o;36227:75::-;36260:6;36293:2;36287:9;36277:19;;36227:75;:::o;36308:307::-;36369:4;36459:18;36451:6;36448:30;36445:56;;;36481:18;;:::i;:::-;36445:56;36519:29;36541:6;36519:29;:::i;:::-;36511:37;;36603:4;36597;36593:15;36585:23;;36308:307;;;:::o;36621:141::-;36670:4;36693:3;36685:11;;36716:3;36713:1;36706:14;36750:4;36747:1;36737:18;36729:26;;36621:141;;;:::o;36768:98::-;36819:6;36853:5;36847:12;36837:22;;36768:98;;;:::o;36872:99::-;36924:6;36958:5;36952:12;36942:22;;36872:99;;;:::o;36977:168::-;37060:11;37094:6;37089:3;37082:19;37134:4;37129:3;37125:14;37110:29;;36977:168;;;;:::o;37151:169::-;37235:11;37269:6;37264:3;37257:19;37309:4;37304:3;37300:14;37285:29;;37151:169;;;;:::o;37326:148::-;37428:11;37465:3;37450:18;;37326:148;;;;:::o;37480:305::-;37520:3;37539:20;37557:1;37539:20;:::i;:::-;37534:25;;37573:20;37591:1;37573:20;:::i;:::-;37568:25;;37727:1;37659:66;37655:74;37652:1;37649:81;37646:107;;;37733:18;;:::i;:::-;37646:107;37777:1;37774;37770:9;37763:16;;37480:305;;;;:::o;37791:185::-;37831:1;37848:20;37866:1;37848:20;:::i;:::-;37843:25;;37882:20;37900:1;37882:20;:::i;:::-;37877:25;;37921:1;37911:35;;37926:18;;:::i;:::-;37911:35;37968:1;37965;37961:9;37956:14;;37791:185;;;;:::o;37982:348::-;38022:7;38045:20;38063:1;38045:20;:::i;:::-;38040:25;;38079:20;38097:1;38079:20;:::i;:::-;38074:25;;38267:1;38199:66;38195:74;38192:1;38189:81;38184:1;38177:9;38170:17;38166:105;38163:131;;;38274:18;;:::i;:::-;38163:131;38322:1;38319;38315:9;38304:20;;37982:348;;;;:::o;38336:191::-;38376:4;38396:20;38414:1;38396:20;:::i;:::-;38391:25;;38430:20;38448:1;38430:20;:::i;:::-;38425:25;;38469:1;38466;38463:8;38460:34;;;38474:18;;:::i;:::-;38460:34;38519:1;38516;38512:9;38504:17;;38336:191;;;;:::o;38533:96::-;38570:7;38599:24;38617:5;38599:24;:::i;:::-;38588:35;;38533:96;;;:::o;38635:90::-;38669:7;38712:5;38705:13;38698:21;38687:32;;38635:90;;;:::o;38731:149::-;38767:7;38807:66;38800:5;38796:78;38785:89;;38731:149;;;:::o;38886:126::-;38923:7;38963:42;38956:5;38952:54;38941:65;;38886:126;;;:::o;39018:77::-;39055:7;39084:5;39073:16;;39018:77;;;:::o;39101:154::-;39185:6;39180:3;39175;39162:30;39247:1;39238:6;39233:3;39229:16;39222:27;39101:154;;;:::o;39261:307::-;39329:1;39339:113;39353:6;39350:1;39347:13;39339:113;;;39438:1;39433:3;39429:11;39423:18;39419:1;39414:3;39410:11;39403:39;39375:2;39372:1;39368:10;39363:15;;39339:113;;;39470:6;39467:1;39464:13;39461:101;;;39550:1;39541:6;39536:3;39532:16;39525:27;39461:101;39310:258;39261:307;;;:::o;39574:320::-;39618:6;39655:1;39649:4;39645:12;39635:22;;39702:1;39696:4;39692:12;39723:18;39713:81;;39779:4;39771:6;39767:17;39757:27;;39713:81;39841:2;39833:6;39830:14;39810:18;39807:38;39804:84;;;39860:18;;:::i;:::-;39804:84;39625:269;39574:320;;;:::o;39900:281::-;39983:27;40005:4;39983:27;:::i;:::-;39975:6;39971:40;40113:6;40101:10;40098:22;40077:18;40065:10;40062:34;40059:62;40056:88;;;40124:18;;:::i;:::-;40056:88;40164:10;40160:2;40153:22;39943:238;39900:281;;:::o;40187:233::-;40226:3;40249:24;40267:5;40249:24;:::i;:::-;40240:33;;40295:66;40288:5;40285:77;40282:103;;;40365:18;;:::i;:::-;40282:103;40412:1;40405:5;40401:13;40394:20;;40187:233;;;:::o;40426:176::-;40458:1;40475:20;40493:1;40475:20;:::i;:::-;40470:25;;40509:20;40527:1;40509:20;:::i;:::-;40504:25;;40548:1;40538:35;;40553:18;;:::i;:::-;40538:35;40594:1;40591;40587:9;40582:14;;40426:176;;;;:::o;40608:180::-;40656:77;40653:1;40646:88;40753:4;40750:1;40743:15;40777:4;40774:1;40767:15;40794:180;40842:77;40839:1;40832:88;40939:4;40936:1;40929:15;40963:4;40960:1;40953:15;40980:180;41028:77;41025:1;41018:88;41125:4;41122:1;41115:15;41149:4;41146:1;41139:15;41166:180;41214:77;41211:1;41204:88;41311:4;41308:1;41301:15;41335:4;41332:1;41325:15;41352:180;41400:77;41397:1;41390:88;41497:4;41494:1;41487:15;41521:4;41518:1;41511:15;41538:180;41586:77;41583:1;41576:88;41683:4;41680:1;41673:15;41707:4;41704:1;41697:15;41724:117;41833:1;41830;41823:12;41847:117;41956:1;41953;41946:12;41970:117;42079:1;42076;42069:12;42093:117;42202:1;42199;42192:12;42216:102;42257:6;42308:2;42304:7;42299:2;42292:5;42288:14;42284:28;42274:38;;42216:102;;;:::o;42324:230::-;42464:34;42460:1;42452:6;42448:14;42441:58;42533:13;42528:2;42520:6;42516:15;42509:38;42324:230;:::o;42560:237::-;42700:34;42696:1;42688:6;42684:14;42677:58;42769:20;42764:2;42756:6;42752:15;42745:45;42560:237;:::o;42803:225::-;42943:34;42939:1;42931:6;42927:14;42920:58;43012:8;43007:2;42999:6;42995:15;42988:33;42803:225;:::o;43034:178::-;43174:30;43170:1;43162:6;43158:14;43151:54;43034:178;:::o;43218:223::-;43358:34;43354:1;43346:6;43342:14;43335:58;43427:6;43422:2;43414:6;43410:15;43403:31;43218:223;:::o;43447:175::-;43587:27;43583:1;43575:6;43571:14;43564:51;43447:175;:::o;43628:214::-;43768:66;43764:1;43756:6;43752:14;43745:90;43628:214;:::o;43848:231::-;43988:34;43984:1;43976:6;43972:14;43965:58;44057:14;44052:2;44044:6;44040:15;44033:39;43848:231;:::o;44085:151::-;44225:3;44221:1;44213:6;44209:14;44202:27;44085:151;:::o;44242:243::-;44382:34;44378:1;44370:6;44366:14;44359:58;44451:26;44446:2;44438:6;44434:15;44427:51;44242:243;:::o;44491:214::-;44631:66;44627:1;44619:6;44615:14;44608:90;44491:214;:::o;44711:229::-;44851:34;44847:1;44839:6;44835:14;44828:58;44920:12;44915:2;44907:6;44903:15;44896:37;44711:229;:::o;44946:228::-;45086:34;45082:1;45074:6;45070:14;45063:58;45155:11;45150:2;45142:6;45138:15;45131:36;44946:228;:::o;45180:214::-;45320:66;45316:1;45308:6;45304:14;45297:90;45180:214;:::o;45400:182::-;45540:34;45536:1;45528:6;45524:14;45517:58;45400:182;:::o;45588:584::-;45728:66;45724:1;45716:6;45712:14;45705:90;45829:34;45824:2;45816:6;45812:15;45805:59;45898:34;45893:2;45885:6;45881:15;45874:59;45967:34;45962:2;45954:6;45950:15;45943:59;46037:66;46031:3;46023:6;46019:16;46012:92;46139:25;46133:3;46125:6;46121:16;46114:51;45588:584;:::o;46178:231::-;46318:34;46314:1;46306:6;46302:14;46295:58;46387:14;46382:2;46374:6;46370:15;46363:39;46178:231;:::o;46415:182::-;46555:34;46551:1;46543:6;46539:14;46532:58;46415:182;:::o;46603:166::-;46743:18;46739:1;46731:6;46727:14;46720:42;46603:166;:::o;46775:228::-;46915:34;46911:1;46903:6;46899:14;46892:58;46984:11;46979:2;46971:6;46967:15;46960:36;46775:228;:::o;47009:220::-;47149:34;47145:1;47137:6;47133:14;47126:58;47218:3;47213:2;47205:6;47201:15;47194:28;47009:220;:::o;47235:179::-;47375:31;47371:1;47363:6;47359:14;47352:55;47235:179;:::o;47420:153::-;47560:5;47556:1;47548:6;47544:14;47537:29;47420:153;:::o;47579:236::-;47719:34;47715:1;47707:6;47703:14;47696:58;47788:19;47783:2;47775:6;47771:15;47764:44;47579:236;:::o;47821:214::-;47961:66;47957:1;47949:6;47945:14;47938:90;47821:214;:::o;48041:231::-;48181:34;48177:1;48169:6;48165:14;48158:58;48250:14;48245:2;48237:6;48233:15;48226:39;48041:231;:::o;48278:181::-;48418:33;48414:1;48406:6;48402:14;48395:57;48278:181;:::o;48465:122::-;48538:24;48556:5;48538:24;:::i;:::-;48531:5;48528:35;48518:63;;48577:1;48574;48567:12;48518:63;48465:122;:::o;48593:116::-;48663:21;48678:5;48663:21;:::i;:::-;48656:5;48653:32;48643:60;;48699:1;48696;48689:12;48643:60;48593:116;:::o;48715:120::-;48787:23;48804:5;48787:23;:::i;:::-;48780:5;48777:34;48767:62;;48825:1;48822;48815:12;48767:62;48715:120;:::o;48841:122::-;48914:24;48932:5;48914:24;:::i;:::-;48907:5;48904:35;48894:63;;48953:1;48950;48943:12;48894:63;48841:122;:::o

Swarm Source

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