ETH Price: $3,087.40 (+0.84%)
Gas: 5 Gwei

Token

Pilot (PILOT)
 

Overview

Max Total Supply

1,266 PILOT

Holders

386

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
daidai.eth
Balance
4 PILOT
0x213657bccc5cf8b74455d110c11d5a8ed6241dec
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:
Pilot

Compiler Version
v0.8.6+commit.11564f7e

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-03
*/

/**
 *Submitted for verification at Etherscan.io on 2021-08-27
 */

// 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 Pilot is ERC721Enumerable, ReentrancyGuard, Ownable {
    string[] private genres = [
        "Action",
        "Animated",
        "Anthology",
        "Comedy",
        "Crime",
        "Documentary",
        "Drama",
        "Fantasy",
        "Horror",
        "Mockumentary",
        "Musical",
        "News/Talk",
        "Reality",
        "Sci-Fi",
        "Sports",
        "Suspense",
        "Thriller"
    ];
    
    string[] private podcastGenres = [
        "Comedy",
        "News",
        "True Crime",
        "Sport",
        "Health/Fitness",
        "Religion/Faith",
        "Politics",
        "Self-Help/Productivity",
        "Investigative Journalism",
        "Finances",
        "Scripted Comedy",
        "Game Show",
        "Pop Culture",
        "Scripted Drama"
    ];

    string[] private actorTypes = [
        "A-lister",
        "B-lister",
        "C-lister",
        "D-lister",
        "Reality Star",
        "Current Athlete",
        "Former Athlete",
        "Influencer",
        "Politician"
    ];
    
    string[] private projects = [
        "Punk",
        "Ape",
        "Alien",
        "Zombie",
        "Cat",
        "Dog",
        "Penguin"
    ];

    string[] private types = ["TV Show", "Movie", "Podcast"];

    string[] private tvRatings = ["TV-G", "TV-PG", "TV-14", "TV-MA"];

    string[] private movieRatings = ["G", "PG", "PG-13", "R", "NC-17"];

    string[] private podcastRatings = ["Clean", "Explicit"];

    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    function getType(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "TYPE", types);
    }

    function getRating(uint256 tokenId, string memory pilotType)
        public
        view
        returns (string memory)
    {
        if (
            keccak256(abi.encodePacked(pilotType)) ==
            keccak256(abi.encodePacked("TV Show"))
        ) {
            return pluck(tokenId, "RATING", tvRatings);
        } else if (
            keccak256(abi.encodePacked(pilotType)) ==
            keccak256(abi.encodePacked("Movie"))
        ) {
            return pluck(tokenId, "RATING", movieRatings);
        } else {
            return pluck(tokenId, "RATING", podcastRatings);
        }
    }

    function getGenre(uint256 tokenId, string memory pilotType) public view returns (string memory) {
         if (
            keccak256(abi.encodePacked(pilotType)) ==
            keccak256(abi.encodePacked("Podcast"))
        ) {
            return pluck(tokenId, "GENRE", podcastGenres);            
        } else {
            return pluck(tokenId, "GENRE", genres);            
        }
    }
    
    function getCrossGenre(uint256 tokenId, string memory pilotType, string memory genre)
        public
        view
        returns (string memory)
    {
        if (
            keccak256(abi.encodePacked(pilotType)) ==
            keccak256(abi.encodePacked("Podcast"))
        ) {
            string[] memory podcastCrossGenres = new string[](podcastGenres.length-1);
            uint index = 0;
            for (uint i = 0; i < podcastGenres.length; i++) { 
                if(keccak256(abi.encodePacked(podcastGenres[i])) != keccak256(abi.encodePacked(genre))) {
                    podcastCrossGenres[index] = podcastGenres[i];
                    index++;
                }
            }
            return pluck(tokenId, "CROSSGENRE", podcastCrossGenres);
        } else {
            string[] memory crossGenres = new string[](genres.length-1);
            uint index = 0;
            for (uint i = 0; i < genres.length; i++) { 
                if(keccak256(abi.encodePacked(genres[i])) != keccak256(abi.encodePacked(genre))) {
                    crossGenres[index] = genres[i];
                    index++;
                }
            }
            return pluck(tokenId, "CROSSGENRE", crossGenres);
        }
    }
    
    function getActor(uint256 tokenId, string memory keyPrefix) public view returns (string memory) {
       return pluckActor(tokenId, keyPrefix, actorTypes, projects);
    }

    function pluck(
        uint256 tokenId,
        string memory keyPrefix,
        string[] memory sourceArray
    ) internal pure returns (string memory) {
        uint256 rand = random(
            string(abi.encodePacked(keyPrefix, toString(tokenId)))  
        );
        string memory output = sourceArray[rand % sourceArray.length];
        return output;
    }
    
    function pluckActor(
        uint256 tokenId,
        string memory keyPrefix,
        string[] memory actorTypesArray,
        string[] memory projectsArray
    ) internal pure returns (string memory) {
        uint256 rand = random(
            string(abi.encodePacked(keyPrefix, toString(tokenId)))  
        );
        uint256 greatness = rand % 21;
        if (greatness > 14) {
            return projectsArray[rand % projectsArray.length];
        } else {
            return actorTypesArray[rand % actorTypesArray.length];
        }
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        string[13] memory parts;
        parts[
            0
        ] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: black; font-family: courier new, monospace; font-size: 14px; font-weight: bold}</style><rect width="100%" height="100%" fill="white" /><text text-anchor="middle" x="50%" y="120" class="base">';

        parts[1] = getType(tokenId);

        parts[2] = '</text><text text-anchor="middle" x="50%" y="140" class="base">';

        parts[3] = getRating(tokenId, parts[1]);

        parts[4] = '</text><text text-anchor="middle" x="50%" y="160" class="base">';

        parts[5] = getGenre(tokenId, parts[1]);

        parts[6] = '</text><text text-anchor="middle" x="50%" y="180" class="base">';

        parts[7] = getCrossGenre(tokenId, parts[1], parts[5]);

        parts[8] = '</text><text text-anchor="middle" x="50%" y="200" class="base">';

        parts[9] = getActor(tokenId, "LEAD");

        parts[10] = '</text><text text-anchor="middle" x="50%" y="220" class="base">';

        parts[11] = getActor(tokenId, "SUPPORTING");

        parts[12] = "</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])
        );

        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "Pitch #',
                        toString(tokenId),
                        '", "description": "Pilot is randomized TV/Movie/Podcast pitches generated and stored on chain. We generate the premise. You generate the buzz.", "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 < 7778, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
    }

    function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 7777 && tokenId < 8001, "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("Pilot", "PILOT") 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"},{"internalType":"string","name":"keyPrefix","type":"string"}],"name":"getActor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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"},{"internalType":"string","name":"pilotType","type":"string"},{"internalType":"string","name":"genre","type":"string"}],"name":"getCrossGenre","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"pilotType","type":"string"}],"name":"getGenre","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"pilotType","type":"string"}],"name":"getRating","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getType","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"}]

60806040526040518061022001604052806040518060400160405280600681526020017f416374696f6e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f416e696d6174656400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f416e74686f6c6f6779000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f436f6d656479000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4372696d6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f446f63756d656e7461727900000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4472616d6100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f46616e746173790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f486f72726f72000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f4d6f636b756d656e74617279000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4d75736963616c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4e6577732f54616c6b000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5265616c6974790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5363692d4669000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f53706f727473000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f53757370656e736500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f546872696c6c6572000000000000000000000000000000000000000000000000815250815250600c9060116200040b929190620010a0565b50604051806101c001604052806040518060400160405280600681526020017f436f6d656479000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4e6577730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f54727565204372696d650000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53706f727400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f4865616c74682f4669746e65737300000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f52656c6967696f6e2f466169746800000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f506f6c697469637300000000000000000000000000000000000000000000000081525081526020016040518060400160405280601681526020017f53656c662d48656c702f50726f6475637469766974790000000000000000000081525081526020016040518060400160405280601881526020017f496e7665737469676174697665204a6f75726e616c69736d000000000000000081525081526020016040518060400160405280600881526020017f46696e616e63657300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f536372697074656420436f6d656479000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f47616d652053686f77000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f506f702043756c7475726500000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f5363726970746564204472616d61000000000000000000000000000000000000815250815250600d90600e6200076292919062001107565b506040518061012001604052806040518060400160405280600881526020017f412d6c697374657200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f422d6c697374657200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f432d6c697374657200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f442d6c697374657200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f5265616c6974792053746172000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f43757272656e74204174686c657465000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f466f726d6572204174686c65746500000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f496e666c75656e6365720000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f506f6c6974696369616e00000000000000000000000000000000000000000000815250815250600e906009620009929291906200116e565b506040518060e001604052806040518060400160405280600481526020017f50756e6b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f417065000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f416c69656e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5a6f6d626965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f436174000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f446f67000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f50656e6775696e00000000000000000000000000000000000000000000000000815250815250600f90600762000b4b929190620011d5565b5060405180606001604052806040518060400160405280600781526020017f54562053686f770000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d6f76696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f506f646361737400000000000000000000000000000000000000000000000000815250815250601090600362000c189291906200123c565b5060405180608001604052806040518060400160405280600481526020017f54562d470000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f54562d504700000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f54562d313400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f54562d4d41000000000000000000000000000000000000000000000000000000815250815250601190600462000d20929190620012a3565b506040518060a001604052806040518060400160405280600181526020017f470000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f504700000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f50472d313300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f520000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4e432d3137000000000000000000000000000000000000000000000000000000815250815250601290600562000e639291906200130a565b5060405180604001604052806040518060400160405280600581526020017f436c65616e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4578706c69636974000000000000000000000000000000000000000000000000815250815250601390600262000ef592919062001371565b5034801562000f0357600080fd5b506040518060400160405280600581526020017f50696c6f740000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f50494c4f54000000000000000000000000000000000000000000000000000000815250816000908051906020019062000f88929190620013d8565b50806001908051906020019062000fa1929190620013d8565b5050506001600a8190555062000fcc62000fc062000fd260201b60201c565b62000fda60201b60201c565b6200155b565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054828255906000526020600020908101928215620010f4579160200282015b82811115620010f3578251829080519060200190620010e2929190620013d8565b5091602001919060010190620010c1565b5b50905062001103919062001469565b5090565b8280548282559060005260206000209081019282156200115b579160200282015b828111156200115a57825182908051906020019062001149929190620013d8565b509160200191906001019062001128565b5b5090506200116a919062001469565b5090565b828054828255906000526020600020908101928215620011c2579160200282015b82811115620011c1578251829080519060200190620011b0929190620013d8565b50916020019190600101906200118f565b5b509050620011d1919062001469565b5090565b82805482825590600052602060002090810192821562001229579160200282015b828111156200122857825182908051906020019062001217929190620013d8565b5091602001919060010190620011f6565b5b50905062001238919062001469565b5090565b82805482825590600052602060002090810192821562001290579160200282015b828111156200128f5782518290805190602001906200127e929190620013d8565b50916020019190600101906200125d565b5b5090506200129f919062001469565b5090565b828054828255906000526020600020908101928215620012f7579160200282015b82811115620012f6578251829080519060200190620012e5929190620013d8565b5091602001919060010190620012c4565b5b50905062001306919062001469565b5090565b8280548282559060005260206000209081019282156200135e579160200282015b828111156200135d5782518290805190602001906200134c929190620013d8565b50916020019190600101906200132b565b5b5090506200136d919062001469565b5090565b828054828255906000526020600020908101928215620013c5579160200282015b82811115620013c4578251829080519060200190620013b3929190620013d8565b509160200191906001019062001392565b5b509050620013d4919062001469565b5090565b828054620013e690620014f6565b90600052602060002090601f0160209004810192826200140a576000855562001456565b82601f106200142557805160ff191683800117855562001456565b8280016001018555821562001456579182015b828111156200145557825182559160200191906001019062001438565b5b50905062001465919062001491565b5090565b5b808211156200148d5760008181620014839190620014b0565b506001016200146a565b5090565b5b80821115620014ac57600081600090555060010162001492565b5090565b508054620014be90620014f6565b6000825580601f10620014d25750620014f3565b601f016020900490600052602060002090810190620014f2919062001491565b5b50565b600060028204905060018216806200150f57607f821691505b602082108114156200152657620015256200152c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615549806200156b6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806356e3f2af116100de5780638da5cb5b11610097578063b88d4fde11610071578063b88d4fde146104cd578063c87b56dd146104e9578063e985e9c514610519578063f2fde38b146105495761018e565b80638da5cb5b1461047557806395d89b4114610493578063a22cb465146104b15761018e565b806356e3f2af1461037b5780636352211e146103ab57806370a08231146103db578063715018a61461040b5780637bca4192146104155780638c8107ba146104455761018e565b80632f745c591161014b5780634036ab78116101255780634036ab78146102e357806342842e0e14610313578063434f48c41461032f5780634f6ccce71461034b5761018e565b80632f745c5914610267578063379607f5146102975780633ac0c814146102b35761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806318160ddd1461022d57806323b872dd1461024b575b600080fd5b6101ad60048036038101906101a89190613b3e565b610565565b6040516101ba91906143b2565b60405180910390f35b6101cb6105df565b6040516101d891906143cd565b60405180910390f35b6101fb60048036038101906101f69190613b98565b610671565b604051610208919061434b565b60405180910390f35b61022b60048036038101906102269190613afe565b6106f6565b005b61023561080e565b604051610242919061464f565b60405180910390f35b610265600480360381019061026091906139e8565b61081b565b005b610281600480360381019061027c9190613afe565b61087b565b60405161028e919061464f565b60405180910390f35b6102b160048036038101906102ac9190613b98565b610920565b005b6102cd60048036038101906102c89190613c21565b6109da565b6040516102da91906143cd565b60405180910390f35b6102fd60048036038101906102f89190613b98565b610e5b565b60405161030a91906143cd565b60405180910390f35b61032d600480360381019061032891906139e8565b610f75565b005b61034960048036038101906103449190613b98565b610f95565b005b61036560048036038101906103609190613b98565b6110cc565b604051610372919061464f565b60405180910390f35b61039560048036038101906103909190613bc5565b61113d565b6040516103a291906143cd565b60405180910390f35b6103c560048036038101906103c09190613b98565b6113c3565b6040516103d2919061434b565b60405180910390f35b6103f560048036038101906103f0919061397b565b611475565b604051610402919061464f565b60405180910390f35b61041361152d565b005b61042f600480360381019061042a9190613bc5565b6115b5565b60405161043c91906143cd565b60405180910390f35b61045f600480360381019061045a9190613bc5565b61176d565b60405161046c91906143cd565b60405180910390f35b61047d611b5d565b60405161048a919061434b565b60405180910390f35b61049b611b87565b6040516104a891906143cd565b60405180910390f35b6104cb60048036038101906104c69190613abe565b611c19565b005b6104e760048036038101906104e29190613a3b565b611d9a565b005b61050360048036038101906104fe9190613b98565b611dfc565b60405161051091906143cd565b60405180910390f35b610533600480360381019061052e91906139a8565b612348565b60405161054091906143b2565b60405180910390f35b610563600480360381019061055e919061397b565b6123dc565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105d857506105d7826124d4565b5b9050919050565b6060600080546105ee90614914565b80601f016020809104026020016040519081016040528092919081815260200182805461061a90614914565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b5050505050905090565b600061067c826125b6565b6106bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b29061454f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610701826113c3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610772576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610769906145cf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610791612622565b73ffffffffffffffffffffffffffffffffffffffff1614806107c057506107bf816107ba612622565b612348565b5b6107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f6906144cf565b60405180910390fd5b610809838361262a565b505050565b6000600880549050905090565b61082c610826612622565b826126e3565b61086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906145ef565b60405180910390fd5b6108768383836127c1565b505050565b600061088683611475565b82106108c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108be906143ef565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a541415610966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095d9061462f565b60405180910390fd5b6002600a8190555060008111801561097f5750611e6281105b6109be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b59061458f565b60405180910390fd5b6109cf6109c9612622565b82612a1d565b6001600a8190555050565b60606040516020016109eb906142a5565b6040516020818303038152906040528051906020012083604051602001610a129190614189565b604051602081830303815290604052805190602001201415610c435760006001600d80549050610a42919061482a565b67ffffffffffffffff811115610a5b57610a5a614adc565b5b604051908082528060200260200182016040528015610a8e57816020015b6060815260200190600190039081610a795790505b5090506000805b600d80549050811015610bf95784604051602001610ab39190614189565b60405160208183030381529060405280519060200120600d8281548110610add57610adc614aad565b5b90600052602060002001604051602001610af7919061428e565b6040516020818303038152906040528051906020012014610be657600d8181548110610b2657610b25614aad565b5b906000526020600020018054610b3b90614914565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6790614914565b8015610bb45780601f10610b8957610100808354040283529160200191610bb4565b820191906000526020600020905b815481529060010190602001808311610b9757829003601f168201915b5050505050838381518110610bcc57610bcb614aad565b5b60200260200101819052508180610be290614977565b9250505b8080610bf190614977565b915050610a95565b50610c3a866040518060400160405280600a81526020017f43524f535347454e52450000000000000000000000000000000000000000000081525084612a3b565b92505050610e54565b60006001600c80549050610c57919061482a565b67ffffffffffffffff811115610c7057610c6f614adc565b5b604051908082528060200260200182016040528015610ca357816020015b6060815260200190600190039081610c8e5790505b5090506000805b600c80549050811015610e0e5784604051602001610cc89190614189565b60405160208183030381529060405280519060200120600c8281548110610cf257610cf1614aad565b5b90600052602060002001604051602001610d0c919061428e565b6040516020818303038152906040528051906020012014610dfb57600c8181548110610d3b57610d3a614aad565b5b906000526020600020018054610d5090614914565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7c90614914565b8015610dc95780601f10610d9e57610100808354040283529160200191610dc9565b820191906000526020600020905b815481529060010190602001808311610dac57829003601f168201915b5050505050838381518110610de157610de0614aad565b5b60200260200101819052508180610df790614977565b9250505b8080610e0690614977565b915050610caa565b50610e4f866040518060400160405280600a81526020017f43524f535347454e52450000000000000000000000000000000000000000000081525084612a3b565b925050505b9392505050565b6060610f6e826040518060400160405280600481526020017f54595045000000000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b82821015610f65578382906000526020600020018054610ed890614914565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0490614914565b8015610f515780601f10610f2657610100808354040283529160200191610f51565b820191906000526020600020905b815481529060010190602001808311610f3457829003601f168201915b505050505081526020019060010190610eb9565b50505050612a3b565b9050919050565b610f9083838360405180602001604052806000815250611d9a565b505050565b6002600a541415610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd29061462f565b60405180910390fd5b6002600a81905550610feb612622565b73ffffffffffffffffffffffffffffffffffffffff16611009611b5d565b73ffffffffffffffffffffffffffffffffffffffff161461105f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110569061456f565b60405180910390fd5b611e61811180156110715750611f4181105b6110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a79061458f565b60405180910390fd5b6110c16110bb611b5d565b82612a1d565b6001600a8190555050565b60006110d661080e565b8210611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e9061460f565b60405180910390fd5b6008828154811061112b5761112a614aad565b5b90600052602060002001549050919050565b606060405160200161114e906142a5565b60405160208183030381529060405280519060200120826040516020016111759190614189565b6040516020818303038152906040528051906020012014156112a9576112a2836040518060400160405280600581526020017f47454e5245000000000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b8282101561129957838290600052602060002001805461120c90614914565b80601f016020809104026020016040519081016040528092919081815260200182805461123890614914565b80156112855780601f1061125a57610100808354040283529160200191611285565b820191906000526020600020905b81548152906001019060200180831161126857829003601f168201915b5050505050815260200190600101906111ed565b50505050612a3b565b90506113bd565b6113ba836040518060400160405280600581526020017f47454e5245000000000000000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b828210156113b157838290600052602060002001805461132490614914565b80601f016020809104026020016040519081016040528092919081815260200182805461135090614914565b801561139d5780601f106113725761010080835404028352916020019161139d565b820191906000526020600020905b81548152906001019060200180831161138057829003601f168201915b505050505081526020019060010190611305565b50505050612a3b565b90505b92915050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561146c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114639061450f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dd906144ef565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611535612622565b73ffffffffffffffffffffffffffffffffffffffff16611553611b5d565b73ffffffffffffffffffffffffffffffffffffffff16146115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a09061456f565b60405180910390fd5b6115b36000612aaa565b565b60606117658383600e805480602002602001604051908101604052809291908181526020016000905b8282101561168a5783829060005260206000200180546115fd90614914565b80601f016020809104026020016040519081016040528092919081815260200182805461162990614914565b80156116765780601f1061164b57610100808354040283529160200191611676565b820191906000526020600020905b81548152906001019060200180831161165957829003601f168201915b5050505050815260200190600101906115de565b50505050600f805480602002602001604051908101604052809291908181526020016000905b8282101561175c5783829060005260206000200180546116cf90614914565b80601f01602080910402602001604051908101604052809291908181526020018280546116fb90614914565b80156117485780601f1061171d57610100808354040283529160200191611748565b820191906000526020600020905b81548152906001019060200180831161172b57829003601f168201915b5050505050815260200190600101906116b0565b50505050612b70565b905092915050565b606060405160200161177e906142ba565b60405160208183030381529060405280519060200120826040516020016117a59190614189565b6040516020818303038152906040528051906020012014156118d9576118d2836040518060400160405280600681526020017f524154494e4700000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b828210156118c957838290600052602060002001805461183c90614914565b80601f016020809104026020016040519081016040528092919081815260200182805461186890614914565b80156118b55780601f1061188a576101008083540402835291602001916118b5565b820191906000526020600020905b81548152906001019060200180831161189857829003601f168201915b50505050508152602001906001019061181d565b50505050612a3b565b9050611b57565b6040516020016118e890614314565b604051602081830303815290604052805190602001208260405160200161190f9190614189565b604051602081830303815290604052805190602001201415611a4357611a3c836040518060400160405280600681526020017f524154494e4700000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015611a335783829060005260206000200180546119a690614914565b80601f01602080910402602001604051908101604052809291908181526020018280546119d290614914565b8015611a1f5780601f106119f457610100808354040283529160200191611a1f565b820191906000526020600020905b815481529060010190602001808311611a0257829003601f168201915b505050505081526020019060010190611987565b50505050612a3b565b9050611b57565b611b54836040518060400160405280600681526020017f524154494e4700000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b82821015611b4b578382906000526020600020018054611abe90614914565b80601f0160208091040260200160405190810160405280929190818152602001828054611aea90614914565b8015611b375780601f10611b0c57610100808354040283529160200191611b37565b820191906000526020600020905b815481529060010190602001808311611b1a57829003601f168201915b505050505081526020019060010190611a9f565b50505050612a3b565b90505b92915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611b9690614914565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc290614914565b8015611c0f5780601f10611be457610100808354040283529160200191611c0f565b820191906000526020600020905b815481529060010190602001808311611bf257829003601f168201915b5050505050905090565b611c21612622565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c869061448f565b60405180910390fd5b8060056000611c9c612622565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d49612622565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d8e91906143b2565b60405180910390a35050565b611dab611da5612622565b836126e3565b611dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de1906145ef565b60405180910390fd5b611df684848484612c26565b50505050565b6060611e0661380a565b604051806101600160405280610136815260200161539f6101369139816000600d8110611e3657611e35614aad565b5b6020020181905250611e4783610e5b565b816001600d8110611e5b57611e5a614aad565b5b60200201819052506040518060600160405280603f81526020016154d5603f9139816002600d8110611e9057611e8f614aad565b5b6020020181905250611eba83826001600d8110611eb057611eaf614aad565b5b602002015161176d565b816003600d8110611ece57611ecd614aad565b5b60200201819052506040518060600160405280603f81526020016152e1603f9139816004600d8110611f0357611f02614aad565b5b6020020181905250611f2d83826001600d8110611f2357611f22614aad565b5b602002015161113d565b816005600d8110611f4157611f40614aad565b5b60200201819052506040518060600160405280603f81526020016152a2603f9139816006600d8110611f7657611f75614aad565b5b6020020181905250611fb983826001600d8110611f9657611f95614aad565b5b6020020151836005600d8110611faf57611fae614aad565b5b60200201516109da565b816007600d8110611fcd57611fcc614aad565b5b60200201819052506040518060600160405280603f8152602001615320603f9139816008600d811061200257612001614aad565b5b6020020181905250612049836040518060400160405280600481526020017f4c454144000000000000000000000000000000000000000000000000000000008152506115b5565b816009600d811061205d5761205c614aad565b5b60200201819052506040518060600160405280603f8152602001615263603f913981600a600d811061209257612091614aad565b5b60200201819052506120d9836040518060400160405280600a81526020017f535550504f5254494e47000000000000000000000000000000000000000000008152506115b5565b81600b600d81106120ed576120ec614aad565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081600c600d811061213f5761213e614aad565b5b60200201819052506000816000600d811061215d5761215c614aad565b5b6020020151826001600d811061217657612175614aad565b5b6020020151836002600d811061218f5761218e614aad565b5b6020020151846003600d81106121a8576121a7614aad565b5b6020020151856004600d81106121c1576121c0614aad565b5b6020020151866005600d81106121da576121d9614aad565b5b6020020151876006600d81106121f3576121f2614aad565b5b6020020151886007600d811061220c5761220b614aad565b5b6020020151896008600d811061222557612224614aad565b5b60200201516040516020016122429998979695949392919061420f565b604051602081830303815290604052905080826009600d811061226857612267614aad565b5b602002015183600a600d811061228157612280614aad565b5b602002015184600b600d811061229a57612299614aad565b5b602002015185600c600d81106122b3576122b2614aad565b5b60200201516040516020016122cc9594939291906141c4565b604051602081830303815290604052905060006123196122eb86612c82565b6122f484612de3565b6040516020016123059291906142cf565b604051602081830303815290604052612de3565b90508060405160200161232c9190614329565b6040516020818303038152906040529150819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123e4612622565b73ffffffffffffffffffffffffffffffffffffffff16612402611b5d565b73ffffffffffffffffffffffffffffffffffffffff1614612458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244f9061456f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bf9061442f565b60405180910390fd5b6124d181612aaa565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061259f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125af57506125ae82612f7b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661269d836113c3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126ee826125b6565b61272d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612724906144af565b60405180910390fd5b6000612738836113c3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127a757508373ffffffffffffffffffffffffffffffffffffffff1661278f84610671565b73ffffffffffffffffffffffffffffffffffffffff16145b806127b857506127b78185612348565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127e1826113c3565b73ffffffffffffffffffffffffffffffffffffffff1614612837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282e906145af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289e9061446f565b60405180910390fd5b6128b2838383612fe5565b6128bd60008261262a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290d919061482a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129649190614749565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612a378282604051806020016040528060008152506130f9565b5050565b60606000612a7184612a4c87612c82565b604051602001612a5d9291906141a0565b604051602081830303815290604052613154565b9050600083845183612a8391906149c0565b81518110612a9457612a93614aad565b5b6020026020010151905080925050509392505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000612ba685612b8188612c82565b604051602001612b929291906141a0565b604051602081830303815290604052613154565b90506000601582612bb791906149c0565b9050600e811115612bf25783845183612bd091906149c0565b81518110612be157612be0614aad565b5b602002602001015192505050612c1e565b84855183612c0091906149c0565b81518110612c1157612c10614aad565b5b6020026020010151925050505b949350505050565b612c318484846127c1565b612c3d84848484613187565b612c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c739061440f565b60405180910390fd5b50505050565b60606000821415612cca576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dde565b600082905060005b60008214612cfc578080612ce590614977565b915050600a82612cf5919061479f565b9150612cd2565b60008167ffffffffffffffff811115612d1857612d17614adc565b5b6040519080825280601f01601f191660200182016040528015612d4a5781602001600182028036833780820191505090505b5090505b60008514612dd757600182612d63919061482a565b9150600a85612d7291906149c0565b6030612d7e9190614749565b60f81b818381518110612d9457612d93614aad565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612dd0919061479f565b9450612d4e565b8093505050505b919050565b60606000825190506000811415612e0c5760405180602001604052806000815250915050612f76565b60006003600283612e1d9190614749565b612e27919061479f565b6004612e3391906147d0565b90506000602082612e449190614749565b67ffffffffffffffff811115612e5d57612e5c614adc565b5b6040519080825280601f01601f191660200182016040528015612e8f5781602001600182028036833780820191505090505b509050600060405180606001604052806040815260200161535f604091399050600181016020830160005b86811015612f335760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612eba565b506003860660018114612f4d5760028114612f5d57612f68565b613d3d60f01b6002830352612f68565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ff083838361331e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130335761302e81613323565b613072565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461307157613070838261336c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130b5576130b0816134d9565b6130f4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130f3576130f282826135aa565b5b5b505050565b6131038383613629565b6131106000848484613187565b61314f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131469061440f565b60405180910390fd5b505050565b6000816040516020016131679190614189565b6040516020818303038152906040528051906020012060001c9050919050565b60006131a88473ffffffffffffffffffffffffffffffffffffffff166137f7565b15613311578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131d1612622565b8786866040518563ffffffff1660e01b81526004016131f39493929190614366565b602060405180830381600087803b15801561320d57600080fd5b505af192505050801561323e57506040513d601f19601f8201168201806040525081019061323b9190613b6b565b60015b6132c1573d806000811461326e576040519150601f19603f3d011682016040523d82523d6000602084013e613273565b606091505b506000815114156132b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b09061440f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613316565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161337984611475565b613383919061482a565b9050600060076000848152602001908152602001600020549050818114613468576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134ed919061482a565b905060006009600084815260200190815260200160002054905060006008838154811061351d5761351c614aad565b5b90600052602060002001549050806008838154811061353f5761353e614aad565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061358e5761358d614a7e565b5b6001900381819060005260206000200160009055905550505050565b60006135b583611475565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613699576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136909061452f565b60405180910390fd5b6136a2816125b6565b156136e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d99061444f565b60405180910390fd5b6136ee60008383612fe5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461373e9190614749565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b604051806101a00160405280600d905b606081526020019060019003908161381a5790505090565b60006138456138408461468f565b61466a565b90508281526020810184848401111561386157613860614b10565b5b61386c8482856148d2565b509392505050565b6000613887613882846146c0565b61466a565b9050828152602081018484840111156138a3576138a2614b10565b5b6138ae8482856148d2565b509392505050565b6000813590506138c581615206565b92915050565b6000813590506138da8161521d565b92915050565b6000813590506138ef81615234565b92915050565b60008151905061390481615234565b92915050565b600082601f83011261391f5761391e614b0b565b5b813561392f848260208601613832565b91505092915050565b600082601f83011261394d5761394c614b0b565b5b813561395d848260208601613874565b91505092915050565b6000813590506139758161524b565b92915050565b60006020828403121561399157613990614b1a565b5b600061399f848285016138b6565b91505092915050565b600080604083850312156139bf576139be614b1a565b5b60006139cd858286016138b6565b92505060206139de858286016138b6565b9150509250929050565b600080600060608486031215613a0157613a00614b1a565b5b6000613a0f868287016138b6565b9350506020613a20868287016138b6565b9250506040613a3186828701613966565b9150509250925092565b60008060008060808587031215613a5557613a54614b1a565b5b6000613a63878288016138b6565b9450506020613a74878288016138b6565b9350506040613a8587828801613966565b925050606085013567ffffffffffffffff811115613aa657613aa5614b15565b5b613ab28782880161390a565b91505092959194509250565b60008060408385031215613ad557613ad4614b1a565b5b6000613ae3858286016138b6565b9250506020613af4858286016138cb565b9150509250929050565b60008060408385031215613b1557613b14614b1a565b5b6000613b23858286016138b6565b9250506020613b3485828601613966565b9150509250929050565b600060208284031215613b5457613b53614b1a565b5b6000613b62848285016138e0565b91505092915050565b600060208284031215613b8157613b80614b1a565b5b6000613b8f848285016138f5565b91505092915050565b600060208284031215613bae57613bad614b1a565b5b6000613bbc84828501613966565b91505092915050565b60008060408385031215613bdc57613bdb614b1a565b5b6000613bea85828601613966565b925050602083013567ffffffffffffffff811115613c0b57613c0a614b15565b5b613c1785828601613938565b9150509250929050565b600080600060608486031215613c3a57613c39614b1a565b5b6000613c4886828701613966565b935050602084013567ffffffffffffffff811115613c6957613c68614b15565b5b613c7586828701613938565b925050604084013567ffffffffffffffff811115613c9657613c95614b15565b5b613ca286828701613938565b9150509250925092565b613cb58161485e565b82525050565b613cc481614870565b82525050565b6000613cd582614706565b613cdf818561471c565b9350613cef8185602086016148e1565b613cf881614b1f565b840191505092915050565b6000613d0e82614711565b613d18818561472d565b9350613d288185602086016148e1565b613d3181614b1f565b840191505092915050565b6000613d4782614711565b613d51818561473e565b9350613d618185602086016148e1565b80840191505092915050565b60008154613d7a81614914565b613d84818661473e565b94506001821660008114613d9f5760018114613db057613de3565b60ff19831686528186019350613de3565b613db9856146f1565b60005b83811015613ddb57815481890152600182019150602081019050613dbc565b838801955050505b50505092915050565b6000613df960b58361473e565b9150613e0482614b30565b60b582019050919050565b6000613e1c602b8361472d565b9150613e2782614c17565b604082019050919050565b6000613e3f60328361472d565b9150613e4a82614c66565b604082019050919050565b6000613e6260268361472d565b9150613e6d82614cb5565b604082019050919050565b6000613e8560078361473e565b9150613e9082614d04565b600782019050919050565b6000613ea8601c8361472d565b9150613eb382614d2d565b602082019050919050565b6000613ecb60078361473e565b9150613ed682614d56565b600782019050919050565b6000613eee60248361472d565b9150613ef982614d7f565b604082019050919050565b6000613f1160198361472d565b9150613f1c82614dce565b602082019050919050565b6000613f34602c8361472d565b9150613f3f82614df7565b604082019050919050565b6000613f5760388361472d565b9150613f6282614e46565b604082019050919050565b6000613f7a602a8361472d565b9150613f8582614e95565b604082019050919050565b6000613f9d60298361472d565b9150613fa882614ee4565b604082019050919050565b6000613fc060028361473e565b9150613fcb82614f33565b600282019050919050565b6000613fe360208361472d565b9150613fee82614f5c565b602082019050919050565b6000614006602c8361472d565b915061401182614f85565b604082019050919050565b600061402960208361472d565b915061403482614fd4565b602082019050919050565b600061404c60118361473e565b915061405782614ffd565b601182019050919050565b600061406f60108361472d565b915061407a82615026565b602082019050919050565b600061409260298361472d565b915061409d8261504f565b604082019050919050565b60006140b560058361473e565b91506140c08261509e565b600582019050919050565b60006140d860218361472d565b91506140e3826150c7565b604082019050919050565b60006140fb601d8361473e565b915061410682615116565b601d82019050919050565b600061411e60318361472d565b91506141298261513f565b604082019050919050565b6000614141602c8361472d565b915061414c8261518e565b604082019050919050565b6000614164601f8361472d565b915061416f826151dd565b602082019050919050565b614183816148c8565b82525050565b60006141958284613d3c565b915081905092915050565b60006141ac8285613d3c565b91506141b88284613d3c565b91508190509392505050565b60006141d08288613d3c565b91506141dc8287613d3c565b91506141e88286613d3c565b91506141f48285613d3c565b91506142008284613d3c565b91508190509695505050505050565b600061421b828c613d3c565b9150614227828b613d3c565b9150614233828a613d3c565b915061423f8289613d3c565b915061424b8288613d3c565b91506142578287613d3c565b91506142638286613d3c565b915061426f8285613d3c565b915061427b8284613d3c565b91508190509a9950505050505050505050565b600061429a8284613d6d565b915081905092915050565b60006142b082613e78565b9150819050919050565b60006142c582613ebe565b9150819050919050565b60006142da8261403f565b91506142e68285613d3c565b91506142f182613dec565b91506142fd8284613d3c565b915061430882613fb3565b91508190509392505050565b600061431f826140a8565b9150819050919050565b6000614334826140ee565b91506143408284613d3c565b915081905092915050565b60006020820190506143606000830184613cac565b92915050565b600060808201905061437b6000830187613cac565b6143886020830186613cac565b614395604083018561417a565b81810360608301526143a78184613cca565b905095945050505050565b60006020820190506143c76000830184613cbb565b92915050565b600060208201905081810360008301526143e78184613d03565b905092915050565b6000602082019050818103600083015261440881613e0f565b9050919050565b6000602082019050818103600083015261442881613e32565b9050919050565b6000602082019050818103600083015261444881613e55565b9050919050565b6000602082019050818103600083015261446881613e9b565b9050919050565b6000602082019050818103600083015261448881613ee1565b9050919050565b600060208201905081810360008301526144a881613f04565b9050919050565b600060208201905081810360008301526144c881613f27565b9050919050565b600060208201905081810360008301526144e881613f4a565b9050919050565b6000602082019050818103600083015261450881613f6d565b9050919050565b6000602082019050818103600083015261452881613f90565b9050919050565b6000602082019050818103600083015261454881613fd6565b9050919050565b6000602082019050818103600083015261456881613ff9565b9050919050565b600060208201905081810360008301526145888161401c565b9050919050565b600060208201905081810360008301526145a881614062565b9050919050565b600060208201905081810360008301526145c881614085565b9050919050565b600060208201905081810360008301526145e8816140cb565b9050919050565b6000602082019050818103600083015261460881614111565b9050919050565b6000602082019050818103600083015261462881614134565b9050919050565b6000602082019050818103600083015261464881614157565b9050919050565b6000602082019050614664600083018461417a565b92915050565b6000614674614685565b90506146808282614946565b919050565b6000604051905090565b600067ffffffffffffffff8211156146aa576146a9614adc565b5b6146b382614b1f565b9050602081019050919050565b600067ffffffffffffffff8211156146db576146da614adc565b5b6146e482614b1f565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614754826148c8565b915061475f836148c8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614794576147936149f1565b5b828201905092915050565b60006147aa826148c8565b91506147b5836148c8565b9250826147c5576147c4614a20565b5b828204905092915050565b60006147db826148c8565b91506147e6836148c8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561481f5761481e6149f1565b5b828202905092915050565b6000614835826148c8565b9150614840836148c8565b925082821015614853576148526149f1565b5b828203905092915050565b6000614869826148a8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156148ff5780820151818401526020810190506148e4565b8381111561490e576000848401525b50505050565b6000600282049050600182168061492c57607f821691505b602082108114156149405761493f614a4f565b5b50919050565b61494f82614b1f565b810181811067ffffffffffffffff8211171561496e5761496d614adc565b5b80604052505050565b6000614982826148c8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149b5576149b46149f1565b5b600182019050919050565b60006149cb826148c8565b91506149d6836148c8565b9250826149e6576149e5614a20565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f222c20226465736372697074696f6e223a202250696c6f742069732072616e6460008201527f6f6d697a65642054562f4d6f7669652f506f646361737420706974636865732060208201527f67656e65726174656420616e642073746f726564206f6e20636861696e2e205760408201527f652067656e657261746520746865207072656d6973652e20596f752067656e6560608201527f72617465207468652062757a7a2e222c2022696d616765223a2022646174613a60808201527f696d6167652f7376672b786d6c3b6261736536342c000000000000000000000060a082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f506f646361737400000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f54562053686f7700000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7b226e616d65223a202250697463682023000000000000000000000000000000600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4d6f766965000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61520f8161485e565b811461521a57600080fd5b50565b61522681614870565b811461523157600080fd5b50565b61523d8161487c565b811461524857600080fd5b50565b615254816148c8565b811461525f57600080fd5b5056fe3c2f746578743e3c7465787420746578742d616e63686f723d226d6964646c652220783d223530252220793d223232302220636c6173733d2262617365223e3c2f746578743e3c7465787420746578742d616e63686f723d226d6964646c652220783d223530252220793d223138302220636c6173733d2262617365223e3c2f746578743e3c7465787420746578742d616e63686f723d226d6964646c652220783d223530252220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420746578742d616e63686f723d226d6964646c652220783d223530252220793d223230302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a20636f7572696572206e65772c206d6f6e6f73706163653b20666f6e742d73697a653a20313470783b20666f6e742d7765696768743a20626f6c647d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22776869746522202f3e3c7465787420746578742d616e63686f723d226d6964646c652220783d223530252220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420746578742d616e63686f723d226d6964646c652220783d223530252220793d223134302220636c6173733d2262617365223ea26469706673582212200813a0581b50867327a473bd7b0e71c3951c5787a84f734ad5d7f849b4de102b64736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806356e3f2af116100de5780638da5cb5b11610097578063b88d4fde11610071578063b88d4fde146104cd578063c87b56dd146104e9578063e985e9c514610519578063f2fde38b146105495761018e565b80638da5cb5b1461047557806395d89b4114610493578063a22cb465146104b15761018e565b806356e3f2af1461037b5780636352211e146103ab57806370a08231146103db578063715018a61461040b5780637bca4192146104155780638c8107ba146104455761018e565b80632f745c591161014b5780634036ab78116101255780634036ab78146102e357806342842e0e14610313578063434f48c41461032f5780634f6ccce71461034b5761018e565b80632f745c5914610267578063379607f5146102975780633ac0c814146102b35761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806318160ddd1461022d57806323b872dd1461024b575b600080fd5b6101ad60048036038101906101a89190613b3e565b610565565b6040516101ba91906143b2565b60405180910390f35b6101cb6105df565b6040516101d891906143cd565b60405180910390f35b6101fb60048036038101906101f69190613b98565b610671565b604051610208919061434b565b60405180910390f35b61022b60048036038101906102269190613afe565b6106f6565b005b61023561080e565b604051610242919061464f565b60405180910390f35b610265600480360381019061026091906139e8565b61081b565b005b610281600480360381019061027c9190613afe565b61087b565b60405161028e919061464f565b60405180910390f35b6102b160048036038101906102ac9190613b98565b610920565b005b6102cd60048036038101906102c89190613c21565b6109da565b6040516102da91906143cd565b60405180910390f35b6102fd60048036038101906102f89190613b98565b610e5b565b60405161030a91906143cd565b60405180910390f35b61032d600480360381019061032891906139e8565b610f75565b005b61034960048036038101906103449190613b98565b610f95565b005b61036560048036038101906103609190613b98565b6110cc565b604051610372919061464f565b60405180910390f35b61039560048036038101906103909190613bc5565b61113d565b6040516103a291906143cd565b60405180910390f35b6103c560048036038101906103c09190613b98565b6113c3565b6040516103d2919061434b565b60405180910390f35b6103f560048036038101906103f0919061397b565b611475565b604051610402919061464f565b60405180910390f35b61041361152d565b005b61042f600480360381019061042a9190613bc5565b6115b5565b60405161043c91906143cd565b60405180910390f35b61045f600480360381019061045a9190613bc5565b61176d565b60405161046c91906143cd565b60405180910390f35b61047d611b5d565b60405161048a919061434b565b60405180910390f35b61049b611b87565b6040516104a891906143cd565b60405180910390f35b6104cb60048036038101906104c69190613abe565b611c19565b005b6104e760048036038101906104e29190613a3b565b611d9a565b005b61050360048036038101906104fe9190613b98565b611dfc565b60405161051091906143cd565b60405180910390f35b610533600480360381019061052e91906139a8565b612348565b60405161054091906143b2565b60405180910390f35b610563600480360381019061055e919061397b565b6123dc565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105d857506105d7826124d4565b5b9050919050565b6060600080546105ee90614914565b80601f016020809104026020016040519081016040528092919081815260200182805461061a90614914565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b5050505050905090565b600061067c826125b6565b6106bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b29061454f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610701826113c3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610772576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610769906145cf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610791612622565b73ffffffffffffffffffffffffffffffffffffffff1614806107c057506107bf816107ba612622565b612348565b5b6107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f6906144cf565b60405180910390fd5b610809838361262a565b505050565b6000600880549050905090565b61082c610826612622565b826126e3565b61086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906145ef565b60405180910390fd5b6108768383836127c1565b505050565b600061088683611475565b82106108c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108be906143ef565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a541415610966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095d9061462f565b60405180910390fd5b6002600a8190555060008111801561097f5750611e6281105b6109be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b59061458f565b60405180910390fd5b6109cf6109c9612622565b82612a1d565b6001600a8190555050565b60606040516020016109eb906142a5565b6040516020818303038152906040528051906020012083604051602001610a129190614189565b604051602081830303815290604052805190602001201415610c435760006001600d80549050610a42919061482a565b67ffffffffffffffff811115610a5b57610a5a614adc565b5b604051908082528060200260200182016040528015610a8e57816020015b6060815260200190600190039081610a795790505b5090506000805b600d80549050811015610bf95784604051602001610ab39190614189565b60405160208183030381529060405280519060200120600d8281548110610add57610adc614aad565b5b90600052602060002001604051602001610af7919061428e565b6040516020818303038152906040528051906020012014610be657600d8181548110610b2657610b25614aad565b5b906000526020600020018054610b3b90614914565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6790614914565b8015610bb45780601f10610b8957610100808354040283529160200191610bb4565b820191906000526020600020905b815481529060010190602001808311610b9757829003601f168201915b5050505050838381518110610bcc57610bcb614aad565b5b60200260200101819052508180610be290614977565b9250505b8080610bf190614977565b915050610a95565b50610c3a866040518060400160405280600a81526020017f43524f535347454e52450000000000000000000000000000000000000000000081525084612a3b565b92505050610e54565b60006001600c80549050610c57919061482a565b67ffffffffffffffff811115610c7057610c6f614adc565b5b604051908082528060200260200182016040528015610ca357816020015b6060815260200190600190039081610c8e5790505b5090506000805b600c80549050811015610e0e5784604051602001610cc89190614189565b60405160208183030381529060405280519060200120600c8281548110610cf257610cf1614aad565b5b90600052602060002001604051602001610d0c919061428e565b6040516020818303038152906040528051906020012014610dfb57600c8181548110610d3b57610d3a614aad565b5b906000526020600020018054610d5090614914565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7c90614914565b8015610dc95780601f10610d9e57610100808354040283529160200191610dc9565b820191906000526020600020905b815481529060010190602001808311610dac57829003601f168201915b5050505050838381518110610de157610de0614aad565b5b60200260200101819052508180610df790614977565b9250505b8080610e0690614977565b915050610caa565b50610e4f866040518060400160405280600a81526020017f43524f535347454e52450000000000000000000000000000000000000000000081525084612a3b565b925050505b9392505050565b6060610f6e826040518060400160405280600481526020017f54595045000000000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b82821015610f65578382906000526020600020018054610ed890614914565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0490614914565b8015610f515780601f10610f2657610100808354040283529160200191610f51565b820191906000526020600020905b815481529060010190602001808311610f3457829003601f168201915b505050505081526020019060010190610eb9565b50505050612a3b565b9050919050565b610f9083838360405180602001604052806000815250611d9a565b505050565b6002600a541415610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd29061462f565b60405180910390fd5b6002600a81905550610feb612622565b73ffffffffffffffffffffffffffffffffffffffff16611009611b5d565b73ffffffffffffffffffffffffffffffffffffffff161461105f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110569061456f565b60405180910390fd5b611e61811180156110715750611f4181105b6110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a79061458f565b60405180910390fd5b6110c16110bb611b5d565b82612a1d565b6001600a8190555050565b60006110d661080e565b8210611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e9061460f565b60405180910390fd5b6008828154811061112b5761112a614aad565b5b90600052602060002001549050919050565b606060405160200161114e906142a5565b60405160208183030381529060405280519060200120826040516020016111759190614189565b6040516020818303038152906040528051906020012014156112a9576112a2836040518060400160405280600581526020017f47454e5245000000000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b8282101561129957838290600052602060002001805461120c90614914565b80601f016020809104026020016040519081016040528092919081815260200182805461123890614914565b80156112855780601f1061125a57610100808354040283529160200191611285565b820191906000526020600020905b81548152906001019060200180831161126857829003601f168201915b5050505050815260200190600101906111ed565b50505050612a3b565b90506113bd565b6113ba836040518060400160405280600581526020017f47454e5245000000000000000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b828210156113b157838290600052602060002001805461132490614914565b80601f016020809104026020016040519081016040528092919081815260200182805461135090614914565b801561139d5780601f106113725761010080835404028352916020019161139d565b820191906000526020600020905b81548152906001019060200180831161138057829003601f168201915b505050505081526020019060010190611305565b50505050612a3b565b90505b92915050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561146c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114639061450f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dd906144ef565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611535612622565b73ffffffffffffffffffffffffffffffffffffffff16611553611b5d565b73ffffffffffffffffffffffffffffffffffffffff16146115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a09061456f565b60405180910390fd5b6115b36000612aaa565b565b60606117658383600e805480602002602001604051908101604052809291908181526020016000905b8282101561168a5783829060005260206000200180546115fd90614914565b80601f016020809104026020016040519081016040528092919081815260200182805461162990614914565b80156116765780601f1061164b57610100808354040283529160200191611676565b820191906000526020600020905b81548152906001019060200180831161165957829003601f168201915b5050505050815260200190600101906115de565b50505050600f805480602002602001604051908101604052809291908181526020016000905b8282101561175c5783829060005260206000200180546116cf90614914565b80601f01602080910402602001604051908101604052809291908181526020018280546116fb90614914565b80156117485780601f1061171d57610100808354040283529160200191611748565b820191906000526020600020905b81548152906001019060200180831161172b57829003601f168201915b5050505050815260200190600101906116b0565b50505050612b70565b905092915050565b606060405160200161177e906142ba565b60405160208183030381529060405280519060200120826040516020016117a59190614189565b6040516020818303038152906040528051906020012014156118d9576118d2836040518060400160405280600681526020017f524154494e4700000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b828210156118c957838290600052602060002001805461183c90614914565b80601f016020809104026020016040519081016040528092919081815260200182805461186890614914565b80156118b55780601f1061188a576101008083540402835291602001916118b5565b820191906000526020600020905b81548152906001019060200180831161189857829003601f168201915b50505050508152602001906001019061181d565b50505050612a3b565b9050611b57565b6040516020016118e890614314565b604051602081830303815290604052805190602001208260405160200161190f9190614189565b604051602081830303815290604052805190602001201415611a4357611a3c836040518060400160405280600681526020017f524154494e4700000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015611a335783829060005260206000200180546119a690614914565b80601f01602080910402602001604051908101604052809291908181526020018280546119d290614914565b8015611a1f5780601f106119f457610100808354040283529160200191611a1f565b820191906000526020600020905b815481529060010190602001808311611a0257829003601f168201915b505050505081526020019060010190611987565b50505050612a3b565b9050611b57565b611b54836040518060400160405280600681526020017f524154494e4700000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b82821015611b4b578382906000526020600020018054611abe90614914565b80601f0160208091040260200160405190810160405280929190818152602001828054611aea90614914565b8015611b375780601f10611b0c57610100808354040283529160200191611b37565b820191906000526020600020905b815481529060010190602001808311611b1a57829003601f168201915b505050505081526020019060010190611a9f565b50505050612a3b565b90505b92915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611b9690614914565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc290614914565b8015611c0f5780601f10611be457610100808354040283529160200191611c0f565b820191906000526020600020905b815481529060010190602001808311611bf257829003601f168201915b5050505050905090565b611c21612622565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c869061448f565b60405180910390fd5b8060056000611c9c612622565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d49612622565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d8e91906143b2565b60405180910390a35050565b611dab611da5612622565b836126e3565b611dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de1906145ef565b60405180910390fd5b611df684848484612c26565b50505050565b6060611e0661380a565b604051806101600160405280610136815260200161539f6101369139816000600d8110611e3657611e35614aad565b5b6020020181905250611e4783610e5b565b816001600d8110611e5b57611e5a614aad565b5b60200201819052506040518060600160405280603f81526020016154d5603f9139816002600d8110611e9057611e8f614aad565b5b6020020181905250611eba83826001600d8110611eb057611eaf614aad565b5b602002015161176d565b816003600d8110611ece57611ecd614aad565b5b60200201819052506040518060600160405280603f81526020016152e1603f9139816004600d8110611f0357611f02614aad565b5b6020020181905250611f2d83826001600d8110611f2357611f22614aad565b5b602002015161113d565b816005600d8110611f4157611f40614aad565b5b60200201819052506040518060600160405280603f81526020016152a2603f9139816006600d8110611f7657611f75614aad565b5b6020020181905250611fb983826001600d8110611f9657611f95614aad565b5b6020020151836005600d8110611faf57611fae614aad565b5b60200201516109da565b816007600d8110611fcd57611fcc614aad565b5b60200201819052506040518060600160405280603f8152602001615320603f9139816008600d811061200257612001614aad565b5b6020020181905250612049836040518060400160405280600481526020017f4c454144000000000000000000000000000000000000000000000000000000008152506115b5565b816009600d811061205d5761205c614aad565b5b60200201819052506040518060600160405280603f8152602001615263603f913981600a600d811061209257612091614aad565b5b60200201819052506120d9836040518060400160405280600a81526020017f535550504f5254494e47000000000000000000000000000000000000000000008152506115b5565b81600b600d81106120ed576120ec614aad565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081600c600d811061213f5761213e614aad565b5b60200201819052506000816000600d811061215d5761215c614aad565b5b6020020151826001600d811061217657612175614aad565b5b6020020151836002600d811061218f5761218e614aad565b5b6020020151846003600d81106121a8576121a7614aad565b5b6020020151856004600d81106121c1576121c0614aad565b5b6020020151866005600d81106121da576121d9614aad565b5b6020020151876006600d81106121f3576121f2614aad565b5b6020020151886007600d811061220c5761220b614aad565b5b6020020151896008600d811061222557612224614aad565b5b60200201516040516020016122429998979695949392919061420f565b604051602081830303815290604052905080826009600d811061226857612267614aad565b5b602002015183600a600d811061228157612280614aad565b5b602002015184600b600d811061229a57612299614aad565b5b602002015185600c600d81106122b3576122b2614aad565b5b60200201516040516020016122cc9594939291906141c4565b604051602081830303815290604052905060006123196122eb86612c82565b6122f484612de3565b6040516020016123059291906142cf565b604051602081830303815290604052612de3565b90508060405160200161232c9190614329565b6040516020818303038152906040529150819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123e4612622565b73ffffffffffffffffffffffffffffffffffffffff16612402611b5d565b73ffffffffffffffffffffffffffffffffffffffff1614612458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244f9061456f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bf9061442f565b60405180910390fd5b6124d181612aaa565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061259f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125af57506125ae82612f7b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661269d836113c3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126ee826125b6565b61272d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612724906144af565b60405180910390fd5b6000612738836113c3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127a757508373ffffffffffffffffffffffffffffffffffffffff1661278f84610671565b73ffffffffffffffffffffffffffffffffffffffff16145b806127b857506127b78185612348565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127e1826113c3565b73ffffffffffffffffffffffffffffffffffffffff1614612837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282e906145af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289e9061446f565b60405180910390fd5b6128b2838383612fe5565b6128bd60008261262a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290d919061482a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129649190614749565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612a378282604051806020016040528060008152506130f9565b5050565b60606000612a7184612a4c87612c82565b604051602001612a5d9291906141a0565b604051602081830303815290604052613154565b9050600083845183612a8391906149c0565b81518110612a9457612a93614aad565b5b6020026020010151905080925050509392505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000612ba685612b8188612c82565b604051602001612b929291906141a0565b604051602081830303815290604052613154565b90506000601582612bb791906149c0565b9050600e811115612bf25783845183612bd091906149c0565b81518110612be157612be0614aad565b5b602002602001015192505050612c1e565b84855183612c0091906149c0565b81518110612c1157612c10614aad565b5b6020026020010151925050505b949350505050565b612c318484846127c1565b612c3d84848484613187565b612c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c739061440f565b60405180910390fd5b50505050565b60606000821415612cca576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dde565b600082905060005b60008214612cfc578080612ce590614977565b915050600a82612cf5919061479f565b9150612cd2565b60008167ffffffffffffffff811115612d1857612d17614adc565b5b6040519080825280601f01601f191660200182016040528015612d4a5781602001600182028036833780820191505090505b5090505b60008514612dd757600182612d63919061482a565b9150600a85612d7291906149c0565b6030612d7e9190614749565b60f81b818381518110612d9457612d93614aad565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612dd0919061479f565b9450612d4e565b8093505050505b919050565b60606000825190506000811415612e0c5760405180602001604052806000815250915050612f76565b60006003600283612e1d9190614749565b612e27919061479f565b6004612e3391906147d0565b90506000602082612e449190614749565b67ffffffffffffffff811115612e5d57612e5c614adc565b5b6040519080825280601f01601f191660200182016040528015612e8f5781602001600182028036833780820191505090505b509050600060405180606001604052806040815260200161535f604091399050600181016020830160005b86811015612f335760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612eba565b506003860660018114612f4d5760028114612f5d57612f68565b613d3d60f01b6002830352612f68565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ff083838361331e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130335761302e81613323565b613072565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461307157613070838261336c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130b5576130b0816134d9565b6130f4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130f3576130f282826135aa565b5b5b505050565b6131038383613629565b6131106000848484613187565b61314f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131469061440f565b60405180910390fd5b505050565b6000816040516020016131679190614189565b6040516020818303038152906040528051906020012060001c9050919050565b60006131a88473ffffffffffffffffffffffffffffffffffffffff166137f7565b15613311578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131d1612622565b8786866040518563ffffffff1660e01b81526004016131f39493929190614366565b602060405180830381600087803b15801561320d57600080fd5b505af192505050801561323e57506040513d601f19601f8201168201806040525081019061323b9190613b6b565b60015b6132c1573d806000811461326e576040519150601f19603f3d011682016040523d82523d6000602084013e613273565b606091505b506000815114156132b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b09061440f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613316565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161337984611475565b613383919061482a565b9050600060076000848152602001908152602001600020549050818114613468576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134ed919061482a565b905060006009600084815260200190815260200160002054905060006008838154811061351d5761351c614aad565b5b90600052602060002001549050806008838154811061353f5761353e614aad565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061358e5761358d614a7e565b5b6001900381819060005260206000200160009055905550505050565b60006135b583611475565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613699576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136909061452f565b60405180910390fd5b6136a2816125b6565b156136e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d99061444f565b60405180910390fd5b6136ee60008383612fe5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461373e9190614749565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b604051806101a00160405280600d905b606081526020019060019003908161381a5790505090565b60006138456138408461468f565b61466a565b90508281526020810184848401111561386157613860614b10565b5b61386c8482856148d2565b509392505050565b6000613887613882846146c0565b61466a565b9050828152602081018484840111156138a3576138a2614b10565b5b6138ae8482856148d2565b509392505050565b6000813590506138c581615206565b92915050565b6000813590506138da8161521d565b92915050565b6000813590506138ef81615234565b92915050565b60008151905061390481615234565b92915050565b600082601f83011261391f5761391e614b0b565b5b813561392f848260208601613832565b91505092915050565b600082601f83011261394d5761394c614b0b565b5b813561395d848260208601613874565b91505092915050565b6000813590506139758161524b565b92915050565b60006020828403121561399157613990614b1a565b5b600061399f848285016138b6565b91505092915050565b600080604083850312156139bf576139be614b1a565b5b60006139cd858286016138b6565b92505060206139de858286016138b6565b9150509250929050565b600080600060608486031215613a0157613a00614b1a565b5b6000613a0f868287016138b6565b9350506020613a20868287016138b6565b9250506040613a3186828701613966565b9150509250925092565b60008060008060808587031215613a5557613a54614b1a565b5b6000613a63878288016138b6565b9450506020613a74878288016138b6565b9350506040613a8587828801613966565b925050606085013567ffffffffffffffff811115613aa657613aa5614b15565b5b613ab28782880161390a565b91505092959194509250565b60008060408385031215613ad557613ad4614b1a565b5b6000613ae3858286016138b6565b9250506020613af4858286016138cb565b9150509250929050565b60008060408385031215613b1557613b14614b1a565b5b6000613b23858286016138b6565b9250506020613b3485828601613966565b9150509250929050565b600060208284031215613b5457613b53614b1a565b5b6000613b62848285016138e0565b91505092915050565b600060208284031215613b8157613b80614b1a565b5b6000613b8f848285016138f5565b91505092915050565b600060208284031215613bae57613bad614b1a565b5b6000613bbc84828501613966565b91505092915050565b60008060408385031215613bdc57613bdb614b1a565b5b6000613bea85828601613966565b925050602083013567ffffffffffffffff811115613c0b57613c0a614b15565b5b613c1785828601613938565b9150509250929050565b600080600060608486031215613c3a57613c39614b1a565b5b6000613c4886828701613966565b935050602084013567ffffffffffffffff811115613c6957613c68614b15565b5b613c7586828701613938565b925050604084013567ffffffffffffffff811115613c9657613c95614b15565b5b613ca286828701613938565b9150509250925092565b613cb58161485e565b82525050565b613cc481614870565b82525050565b6000613cd582614706565b613cdf818561471c565b9350613cef8185602086016148e1565b613cf881614b1f565b840191505092915050565b6000613d0e82614711565b613d18818561472d565b9350613d288185602086016148e1565b613d3181614b1f565b840191505092915050565b6000613d4782614711565b613d51818561473e565b9350613d618185602086016148e1565b80840191505092915050565b60008154613d7a81614914565b613d84818661473e565b94506001821660008114613d9f5760018114613db057613de3565b60ff19831686528186019350613de3565b613db9856146f1565b60005b83811015613ddb57815481890152600182019150602081019050613dbc565b838801955050505b50505092915050565b6000613df960b58361473e565b9150613e0482614b30565b60b582019050919050565b6000613e1c602b8361472d565b9150613e2782614c17565b604082019050919050565b6000613e3f60328361472d565b9150613e4a82614c66565b604082019050919050565b6000613e6260268361472d565b9150613e6d82614cb5565b604082019050919050565b6000613e8560078361473e565b9150613e9082614d04565b600782019050919050565b6000613ea8601c8361472d565b9150613eb382614d2d565b602082019050919050565b6000613ecb60078361473e565b9150613ed682614d56565b600782019050919050565b6000613eee60248361472d565b9150613ef982614d7f565b604082019050919050565b6000613f1160198361472d565b9150613f1c82614dce565b602082019050919050565b6000613f34602c8361472d565b9150613f3f82614df7565b604082019050919050565b6000613f5760388361472d565b9150613f6282614e46565b604082019050919050565b6000613f7a602a8361472d565b9150613f8582614e95565b604082019050919050565b6000613f9d60298361472d565b9150613fa882614ee4565b604082019050919050565b6000613fc060028361473e565b9150613fcb82614f33565b600282019050919050565b6000613fe360208361472d565b9150613fee82614f5c565b602082019050919050565b6000614006602c8361472d565b915061401182614f85565b604082019050919050565b600061402960208361472d565b915061403482614fd4565b602082019050919050565b600061404c60118361473e565b915061405782614ffd565b601182019050919050565b600061406f60108361472d565b915061407a82615026565b602082019050919050565b600061409260298361472d565b915061409d8261504f565b604082019050919050565b60006140b560058361473e565b91506140c08261509e565b600582019050919050565b60006140d860218361472d565b91506140e3826150c7565b604082019050919050565b60006140fb601d8361473e565b915061410682615116565b601d82019050919050565b600061411e60318361472d565b91506141298261513f565b604082019050919050565b6000614141602c8361472d565b915061414c8261518e565b604082019050919050565b6000614164601f8361472d565b915061416f826151dd565b602082019050919050565b614183816148c8565b82525050565b60006141958284613d3c565b915081905092915050565b60006141ac8285613d3c565b91506141b88284613d3c565b91508190509392505050565b60006141d08288613d3c565b91506141dc8287613d3c565b91506141e88286613d3c565b91506141f48285613d3c565b91506142008284613d3c565b91508190509695505050505050565b600061421b828c613d3c565b9150614227828b613d3c565b9150614233828a613d3c565b915061423f8289613d3c565b915061424b8288613d3c565b91506142578287613d3c565b91506142638286613d3c565b915061426f8285613d3c565b915061427b8284613d3c565b91508190509a9950505050505050505050565b600061429a8284613d6d565b915081905092915050565b60006142b082613e78565b9150819050919050565b60006142c582613ebe565b9150819050919050565b60006142da8261403f565b91506142e68285613d3c565b91506142f182613dec565b91506142fd8284613d3c565b915061430882613fb3565b91508190509392505050565b600061431f826140a8565b9150819050919050565b6000614334826140ee565b91506143408284613d3c565b915081905092915050565b60006020820190506143606000830184613cac565b92915050565b600060808201905061437b6000830187613cac565b6143886020830186613cac565b614395604083018561417a565b81810360608301526143a78184613cca565b905095945050505050565b60006020820190506143c76000830184613cbb565b92915050565b600060208201905081810360008301526143e78184613d03565b905092915050565b6000602082019050818103600083015261440881613e0f565b9050919050565b6000602082019050818103600083015261442881613e32565b9050919050565b6000602082019050818103600083015261444881613e55565b9050919050565b6000602082019050818103600083015261446881613e9b565b9050919050565b6000602082019050818103600083015261448881613ee1565b9050919050565b600060208201905081810360008301526144a881613f04565b9050919050565b600060208201905081810360008301526144c881613f27565b9050919050565b600060208201905081810360008301526144e881613f4a565b9050919050565b6000602082019050818103600083015261450881613f6d565b9050919050565b6000602082019050818103600083015261452881613f90565b9050919050565b6000602082019050818103600083015261454881613fd6565b9050919050565b6000602082019050818103600083015261456881613ff9565b9050919050565b600060208201905081810360008301526145888161401c565b9050919050565b600060208201905081810360008301526145a881614062565b9050919050565b600060208201905081810360008301526145c881614085565b9050919050565b600060208201905081810360008301526145e8816140cb565b9050919050565b6000602082019050818103600083015261460881614111565b9050919050565b6000602082019050818103600083015261462881614134565b9050919050565b6000602082019050818103600083015261464881614157565b9050919050565b6000602082019050614664600083018461417a565b92915050565b6000614674614685565b90506146808282614946565b919050565b6000604051905090565b600067ffffffffffffffff8211156146aa576146a9614adc565b5b6146b382614b1f565b9050602081019050919050565b600067ffffffffffffffff8211156146db576146da614adc565b5b6146e482614b1f565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614754826148c8565b915061475f836148c8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614794576147936149f1565b5b828201905092915050565b60006147aa826148c8565b91506147b5836148c8565b9250826147c5576147c4614a20565b5b828204905092915050565b60006147db826148c8565b91506147e6836148c8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561481f5761481e6149f1565b5b828202905092915050565b6000614835826148c8565b9150614840836148c8565b925082821015614853576148526149f1565b5b828203905092915050565b6000614869826148a8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156148ff5780820151818401526020810190506148e4565b8381111561490e576000848401525b50505050565b6000600282049050600182168061492c57607f821691505b602082108114156149405761493f614a4f565b5b50919050565b61494f82614b1f565b810181811067ffffffffffffffff8211171561496e5761496d614adc565b5b80604052505050565b6000614982826148c8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149b5576149b46149f1565b5b600182019050919050565b60006149cb826148c8565b91506149d6836148c8565b9250826149e6576149e5614a20565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f222c20226465736372697074696f6e223a202250696c6f742069732072616e6460008201527f6f6d697a65642054562f4d6f7669652f506f646361737420706974636865732060208201527f67656e65726174656420616e642073746f726564206f6e20636861696e2e205760408201527f652067656e657261746520746865207072656d6973652e20596f752067656e6560608201527f72617465207468652062757a7a2e222c2022696d616765223a2022646174613a60808201527f696d6167652f7376672b786d6c3b6261736536342c000000000000000000000060a082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f506f646361737400000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f54562053686f7700000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7b226e616d65223a202250697463682023000000000000000000000000000000600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4d6f766965000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61520f8161485e565b811461521a57600080fd5b50565b61522681614870565b811461523157600080fd5b50565b61523d8161487c565b811461524857600080fd5b50565b615254816148c8565b811461525f57600080fd5b5056fe3c2f746578743e3c7465787420746578742d616e63686f723d226d6964646c652220783d223530252220793d223232302220636c6173733d2262617365223e3c2f746578743e3c7465787420746578742d616e63686f723d226d6964646c652220783d223530252220793d223138302220636c6173733d2262617365223e3c2f746578743e3c7465787420746578742d616e63686f723d226d6964646c652220783d223530252220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420746578742d616e63686f723d226d6964646c652220783d223530252220793d223230302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a20636f7572696572206e65772c206d6f6e6f73706163653b20666f6e742d73697a653a20313470783b20666f6e742d7765696768743a20626f6c647d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22776869746522202f3e3c7465787420746578742d616e63686f723d226d6964646c652220783d223530252220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420746578742d616e63686f723d226d6964646c652220783d223530252220793d223134302220636c6173733d2262617365223ea26469706673582212200813a0581b50867327a473bd7b0e71c3951c5787a84f734ad5d7f849b4de102b64736f6c63430008060033

Deployed Bytecode Sourcemap

46464:8951:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40052:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26417:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28110:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27633:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40855:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29169:376;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40436:343;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54257:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49345:1254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48169:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29616:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41045:320;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48928:405;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26024:326;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25667:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10103:94;;;:::i;:::-;;50611:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48302:618;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9452:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26586:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28490:327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29872:365;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51749:2500;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28888:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10352:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40052:300;40199:4;40256:35;40241:50;;;:11;:50;;;;:103;;;;40308:36;40332:11;40308:23;:36::i;:::-;40241:103;40221:123;;40052:300;;;:::o;26417:100::-;26471:13;26504:5;26497:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26417:100;:::o;28110:308::-;28231:7;28278:16;28286:7;28278;:16::i;:::-;28256:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28386:15;:24;28402:7;28386:24;;;;;;;;;;;;;;;;;;;;;28379:31;;28110:308;;;:::o;27633:411::-;27714:13;27730:23;27745:7;27730:14;:23::i;:::-;27714:39;;27778:5;27772:11;;:2;:11;;;;27764:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27872:5;27856:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27881:37;27898:5;27905:12;:10;:12::i;:::-;27881:16;:37::i;:::-;27856:62;27834:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28015:21;28024:2;28028:7;28015:8;:21::i;:::-;27703:341;27633:411;;:::o;40855:113::-;40916:7;40943:10;:17;;;;40936:24;;40855:113;:::o;29169:376::-;29378:41;29397:12;:10;:12::i;:::-;29411:7;29378:18;:41::i;:::-;29356:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;29509:28;29519:4;29525:2;29529:7;29509:9;:28::i;:::-;29169:376;;;:::o;40436:343::-;40578:7;40633:23;40650:5;40633:16;:23::i;:::-;40625:5;:31;40603:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;40745:12;:19;40758:5;40745:19;;;;;;;;;;;;;;;:26;40765:5;40745:26;;;;;;;;;;;;40738:33;;40436:343;;;;:::o;54257:172::-;12420:1;13016:7;;:19;;13008:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12420:1;13149:7;:18;;;;54338:1:::1;54328:7;:11;:29;;;;;54353:4;54343:7;:14;54328:29;54320:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54389:32;54399:12;:10;:12::i;:::-;54413:7;54389:9;:32::i;:::-;12376:1:::0;13328:7;:22;;;;54257:172;:::o;49345:1254::-;49479:13;49593:27;;;;;;;:::i;:::-;;;;;;;;;;;;;49583:38;;;;;;49555:9;49538:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;49528:38;;;;;;:93;49510:1082;;;49648:34;49719:1;49698:13;:20;;;;:22;;;;:::i;:::-;49685:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49648:73;;49736:10;49770:6;49765:288;49786:13;:20;;;;49782:1;:24;49765:288;;;49912:5;49895:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;49885:34;;;;;;49863:13;49877:1;49863:16;;;;;;;;:::i;:::-;;;;;;;;;49846:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;49836:45;;;;;;:83;49833:205;;49972:13;49986:1;49972:16;;;;;;;;:::i;:::-;;;;;;;;;49944:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;49963:5;49944:25;;;;;;;;:::i;:::-;;;;;;;:44;;;;50011:7;;;;;:::i;:::-;;;;49833:205;49808:3;;;;;:::i;:::-;;;;49765:288;;;;50074:48;50080:7;50074:48;;;;;;;;;;;;;;;;;50103:18;50074:5;:48::i;:::-;50067:55;;;;;;49510:1082;50155:27;50212:1;50198:6;:13;;;;:15;;;;:::i;:::-;50185:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50155:59;;50229:10;50263:6;50258:260;50279:6;:13;;;;50275:1;:17;50258:260;;;50391:5;50374:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;50364:34;;;;;;50349:6;50356:1;50349:9;;;;;;;;:::i;:::-;;;;;;;;;50332:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;50322:38;;;;;;:76;50319:184;;50444:6;50451:1;50444:9;;;;;;;;:::i;:::-;;;;;;;;;50423:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;50435:5;50423:18;;;;;;;;:::i;:::-;;;;;;;:30;;;;50476:7;;;;;:::i;:::-;;;;50319:184;50294:3;;;;;:::i;:::-;;;;50258:260;;;;50539:41;50545:7;50539:41;;;;;;;;;;;;;;;;;50568:11;50539:5;:41::i;:::-;50532:48;;;;49345:1254;;;;;;:::o;48169:125::-;48224:13;48257:29;48263:7;48257:29;;;;;;;;;;;;;;;;;48280:5;48257:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:29::i;:::-;48250:36;;48169:125;;;:::o;29616:185::-;29754:39;29771:4;29777:2;29781:7;29754:39;;;;;;;;;;;;:16;:39::i;:::-;29616:185;;;:::o;54437:::-;12420:1;13016:7;;:19;;13008:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12420:1;13149:7;:18;;;;9683:12:::1;:10;:12::i;:::-;9672:23;;:7;:5;:7::i;:::-;:23;;;9664:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54533:4:::2;54523:7;:14;:32;;;;;54551:4;54541:7;:14;54523:32;54515:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54587:27;54597:7;:5;:7::i;:::-;54606;54587:9;:27::i;:::-;12376:1:::0;13328:7;:22;;;;54437:185;:::o;41045:320::-;41165:7;41220:30;:28;:30::i;:::-;41212:5;:38;41190:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;41340:10;41351:5;41340:17;;;;;;;;:::i;:::-;;;;;;;;;;41333:24;;41045:320;;;:::o;48928:405::-;49009:13;49119:27;;;;;;;:::i;:::-;;;;;;;;;;;;;49109:38;;;;;;49081:9;49064:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;49054:38;;;;;;:93;49036:290;;;49181:38;49187:7;49181:38;;;;;;;;;;;;;;;;;49205:13;49181:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:38::i;:::-;49174:45;;;;49036:290;49271:31;49277:7;49271:31;;;;;;;;;;;;;;;;;49295:6;49271:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:31::i;:::-;49264:38;;48928:405;;;;;:::o;26024:326::-;26141:7;26166:13;26182:7;:16;26190:7;26182:16;;;;;;;;;;;;;;;;;;;;;26166:32;;26248:1;26231:19;;:5;:19;;;;26209:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;26337:5;26330:12;;;26024:326;;;:::o;25667:295::-;25784:7;25848:1;25831:19;;:5;:19;;;;25809:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25938:9;:16;25948:5;25938:16;;;;;;;;;;;;;;;;25931:23;;25667:295;;;:::o;10103:94::-;9683:12;:10;:12::i;:::-;9672:23;;:7;:5;:7::i;:::-;:23;;;9664:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10168:21:::1;10186:1;10168:9;:21::i;:::-;10103:94::o:0;50611:173::-;50692:13;50724:52;50735:7;50744:9;50755:10;50724:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50767:8;50724:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;:52::i;:::-;50717:59;;50611:173;;;;:::o;48302:618::-;48411:13;48525:27;;;;;;;:::i;:::-;;;;;;;;;;;;;48515:38;;;;;;48487:9;48470:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;48460:38;;;;;;:93;48442:471;;;48587:35;48593:7;48587:35;;;;;;;;;;;;;;;;;48612:9;48587:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:35::i;:::-;48580:42;;;;48442:471;48723:25;;;;;;;:::i;:::-;;;;;;;;;;;;;48713:36;;;;;;48685:9;48668:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;48658:38;;;;;;:91;48640:273;;;48783:38;48789:7;48783:38;;;;;;;;;;;;;;;;;48808:12;48783:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:38::i;:::-;48776:45;;;;48640:273;48861:40;48867:7;48861:40;;;;;;;;;;;;;;;;;48886:14;48861:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:40::i;:::-;48854:47;;48302:618;;;;;:::o;9452:87::-;9498:7;9525:6;;;;;;;;;;;9518:13;;9452:87;:::o;26586:104::-;26642:13;26675:7;26668:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26586:104;:::o;28490:327::-;28637:12;:10;:12::i;:::-;28625:24;;:8;:24;;;;28617:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28737:8;28692:18;:32;28711:12;:10;:12::i;:::-;28692:32;;;;;;;;;;;;;;;:42;28725:8;28692:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28790:8;28761:48;;28776:12;:10;:12::i;:::-;28761:48;;;28800:8;28761:48;;;;;;:::i;:::-;;;;;;;;28490:327;;:::o;29872:365::-;30061:41;30080:12;:10;:12::i;:::-;30094:7;30061:18;:41::i;:::-;30039:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;30190:39;30204:4;30210:2;30214:7;30223:5;30190:13;:39::i;:::-;29872:365;;;;:::o;51749:2500::-;51850:13;51881:23;;:::i;:::-;51915:347;;;;;;;;;;;;;;;;;:5;51935:1;51915:32;;;;;;;:::i;:::-;;;;;:347;;;;52286:16;52294:7;52286;:16::i;:::-;52275:5;52281:1;52275:8;;;;;;;:::i;:::-;;;;;:27;;;;52315:76;;;;;;;;;;;;;;;;;:5;52321:1;52315:8;;;;;;;:::i;:::-;;;;;:76;;;;52415:28;52425:7;52434:5;52440:1;52434:8;;;;;;;:::i;:::-;;;;;;52415:9;:28::i;:::-;52404:5;52410:1;52404:8;;;;;;;:::i;:::-;;;;;:39;;;;52456:76;;;;;;;;;;;;;;;;;:5;52462:1;52456:8;;;;;;;:::i;:::-;;;;;:76;;;;52556:27;52565:7;52574:5;52580:1;52574:8;;;;;;;:::i;:::-;;;;;;52556;:27::i;:::-;52545:5;52551:1;52545:8;;;;;;;:::i;:::-;;;;;:38;;;;52596:76;;;;;;;;;;;;;;;;;:5;52602:1;52596:8;;;;;;;:::i;:::-;;;;;:76;;;;52696:42;52710:7;52719:5;52725:1;52719:8;;;;;;;:::i;:::-;;;;;;52729:5;52735:1;52729:8;;;;;;;:::i;:::-;;;;;;52696:13;:42::i;:::-;52685:5;52691:1;52685:8;;;;;;;:::i;:::-;;;;;:53;;;;52751:76;;;;;;;;;;;;;;;;;:5;52757:1;52751:8;;;;;;;:::i;:::-;;;;;:76;;;;52851:25;52860:7;52851:25;;;;;;;;;;;;;;;;;:8;:25::i;:::-;52840:5;52846:1;52840:8;;;;;;;:::i;:::-;;;;;:36;;;;52889:77;;;;;;;;;;;;;;;;;:5;52895:2;52889:9;;;;;;;:::i;:::-;;;;;:77;;;;52991:31;53000:7;52991:31;;;;;;;;;;;;;;;;;:8;:31::i;:::-;52979:5;52985:2;52979:9;;;;;;;:::i;:::-;;;;;:43;;;;53035:27;;;;;;;;;;;;;;;;;:5;53041:2;53035:9;;;;;;;:::i;:::-;;;;;:27;;;;53075:20;53154:5;53160:1;53154:8;;;;;;;:::i;:::-;;;;;;53181:5;53187:1;53181:8;;;;;;;:::i;:::-;;;;;;53208:5;53214:1;53208:8;;;;;;;:::i;:::-;;;;;;53235:5;53241:1;53235:8;;;;;;;:::i;:::-;;;;;;53262:5;53268:1;53262:8;;;;;;;:::i;:::-;;;;;;53289:5;53295:1;53289:8;;;;;;;:::i;:::-;;;;;;53316:5;53322:1;53316:8;;;;;;;:::i;:::-;;;;;;53343:5;53349:1;53343:8;;;;;;;:::i;:::-;;;;;;53370:5;53376:1;53370:8;;;;;;;:::i;:::-;;;;;;53119:274;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53075:329;;53462:6;53470:5;53476:1;53470:8;;;;;;;:::i;:::-;;;;;;53480:5;53486:2;53480:9;;;;;;;:::i;:::-;;;;;;53491:5;53497:2;53491:9;;;;;;;:::i;:::-;;;;;;53502:5;53508:2;53502:9;;;;;;;:::i;:::-;;;;;;53445:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53415:108;;53536:18;53557:551;53727:17;53736:7;53727:8;:17::i;:::-;53981:28;54001:6;53981:13;:28::i;:::-;53638:425;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53557:13;:551::i;:::-;53536:572;;54199:4;54149:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;54119:96;;54235:6;54228:13;;;;;51749:2500;;;:::o;28888:214::-;29030:4;29059:18;:25;29078:5;29059:25;;;;;;;;;;;;;;;:35;29085:8;29059:35;;;;;;;;;;;;;;;;;;;;;;;;;29052:42;;28888:214;;;;:::o;10352:229::-;9683:12;:10;:12::i;:::-;9672:23;;:7;:5;:7::i;:::-;:23;;;9664:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10475:1:::1;10455:22;;:8;:22;;;;10433:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;10554:19;10564:8;10554:9;:19::i;:::-;10352:229:::0;:::o;25248:355::-;25395:4;25452:25;25437:40;;;:11;:40;;;;:105;;;;25509:33;25494:48;;;:11;:48;;;;25437:105;:158;;;;25559:36;25583:11;25559:23;:36::i;:::-;25437:158;25417:178;;25248:355;;;:::o;31784:127::-;31849:4;31901:1;31873:30;;:7;:16;31881:7;31873:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31866:37;;31784:127;;;:::o;8303:98::-;8356:7;8383:10;8376:17;;8303:98;:::o;35907:174::-;36009:2;35982:15;:24;35998:7;35982:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36065:7;36061:2;36027:46;;36036:23;36051:7;36036:14;:23::i;:::-;36027:46;;;;;;;;;;;;35907:174;;:::o;32078:452::-;32207:4;32251:16;32259:7;32251;:16::i;:::-;32229:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;32350:13;32366:23;32381:7;32366:14;:23::i;:::-;32350:39;;32419:5;32408:16;;:7;:16;;;:64;;;;32465:7;32441:31;;:20;32453:7;32441:11;:20::i;:::-;:31;;;32408:64;:113;;;;32489:32;32506:5;32513:7;32489:16;:32::i;:::-;32408:113;32400:122;;;32078:452;;;;:::o;35174:615::-;35347:4;35320:31;;:23;35335:7;35320:14;:23::i;:::-;:31;;;35298:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;35453:1;35439:16;;:2;:16;;;;35431:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35509:39;35530:4;35536:2;35540:7;35509:20;:39::i;:::-;35613:29;35630:1;35634:7;35613:8;:29::i;:::-;35674:1;35655:9;:15;35665:4;35655:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35703:1;35686:9;:13;35696:2;35686:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35734:2;35715:7;:16;35723:7;35715:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35773:7;35769:2;35754:27;;35763:4;35754:27;;;;;;;;;;;;35174:615;;;:::o;32872:110::-;32948:26;32958:2;32962:7;32948:26;;;;;;;;;;;;:9;:26::i;:::-;32872:110;;:::o;50792:376::-;50935:13;50961:12;50976:88;51021:9;51032:17;51041:7;51032:8;:17::i;:::-;51004:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50976:6;:88::i;:::-;50961:103;;51075:20;51098:11;51117;:18;51110:4;:25;;;;:::i;:::-;51098:38;;;;;;;;:::i;:::-;;;;;;;;51075:61;;51154:6;51147:13;;;;50792:376;;;;;:::o;10589:173::-;10645:16;10664:6;;;;;;;;;;;10645:25;;10690:8;10681:6;;:17;;;;;;;;;;;;;;;;;;10745:8;10714:40;;10735:8;10714:40;;;;;;;;;;;;10634:128;10589:173;:::o;51180:561::-;51372:13;51398:12;51413:88;51458:9;51469:17;51478:7;51469:8;:17::i;:::-;51441:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51413:6;:88::i;:::-;51398:103;;51512:17;51539:2;51532:4;:9;;;;:::i;:::-;51512:29;;51568:2;51556:9;:14;51552:182;;;51594:13;51615;:20;51608:4;:27;;;;:::i;:::-;51594:42;;;;;;;;:::i;:::-;;;;;;;;51587:49;;;;;;51552:182;51676:15;51699;:22;51692:4;:29;;;;:::i;:::-;51676:46;;;;;;;;:::i;:::-;;;;;;;;51669:53;;;;51180:561;;;;;;;:::o;31119:352::-;31276:28;31286:4;31292:2;31296:7;31276:9;:28::i;:::-;31337:48;31360:4;31366:2;31370:7;31379:5;31337:22;:48::i;:::-;31315:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;31119:352;;;;:::o;54630:723::-;54686:13;54916:1;54907:5;:10;54903:53;;;54934:10;;;;;;;;;;;;;;;;;;;;;54903:53;54966:12;54981:5;54966:20;;54997:14;55022:78;55037:1;55029:4;:9;55022:78;;55055:8;;;;;:::i;:::-;;;;55086:2;55078:10;;;;;:::i;:::-;;;55022:78;;;55110:19;55142:6;55132:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55110:39;;55160:154;55176:1;55167:5;:10;55160:154;;55204:1;55194:11;;;;;:::i;:::-;;;55271:2;55263:5;:10;;;;:::i;:::-;55250:2;:24;;;;:::i;:::-;55237:39;;55220:6;55227;55220:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;55300:2;55291:11;;;;;:::i;:::-;;;55160:154;;;55338:6;55324:21;;;;;54630:723;;;;:::o;55775:1790::-;55833:13;55859:11;55873:4;:11;55859:25;;55906:1;55899:3;:8;55895:23;;;55909:9;;;;;;;;;;;;;;;;;55895:23;55970:18;56008:1;56003;55997:3;:7;;;;:::i;:::-;55996:13;;;;:::i;:::-;55991:1;:19;;;;:::i;:::-;55970:40;;56068:19;56113:2;56100:10;:15;;;;:::i;:::-;56090:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56068:48;;56129:18;56150:5;;;;;;;;;;;;;;;;;56129:26;;56219:1;56212:5;56208:13;56264:2;56256:6;56252:15;56315:1;56283:960;56338:3;56335:1;56332:10;56283:960;;;56393:1;56390;56386:9;56381:14;;56451:8;56446:1;56440:4;56436:12;56430:19;56426:34;56531:4;56523:5;56519:2;56515:14;56511:25;56501:8;56497:40;56491:47;56570:3;56567:1;56563:11;56556:18;;56704:4;56695;56687:5;56683:2;56679:14;56675:25;56665:8;56661:40;56655:47;56651:58;56625:3;56599:129;56592:136;;56760:3;56757:1;56753:11;56746:18;;56893:4;56884;56876:5;56873:1;56869:13;56865:24;56855:8;56851:39;56845:46;56841:57;56815:3;56789:128;56782:135;;56949:3;56946:1;56942:11;56935:18;;57074:4;57065;57058:5;57054:16;57044:8;57040:31;57034:38;57030:49;57004:3;56978:120;56971:127;;57132:3;57127;57123:13;57116:20;;57174:3;57163:9;57156:22;57226:1;57215:9;57211:17;57198:30;;56362:881;;56283:960;;;56287:44;57275:1;57270:3;57266:11;57296:1;57291:84;;;;57394:1;57389:82;;;;57259:212;;57291:84;57352:6;57347:3;57343:16;57339:1;57328:9;57324:17;57317:43;57291:84;;57389:82;57450:4;57445:3;57441:14;57437:1;57426:9;57422:17;57415:41;57259:212;;57502:10;57494:6;57487:26;56177:1347;;57550:6;57536:21;;;;;;55775:1790;;;;:::o;23807:207::-;23937:4;23981:25;23966:40;;;:11;:40;;;;23959:47;;23807:207;;;:::o;41978:589::-;42122:45;42149:4;42155:2;42159:7;42122:26;:45::i;:::-;42200:1;42184:18;;:4;:18;;;42180:187;;;42219:40;42251:7;42219:31;:40::i;:::-;42180:187;;;42289:2;42281:10;;:4;:10;;;42277:90;;42308:47;42341:4;42347:7;42308:32;:47::i;:::-;42277:90;42180:187;42395:1;42381:16;;:2;:16;;;42377:183;;;42414:45;42451:7;42414:36;:45::i;:::-;42377:183;;;42487:4;42481:10;;:2;:10;;;42477:83;;42508:40;42536:2;42540:7;42508:27;:40::i;:::-;42477:83;42377:183;41978:589;;;:::o;33209:321::-;33339:18;33345:2;33349:7;33339:5;:18::i;:::-;33390:54;33421:1;33425:2;33429:7;33438:5;33390:22;:54::i;:::-;33368:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33209:321;;;:::o;48023:138::-;48083:7;48145:5;48128:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;48118:34;;;;;;48110:43;;48103:50;;48023:138;;;:::o;36646:984::-;36801:4;36822:15;:2;:13;;;:15::i;:::-;36818:805;;;36891:2;36875:36;;;36934:12;:10;:12::i;:::-;36969:4;36996:7;37026:5;36875:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36854:714;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37254:1;37237:6;:13;:18;37233:320;;;37280:108;;;;;;;;;;:::i;:::-;;;;;;;;37233:320;37503:6;37497:13;37488:6;37484:2;37480:15;37473:38;36854:714;37124:45;;;37114:55;;;:6;:55;;;;37107:62;;;;;36818:805;37607:4;37600:11;;36646:984;;;;;;;:::o;38202:126::-;;;;:::o;43290:164::-;43394:10;:17;;;;43367:15;:24;43383:7;43367:24;;;;;;;;;;;:44;;;;43422:10;43438:7;43422:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43290:164;:::o;44081:1002::-;44361:22;44411:1;44386:22;44403:4;44386:16;:22::i;:::-;:26;;;;:::i;:::-;44361:51;;44423:18;44444:17;:26;44462:7;44444:26;;;;;;;;;;;;44423:47;;44591:14;44577:10;:28;44573:328;;44622:19;44644:12;:18;44657:4;44644:18;;;;;;;;;;;;;;;:34;44663:14;44644:34;;;;;;;;;;;;44622:56;;44728:11;44695:12;:18;44708:4;44695:18;;;;;;;;;;;;;;;:30;44714:10;44695:30;;;;;;;;;;;:44;;;;44845:10;44812:17;:30;44830:11;44812:30;;;;;;;;;;;:43;;;;44607:294;44573:328;44997:17;:26;45015:7;44997:26;;;;;;;;;;;44990:33;;;45041:12;:18;45054:4;45041:18;;;;;;;;;;;;;;;:34;45060:14;45041:34;;;;;;;;;;;45034:41;;;44176:907;;44081:1002;;:::o;45378:1079::-;45631:22;45676:1;45656:10;:17;;;;:21;;;;:::i;:::-;45631:46;;45688:18;45709:15;:24;45725:7;45709:24;;;;;;;;;;;;45688:45;;46060:19;46082:10;46093:14;46082:26;;;;;;;;:::i;:::-;;;;;;;;;;46060:48;;46146:11;46121:10;46132;46121:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;46257:10;46226:15;:28;46242:11;46226:28;;;;;;;;;;;:41;;;;46398:15;:24;46414:7;46398:24;;;;;;;;;;;46391:31;;;46433:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45449:1008;;;45378:1079;:::o;42868:221::-;42953:14;42970:20;42987:2;42970:16;:20::i;:::-;42953:37;;43028:7;43001:12;:16;43014:2;43001:16;;;;;;;;;;;;;;;:24;43018:6;43001:24;;;;;;;;;;;:34;;;;43075:6;43046:17;:26;43064:7;43046:26;;;;;;;;;;;:35;;;;42942:147;42868:221;;:::o;33866:382::-;33960:1;33946:16;;:2;:16;;;;33938:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34019:16;34027:7;34019;:16::i;:::-;34018:17;34010:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34081:45;34110:1;34114:2;34118:7;34081:20;:45::i;:::-;34156:1;34139:9;:13;34149:2;34139:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34187:2;34168:7;:16;34176:7;34168:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34232:7;34228:2;34207:33;;34224:1;34207:33;;;;;;;;;;;;33866:382;;:::o;15528:387::-;15588:4;15796:12;15863:7;15851:20;15843:28;;15906:1;15899:4;:8;15892:15;;;15528:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:2;;;280:79;;:::i;:::-;249:2;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:2;;;698:79;;:::i;:::-;667:2;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;893:87;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;1035:84;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1176:86;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1330:79;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:2;;1540:79;;:::i;:::-;1499:2;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:2;;1899:79;;:::i;:::-;1858:2;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2184:87;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:2;;;2391:79;;:::i;:::-;2353:2;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2343:263;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:2;;;2743:79;;:::i;:::-;2705:2;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2695:391;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:2;;;3240:79;;:::i;:::-;3202:2;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3192:519;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:2;;;3892:79;;:::i;:::-;3853:2;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:2;;;4476:79;;:::i;:::-;4440:2;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3843:817;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:2;;;4794:79;;:::i;:::-;4756:2;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4746:388;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5271:79;;:::i;:::-;5233:2;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5223:391;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:2;;;5733:79;;:::i;:::-;5695:2;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5685:262;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:2;;;6077:79;;:::i;:::-;6039:2;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;6029:273;;;;:::o;6308:329::-;6367:6;6416:2;6404:9;6395:7;6391:23;6387:32;6384:2;;;6422:79;;:::i;:::-;6384:2;6542:1;6567:53;6612:7;6603:6;6592:9;6588:22;6567:53;:::i;:::-;6557:63;;6513:117;6374:263;;;;:::o;6643:654::-;6721:6;6729;6778:2;6766:9;6757:7;6753:23;6749:32;6746:2;;;6784:79;;:::i;:::-;6746:2;6904:1;6929:53;6974:7;6965:6;6954:9;6950:22;6929:53;:::i;:::-;6919:63;;6875:117;7059:2;7048:9;7044:18;7031:32;7090:18;7082:6;7079:30;7076:2;;;7112:79;;:::i;:::-;7076:2;7217:63;7272:7;7263:6;7252:9;7248:22;7217:63;:::i;:::-;7207:73;;7002:288;6736:561;;;;;:::o;7303:979::-;7400:6;7408;7416;7465:2;7453:9;7444:7;7440:23;7436:32;7433:2;;;7471:79;;:::i;:::-;7433:2;7591:1;7616:53;7661:7;7652:6;7641:9;7637:22;7616:53;:::i;:::-;7606:63;;7562:117;7746:2;7735:9;7731:18;7718:32;7777:18;7769:6;7766:30;7763:2;;;7799:79;;:::i;:::-;7763:2;7904:63;7959:7;7950:6;7939:9;7935:22;7904:63;:::i;:::-;7894:73;;7689:288;8044:2;8033:9;8029:18;8016:32;8075:18;8067:6;8064:30;8061:2;;;8097:79;;:::i;:::-;8061:2;8202:63;8257:7;8248:6;8237:9;8233:22;8202:63;:::i;:::-;8192:73;;7987:288;7423:859;;;;;:::o;8288:118::-;8375:24;8393:5;8375:24;:::i;:::-;8370:3;8363:37;8353:53;;:::o;8412:109::-;8493:21;8508:5;8493:21;:::i;:::-;8488:3;8481:34;8471:50;;:::o;8527:360::-;8613:3;8641:38;8673:5;8641:38;:::i;:::-;8695:70;8758:6;8753:3;8695:70;:::i;:::-;8688:77;;8774:52;8819:6;8814:3;8807:4;8800:5;8796:16;8774:52;:::i;:::-;8851:29;8873:6;8851:29;:::i;:::-;8846:3;8842:39;8835:46;;8617:270;;;;;:::o;8893:364::-;8981:3;9009:39;9042:5;9009:39;:::i;:::-;9064:71;9128:6;9123:3;9064:71;:::i;:::-;9057:78;;9144:52;9189:6;9184:3;9177:4;9170:5;9166:16;9144:52;:::i;:::-;9221:29;9243:6;9221:29;:::i;:::-;9216:3;9212:39;9205:46;;8985:272;;;;;:::o;9263:377::-;9369:3;9397:39;9430:5;9397:39;:::i;:::-;9452:89;9534:6;9529:3;9452:89;:::i;:::-;9445:96;;9550:52;9595:6;9590:3;9583:4;9576:5;9572:16;9550:52;:::i;:::-;9627:6;9622:3;9618:16;9611:23;;9373:267;;;;;:::o;9670:845::-;9773:3;9810:5;9804:12;9839:36;9865:9;9839:36;:::i;:::-;9891:89;9973:6;9968:3;9891:89;:::i;:::-;9884:96;;10011:1;10000:9;9996:17;10027:1;10022:137;;;;10173:1;10168:341;;;;9989:520;;10022:137;10106:4;10102:9;10091;10087:25;10082:3;10075:38;10142:6;10137:3;10133:16;10126:23;;10022:137;;10168:341;10235:38;10267:5;10235:38;:::i;:::-;10295:1;10309:154;10323:6;10320:1;10317:13;10309:154;;;10397:7;10391:14;10387:1;10382:3;10378:11;10371:35;10447:1;10438:7;10434:15;10423:26;;10345:4;10342:1;10338:12;10333:17;;10309:154;;;10492:6;10487:3;10483:16;10476:23;;10175:334;;9989:520;;9777:738;;;;;;:::o;10521:404::-;10681:3;10702:86;10784:3;10779;10702:86;:::i;:::-;10695:93;;10797;10886:3;10797:93;:::i;:::-;10915:3;10910;10906:13;10899:20;;10685:240;;;:::o;10931:366::-;11073:3;11094:67;11158:2;11153:3;11094:67;:::i;:::-;11087:74;;11170:93;11259:3;11170:93;:::i;:::-;11288:2;11283:3;11279:12;11272:19;;11077:220;;;:::o;11303:366::-;11445:3;11466:67;11530:2;11525:3;11466:67;:::i;:::-;11459:74;;11542:93;11631:3;11542:93;:::i;:::-;11660:2;11655:3;11651:12;11644:19;;11449:220;;;:::o;11675:366::-;11817:3;11838:67;11902:2;11897:3;11838:67;:::i;:::-;11831:74;;11914:93;12003:3;11914:93;:::i;:::-;12032:2;12027:3;12023:12;12016:19;;11821:220;;;:::o;12047:400::-;12207:3;12228:84;12310:1;12305:3;12228:84;:::i;:::-;12221:91;;12321:93;12410:3;12321:93;:::i;:::-;12439:1;12434:3;12430:11;12423:18;;12211:236;;;:::o;12453:366::-;12595:3;12616:67;12680:2;12675:3;12616:67;:::i;:::-;12609:74;;12692:93;12781:3;12692:93;:::i;:::-;12810:2;12805:3;12801:12;12794:19;;12599:220;;;:::o;12825:400::-;12985:3;13006:84;13088:1;13083:3;13006:84;:::i;:::-;12999:91;;13099:93;13188:3;13099:93;:::i;:::-;13217:1;13212:3;13208:11;13201:18;;12989:236;;;:::o;13231:366::-;13373:3;13394:67;13458:2;13453:3;13394:67;:::i;:::-;13387:74;;13470:93;13559:3;13470:93;:::i;:::-;13588:2;13583:3;13579:12;13572:19;;13377:220;;;:::o;13603:366::-;13745:3;13766:67;13830:2;13825:3;13766:67;:::i;:::-;13759:74;;13842:93;13931:3;13842:93;:::i;:::-;13960:2;13955:3;13951:12;13944:19;;13749:220;;;:::o;13975:366::-;14117:3;14138:67;14202:2;14197:3;14138:67;:::i;:::-;14131:74;;14214:93;14303:3;14214:93;:::i;:::-;14332:2;14327:3;14323:12;14316:19;;14121:220;;;:::o;14347:366::-;14489:3;14510:67;14574:2;14569:3;14510:67;:::i;:::-;14503:74;;14586:93;14675:3;14586:93;:::i;:::-;14704:2;14699:3;14695:12;14688:19;;14493:220;;;:::o;14719:366::-;14861:3;14882:67;14946:2;14941:3;14882:67;:::i;:::-;14875:74;;14958:93;15047:3;14958:93;:::i;:::-;15076:2;15071:3;15067:12;15060:19;;14865:220;;;:::o;15091:366::-;15233:3;15254:67;15318:2;15313:3;15254:67;:::i;:::-;15247:74;;15330:93;15419:3;15330:93;:::i;:::-;15448:2;15443:3;15439:12;15432:19;;15237:220;;;:::o;15463:400::-;15623:3;15644:84;15726:1;15721:3;15644:84;:::i;:::-;15637:91;;15737:93;15826:3;15737:93;:::i;:::-;15855:1;15850:3;15846:11;15839:18;;15627:236;;;:::o;15869:366::-;16011:3;16032:67;16096:2;16091:3;16032:67;:::i;:::-;16025:74;;16108:93;16197:3;16108:93;:::i;:::-;16226:2;16221:3;16217:12;16210:19;;16015:220;;;:::o;16241:366::-;16383:3;16404:67;16468:2;16463:3;16404:67;:::i;:::-;16397:74;;16480:93;16569:3;16480:93;:::i;:::-;16598:2;16593:3;16589:12;16582:19;;16387:220;;;:::o;16613:366::-;16755:3;16776:67;16840:2;16835:3;16776:67;:::i;:::-;16769:74;;16852:93;16941:3;16852:93;:::i;:::-;16970:2;16965:3;16961:12;16954:19;;16759:220;;;:::o;16985:402::-;17145:3;17166:85;17248:2;17243:3;17166:85;:::i;:::-;17159:92;;17260:93;17349:3;17260:93;:::i;:::-;17378:2;17373:3;17369:12;17362:19;;17149:238;;;:::o;17393:366::-;17535:3;17556:67;17620:2;17615:3;17556:67;:::i;:::-;17549:74;;17632:93;17721:3;17632:93;:::i;:::-;17750:2;17745:3;17741:12;17734:19;;17539:220;;;:::o;17765:366::-;17907:3;17928:67;17992:2;17987:3;17928:67;:::i;:::-;17921:74;;18004:93;18093:3;18004:93;:::i;:::-;18122:2;18117:3;18113:12;18106:19;;17911:220;;;:::o;18137:400::-;18297:3;18318:84;18400:1;18395:3;18318:84;:::i;:::-;18311:91;;18411:93;18500:3;18411:93;:::i;:::-;18529:1;18524:3;18520:11;18513:18;;18301:236;;;:::o;18543:366::-;18685:3;18706:67;18770:2;18765:3;18706:67;:::i;:::-;18699:74;;18782:93;18871:3;18782:93;:::i;:::-;18900:2;18895:3;18891:12;18884:19;;18689:220;;;:::o;18915:402::-;19075:3;19096:85;19178:2;19173:3;19096:85;:::i;:::-;19089:92;;19190:93;19279:3;19190:93;:::i;:::-;19308:2;19303:3;19299:12;19292:19;;19079:238;;;:::o;19323:366::-;19465:3;19486:67;19550:2;19545:3;19486:67;:::i;:::-;19479:74;;19562:93;19651:3;19562:93;:::i;:::-;19680:2;19675:3;19671:12;19664:19;;19469:220;;;:::o;19695:366::-;19837:3;19858:67;19922:2;19917:3;19858:67;:::i;:::-;19851:74;;19934:93;20023:3;19934:93;:::i;:::-;20052:2;20047:3;20043:12;20036:19;;19841:220;;;:::o;20067:366::-;20209:3;20230:67;20294:2;20289:3;20230:67;:::i;:::-;20223:74;;20306:93;20395:3;20306:93;:::i;:::-;20424:2;20419:3;20415:12;20408:19;;20213:220;;;:::o;20439:118::-;20526:24;20544:5;20526:24;:::i;:::-;20521:3;20514:37;20504:53;;:::o;20563:275::-;20695:3;20717:95;20808:3;20799:6;20717:95;:::i;:::-;20710:102;;20829:3;20822:10;;20699:139;;;;:::o;20844:435::-;21024:3;21046:95;21137:3;21128:6;21046:95;:::i;:::-;21039:102;;21158:95;21249:3;21240:6;21158:95;:::i;:::-;21151:102;;21270:3;21263:10;;21028:251;;;;;:::o;21285:915::-;21609:3;21631:95;21722:3;21713:6;21631:95;:::i;:::-;21624:102;;21743:95;21834:3;21825:6;21743:95;:::i;:::-;21736:102;;21855:95;21946:3;21937:6;21855:95;:::i;:::-;21848:102;;21967:95;22058:3;22049:6;21967:95;:::i;:::-;21960:102;;22079:95;22170:3;22161:6;22079:95;:::i;:::-;22072:102;;22191:3;22184:10;;21613:587;;;;;;;;:::o;22206:1555::-;22722:3;22744:95;22835:3;22826:6;22744:95;:::i;:::-;22737:102;;22856:95;22947:3;22938:6;22856:95;:::i;:::-;22849:102;;22968:95;23059:3;23050:6;22968:95;:::i;:::-;22961:102;;23080:95;23171:3;23162:6;23080:95;:::i;:::-;23073:102;;23192:95;23283:3;23274:6;23192:95;:::i;:::-;23185:102;;23304:95;23395:3;23386:6;23304:95;:::i;:::-;23297:102;;23416:95;23507:3;23498:6;23416:95;:::i;:::-;23409:102;;23528:95;23619:3;23610:6;23528:95;:::i;:::-;23521:102;;23640:95;23731:3;23722:6;23640:95;:::i;:::-;23633:102;;23752:3;23745:10;;22726:1035;;;;;;;;;;;;:::o;23767:269::-;23896:3;23918:92;24006:3;23997:6;23918:92;:::i;:::-;23911:99;;24027:3;24020:10;;23900:136;;;;:::o;24042:381::-;24227:3;24249:148;24393:3;24249:148;:::i;:::-;24242:155;;24414:3;24407:10;;24231:192;;;:::o;24429:381::-;24614:3;24636:148;24780:3;24636:148;:::i;:::-;24629:155;;24801:3;24794:10;;24618:192;;;:::o;24816:1233::-;25299:3;25321:148;25465:3;25321:148;:::i;:::-;25314:155;;25486:95;25577:3;25568:6;25486:95;:::i;:::-;25479:102;;25598:148;25742:3;25598:148;:::i;:::-;25591:155;;25763:95;25854:3;25845:6;25763:95;:::i;:::-;25756:102;;25875:148;26019:3;25875:148;:::i;:::-;25868:155;;26040:3;26033:10;;25303:746;;;;;:::o;26055:381::-;26240:3;26262:148;26406:3;26262:148;:::i;:::-;26255:155;;26427:3;26420:10;;26244:192;;;:::o;26442:541::-;26675:3;26697:148;26841:3;26697:148;:::i;:::-;26690:155;;26862:95;26953:3;26944:6;26862:95;:::i;:::-;26855:102;;26974:3;26967:10;;26679:304;;;;:::o;26989:222::-;27082:4;27120:2;27109:9;27105:18;27097:26;;27133:71;27201:1;27190:9;27186:17;27177:6;27133:71;:::i;:::-;27087:124;;;;:::o;27217:640::-;27412:4;27450:3;27439:9;27435:19;27427:27;;27464:71;27532:1;27521:9;27517:17;27508:6;27464:71;:::i;:::-;27545:72;27613:2;27602:9;27598:18;27589:6;27545:72;:::i;:::-;27627;27695:2;27684:9;27680:18;27671:6;27627:72;:::i;:::-;27746:9;27740:4;27736:20;27731:2;27720:9;27716:18;27709:48;27774:76;27845:4;27836:6;27774:76;:::i;:::-;27766:84;;27417:440;;;;;;;:::o;27863:210::-;27950:4;27988:2;27977:9;27973:18;27965:26;;28001:65;28063:1;28052:9;28048:17;28039:6;28001:65;:::i;:::-;27955:118;;;;:::o;28079:313::-;28192:4;28230:2;28219:9;28215:18;28207:26;;28279:9;28273:4;28269:20;28265:1;28254:9;28250:17;28243:47;28307:78;28380:4;28371:6;28307:78;:::i;:::-;28299:86;;28197:195;;;;:::o;28398:419::-;28564:4;28602:2;28591:9;28587:18;28579:26;;28651:9;28645:4;28641:20;28637:1;28626:9;28622:17;28615:47;28679:131;28805:4;28679:131;:::i;:::-;28671:139;;28569:248;;;:::o;28823:419::-;28989:4;29027:2;29016:9;29012:18;29004:26;;29076:9;29070:4;29066:20;29062:1;29051:9;29047:17;29040:47;29104:131;29230:4;29104:131;:::i;:::-;29096:139;;28994:248;;;:::o;29248:419::-;29414:4;29452:2;29441:9;29437:18;29429:26;;29501:9;29495:4;29491:20;29487:1;29476:9;29472:17;29465:47;29529:131;29655:4;29529:131;:::i;:::-;29521:139;;29419:248;;;:::o;29673:419::-;29839:4;29877:2;29866:9;29862:18;29854:26;;29926:9;29920:4;29916:20;29912:1;29901:9;29897:17;29890:47;29954:131;30080:4;29954:131;:::i;:::-;29946:139;;29844:248;;;:::o;30098:419::-;30264:4;30302:2;30291:9;30287:18;30279:26;;30351:9;30345:4;30341:20;30337:1;30326:9;30322:17;30315:47;30379:131;30505:4;30379:131;:::i;:::-;30371:139;;30269:248;;;:::o;30523:419::-;30689:4;30727:2;30716:9;30712:18;30704:26;;30776:9;30770:4;30766:20;30762:1;30751:9;30747:17;30740:47;30804:131;30930:4;30804:131;:::i;:::-;30796:139;;30694:248;;;:::o;30948:419::-;31114:4;31152:2;31141:9;31137:18;31129:26;;31201:9;31195:4;31191:20;31187:1;31176:9;31172:17;31165:47;31229:131;31355:4;31229:131;:::i;:::-;31221:139;;31119:248;;;:::o;31373:419::-;31539:4;31577:2;31566:9;31562:18;31554:26;;31626:9;31620:4;31616:20;31612:1;31601:9;31597:17;31590:47;31654:131;31780:4;31654:131;:::i;:::-;31646:139;;31544:248;;;:::o;31798:419::-;31964:4;32002:2;31991:9;31987:18;31979:26;;32051:9;32045:4;32041:20;32037:1;32026:9;32022:17;32015:47;32079:131;32205:4;32079:131;:::i;:::-;32071:139;;31969:248;;;:::o;32223:419::-;32389:4;32427:2;32416:9;32412:18;32404:26;;32476:9;32470:4;32466:20;32462:1;32451:9;32447:17;32440:47;32504:131;32630:4;32504:131;:::i;:::-;32496:139;;32394:248;;;:::o;32648:419::-;32814:4;32852:2;32841:9;32837:18;32829:26;;32901:9;32895:4;32891:20;32887:1;32876:9;32872:17;32865:47;32929:131;33055:4;32929:131;:::i;:::-;32921:139;;32819:248;;;:::o;33073:419::-;33239:4;33277:2;33266:9;33262:18;33254:26;;33326:9;33320:4;33316:20;33312:1;33301:9;33297:17;33290:47;33354:131;33480:4;33354:131;:::i;:::-;33346:139;;33244:248;;;:::o;33498:419::-;33664:4;33702:2;33691:9;33687:18;33679:26;;33751:9;33745:4;33741:20;33737:1;33726:9;33722:17;33715:47;33779:131;33905:4;33779:131;:::i;:::-;33771:139;;33669:248;;;:::o;33923:419::-;34089:4;34127:2;34116:9;34112:18;34104:26;;34176:9;34170:4;34166:20;34162:1;34151:9;34147:17;34140:47;34204:131;34330:4;34204:131;:::i;:::-;34196:139;;34094:248;;;:::o;34348:419::-;34514:4;34552:2;34541:9;34537:18;34529:26;;34601:9;34595:4;34591:20;34587:1;34576:9;34572:17;34565:47;34629:131;34755:4;34629:131;:::i;:::-;34621:139;;34519:248;;;:::o;34773:419::-;34939:4;34977:2;34966:9;34962:18;34954:26;;35026:9;35020:4;35016:20;35012:1;35001:9;34997:17;34990:47;35054:131;35180:4;35054:131;:::i;:::-;35046:139;;34944:248;;;:::o;35198:419::-;35364:4;35402:2;35391:9;35387:18;35379:26;;35451:9;35445:4;35441:20;35437:1;35426:9;35422:17;35415:47;35479:131;35605:4;35479:131;:::i;:::-;35471:139;;35369:248;;;:::o;35623:419::-;35789:4;35827:2;35816:9;35812:18;35804:26;;35876:9;35870:4;35866:20;35862:1;35851:9;35847:17;35840:47;35904:131;36030:4;35904:131;:::i;:::-;35896:139;;35794:248;;;:::o;36048:419::-;36214:4;36252:2;36241:9;36237:18;36229:26;;36301:9;36295:4;36291:20;36287:1;36276:9;36272:17;36265:47;36329:131;36455:4;36329:131;:::i;:::-;36321:139;;36219:248;;;:::o;36473:222::-;36566:4;36604:2;36593:9;36589:18;36581:26;;36617:71;36685:1;36674:9;36670:17;36661:6;36617:71;:::i;:::-;36571:124;;;;:::o;36701:129::-;36735:6;36762:20;;:::i;:::-;36752:30;;36791:33;36819:4;36811:6;36791:33;:::i;:::-;36742:88;;;:::o;36836:75::-;36869:6;36902:2;36896:9;36886:19;;36876:35;:::o;36917:307::-;36978:4;37068:18;37060:6;37057:30;37054:2;;;37090:18;;:::i;:::-;37054:2;37128:29;37150:6;37128:29;:::i;:::-;37120:37;;37212:4;37206;37202:15;37194:23;;36983:241;;;:::o;37230:308::-;37292:4;37382:18;37374:6;37371:30;37368:2;;;37404:18;;:::i;:::-;37368:2;37442:29;37464:6;37442:29;:::i;:::-;37434:37;;37526:4;37520;37516:15;37508:23;;37297:241;;;:::o;37544:141::-;37593:4;37616:3;37608:11;;37639:3;37636:1;37629:14;37673:4;37670:1;37660:18;37652:26;;37598:87;;;:::o;37691:98::-;37742:6;37776:5;37770:12;37760:22;;37749:40;;;:::o;37795:99::-;37847:6;37881:5;37875:12;37865:22;;37854:40;;;:::o;37900:168::-;37983:11;38017:6;38012:3;38005:19;38057:4;38052:3;38048:14;38033:29;;37995:73;;;;:::o;38074:169::-;38158:11;38192:6;38187:3;38180:19;38232:4;38227:3;38223:14;38208:29;;38170:73;;;;:::o;38249:148::-;38351:11;38388:3;38373:18;;38363:34;;;;:::o;38403:305::-;38443:3;38462:20;38480:1;38462:20;:::i;:::-;38457:25;;38496:20;38514:1;38496:20;:::i;:::-;38491:25;;38650:1;38582:66;38578:74;38575:1;38572:81;38569:2;;;38656:18;;:::i;:::-;38569:2;38700:1;38697;38693:9;38686:16;;38447:261;;;;:::o;38714:185::-;38754:1;38771:20;38789:1;38771:20;:::i;:::-;38766:25;;38805:20;38823:1;38805:20;:::i;:::-;38800:25;;38844:1;38834:2;;38849:18;;:::i;:::-;38834:2;38891:1;38888;38884:9;38879:14;;38756:143;;;;:::o;38905:348::-;38945:7;38968:20;38986:1;38968:20;:::i;:::-;38963:25;;39002:20;39020:1;39002:20;:::i;:::-;38997:25;;39190:1;39122:66;39118:74;39115:1;39112:81;39107:1;39100:9;39093:17;39089:105;39086:2;;;39197:18;;:::i;:::-;39086:2;39245:1;39242;39238:9;39227:20;;38953:300;;;;:::o;39259:191::-;39299:4;39319:20;39337:1;39319:20;:::i;:::-;39314:25;;39353:20;39371:1;39353:20;:::i;:::-;39348:25;;39392:1;39389;39386:8;39383:2;;;39397:18;;:::i;:::-;39383:2;39442:1;39439;39435:9;39427:17;;39304:146;;;;:::o;39456:96::-;39493:7;39522:24;39540:5;39522:24;:::i;:::-;39511:35;;39501:51;;;:::o;39558:90::-;39592:7;39635:5;39628:13;39621:21;39610:32;;39600:48;;;:::o;39654:149::-;39690:7;39730:66;39723:5;39719:78;39708:89;;39698:105;;;:::o;39809:126::-;39846:7;39886:42;39879:5;39875:54;39864:65;;39854:81;;;:::o;39941:77::-;39978:7;40007:5;39996:16;;39986:32;;;:::o;40024:154::-;40108:6;40103:3;40098;40085:30;40170:1;40161:6;40156:3;40152:16;40145:27;40075:103;;;:::o;40184:307::-;40252:1;40262:113;40276:6;40273:1;40270:13;40262:113;;;40361:1;40356:3;40352:11;40346:18;40342:1;40337:3;40333:11;40326:39;40298:2;40295:1;40291:10;40286:15;;40262:113;;;40393:6;40390:1;40387:13;40384:2;;;40473:1;40464:6;40459:3;40455:16;40448:27;40384:2;40233:258;;;;:::o;40497:320::-;40541:6;40578:1;40572:4;40568:12;40558:22;;40625:1;40619:4;40615:12;40646:18;40636:2;;40702:4;40694:6;40690:17;40680:27;;40636:2;40764;40756:6;40753:14;40733:18;40730:38;40727:2;;;40783:18;;:::i;:::-;40727:2;40548:269;;;;:::o;40823:281::-;40906:27;40928:4;40906:27;:::i;:::-;40898:6;40894:40;41036:6;41024:10;41021:22;41000:18;40988:10;40985:34;40982:62;40979:2;;;41047:18;;:::i;:::-;40979:2;41087:10;41083:2;41076:22;40866:238;;;:::o;41110:233::-;41149:3;41172:24;41190:5;41172:24;:::i;:::-;41163:33;;41218:66;41211:5;41208:77;41205:2;;;41288:18;;:::i;:::-;41205:2;41335:1;41328:5;41324:13;41317:20;;41153:190;;;:::o;41349:176::-;41381:1;41398:20;41416:1;41398:20;:::i;:::-;41393:25;;41432:20;41450:1;41432:20;:::i;:::-;41427:25;;41471:1;41461:2;;41476:18;;:::i;:::-;41461:2;41517:1;41514;41510:9;41505:14;;41383:142;;;;:::o;41531:180::-;41579:77;41576:1;41569:88;41676:4;41673:1;41666:15;41700:4;41697:1;41690:15;41717:180;41765:77;41762:1;41755:88;41862:4;41859:1;41852:15;41886:4;41883:1;41876:15;41903:180;41951:77;41948:1;41941:88;42048:4;42045:1;42038:15;42072:4;42069:1;42062:15;42089:180;42137:77;42134:1;42127:88;42234:4;42231:1;42224:15;42258:4;42255:1;42248:15;42275:180;42323:77;42320:1;42313:88;42420:4;42417:1;42410:15;42444:4;42441:1;42434:15;42461:180;42509:77;42506:1;42499:88;42606:4;42603:1;42596:15;42630:4;42627:1;42620:15;42647:117;42756:1;42753;42746:12;42770:117;42879:1;42876;42869:12;42893:117;43002:1;42999;42992:12;43016:117;43125:1;43122;43115:12;43139:102;43180:6;43231:2;43227:7;43222:2;43215:5;43211:14;43207:28;43197:38;;43187:54;;;:::o;43247:582::-;43387:66;43383:1;43375:6;43371:14;43364:90;43488:34;43483:2;43475:6;43471:15;43464:59;43557:34;43552:2;43544:6;43540:15;43533:59;43626:34;43621:2;43613:6;43609:15;43602:59;43696:66;43690:3;43682:6;43678:16;43671:92;43798:23;43792:3;43784:6;43780:16;43773:49;43353:476;:::o;43835:230::-;43975:34;43971:1;43963:6;43959:14;43952:58;44044:13;44039:2;44031:6;44027:15;44020:38;43941:124;:::o;44071:237::-;44211:34;44207:1;44199:6;44195:14;44188:58;44280:20;44275:2;44267:6;44263:15;44256:45;44177:131;:::o;44314:225::-;44454:34;44450:1;44442:6;44438:14;44431:58;44523:8;44518:2;44510:6;44506:15;44499:33;44420:119;:::o;44545:157::-;44685:9;44681:1;44673:6;44669:14;44662:33;44651:51;:::o;44708:178::-;44848:30;44844:1;44836:6;44832:14;44825:54;44814:72;:::o;44892:157::-;45032:9;45028:1;45020:6;45016:14;45009:33;44998:51;:::o;45055:223::-;45195:34;45191:1;45183:6;45179:14;45172:58;45264:6;45259:2;45251:6;45247:15;45240:31;45161:117;:::o;45284:175::-;45424:27;45420:1;45412:6;45408:14;45401:51;45390:69;:::o;45465:231::-;45605:34;45601:1;45593:6;45589:14;45582:58;45674:14;45669:2;45661:6;45657:15;45650:39;45571:125;:::o;45702:243::-;45842:34;45838:1;45830:6;45826:14;45819:58;45911:26;45906:2;45898:6;45894:15;45887:51;45808:137;:::o;45951:229::-;46091:34;46087:1;46079:6;46075:14;46068:58;46160:12;46155:2;46147:6;46143:15;46136:37;46057:123;:::o;46186:228::-;46326:34;46322:1;46314:6;46310:14;46303:58;46395:11;46390:2;46382:6;46378:15;46371:36;46292:122;:::o;46420:214::-;46560:66;46556:1;46548:6;46544:14;46537:90;46526:108;:::o;46640:182::-;46780:34;46776:1;46768:6;46764:14;46757:58;46746:76;:::o;46828:231::-;46968:34;46964:1;46956:6;46952:14;46945:58;47037:14;47032:2;47024:6;47020:15;47013:39;46934:125;:::o;47065:182::-;47205:34;47201:1;47193:6;47189:14;47182:58;47171:76;:::o;47253:214::-;47393:66;47389:1;47381:6;47377:14;47370:90;47359:108;:::o;47473:166::-;47613:18;47609:1;47601:6;47597:14;47590:42;47579:60;:::o;47645:228::-;47785:34;47781:1;47773:6;47769:14;47762:58;47854:11;47849:2;47841:6;47837:15;47830:36;47751:122;:::o;47879:155::-;48019:7;48015:1;48007:6;48003:14;47996:31;47985:49;:::o;48040:220::-;48180:34;48176:1;48168:6;48164:14;48157:58;48249:3;48244:2;48236:6;48232:15;48225:28;48146:114;:::o;48266:179::-;48406:31;48402:1;48394:6;48390:14;48383:55;48372:73;:::o;48451:236::-;48591:34;48587:1;48579:6;48575:14;48568:58;48660:19;48655:2;48647:6;48643:15;48636:44;48557:130;:::o;48693:231::-;48833:34;48829:1;48821:6;48817:14;48810:58;48902:14;48897:2;48889:6;48885:15;48878:39;48799:125;:::o;48930:181::-;49070:33;49066:1;49058:6;49054:14;49047:57;49036:75;:::o;49117:122::-;49190:24;49208:5;49190:24;:::i;:::-;49183:5;49180:35;49170:2;;49229:1;49226;49219:12;49170:2;49160:79;:::o;49245:116::-;49315:21;49330:5;49315:21;:::i;:::-;49308:5;49305:32;49295:2;;49351:1;49348;49341:12;49295:2;49285:76;:::o;49367:120::-;49439:23;49456:5;49439:23;:::i;:::-;49432:5;49429:34;49419:2;;49477:1;49474;49467:12;49419:2;49409:78;:::o;49493:122::-;49566:24;49584:5;49566:24;:::i;:::-;49559:5;49556:35;49546:2;;49605:1;49602;49595:12;49546:2;49536:79;:::o

Swarm Source

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