ETH Price: $3,159.48 (+1.53%)

Token

Frenly Flyz (FLYZ)
 

Overview

Max Total Supply

0 FLYZ

Holders

1,206

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
akarui.eth
Balance
9 FLYZ
0xcaa65fb3417710c3c5fc0e3194d4054bea19aab3
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:
FLYDrop

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: Ownable.sol


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

pragma solidity ^0.8.0;

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

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

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

    function OwnableInit() internal {
        _transferOwnership(msg.sender);
    }

    /**
     * @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() == msg.sender, "Ownable: caller is not the owner");
        _;
    }

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

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

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

// File: Address.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: PaymentSplitter.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;


/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    function SplitterInit(address[] memory payees, uint256[] memory shares_) internal {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(msg.sender, msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

// File: IERC721Receiver.sol


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

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: IERC165.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: IERC721.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: ERC721.sol


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

/**
 * Minimalist iteration of the OpenZeppelin ERC721 Contract. Consolidates functionality,
 * abandons before and after token transfer hooks, and eliminates unnecessary features
 * which are not officially part of the standard.
 * 
 * Some changes made to variable visibility to minimize overrides in main contract.
 */

pragma solidity ^0.8.0;






contract ERC721 is ERC165, IERC721, IERC721Metadata {
    using Address for address;

    // Token Index
    uint256 _tokenIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

    // Mapping owner address to minted count
    mapping(address => uint256) public _minted;

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

    // Freeze event for metadata
    event PermanentURI(string _value, uint256 indexed _id);

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    function ERC721Init(string memory name_, string memory symbol_) internal {
        _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);
    }

    function totalSupply() public view returns (uint256) {
        return _tokenIndex;
    }

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

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

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

    // Overridden ownerOf
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return 0 < tokenId && tokenId < 4013;
    }

    // Removed ERC721 specifier to use overridden ownerOf function
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    // Owner Of changed to use overridden function
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

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

    // OpenZeppelin _mint function overriden to support quantity. This reduces
    // writes to storage and simplifies code.
    //
    // Flag added to allow selection between "safe" and "unsafe" mint with one
    // function.

    function _mint(address to, uint256 quantity, uint256 safeMint, bytes memory data) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");

        // Reading tokenIndex into memory, and then updating
        // balances and stored index one time is more gas
        // efficient.
        uint256 mintIndex = _tokenIndex;
        _minted[to] += quantity;
        _tokenIndex += quantity;

        // Mint new tokens.
        for (uint256 i = 0; i < quantity; i++) {
            mintIndex++;
            _owners[mintIndex] = to;
            emit Transfer(address(0), to, mintIndex);
            emit PermanentURI("https://frenlyflyz.io/ffmp-token-metadata/", mintIndex);

            if (safeMint == 1) {
                require(
                    _checkOnERC721Received(address(0), to, mintIndex, data),
                    "ERC721: transfer to non ERC721Receiver implementer"
                );
            }
        }
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(msg.sender, 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(msg.sender, 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");
    }

    //Function overridden in main contract.
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        // 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 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(msg.sender, from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
}

// File: ECDSA.sol



pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}
// File: FrenlyFlyzFlyDrop.sol



pragma solidity ^0.8.0;






contract OwnableDelegateProxy { }

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

contract FLYDrop is ERC721, Ownable, PaymentSplitter {
    // Libraries
    using ECDSA for bytes32;
    using Strings for uint256;

    bool private _airdropDone;
    address _openSea;
    ERC721 _ffmp;

    address[] foundingFlyz;
    uint256[] foundingShares;

    constructor()
    {
        OwnableInit();
        ERC721Init("Frenly Flyz", "FLYZ");
        _ffmp = ERC721(0x38CA49B6dfA820bCa917A60995cC07b88Db7dC4D);
        _openSea = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;

        foundingFlyz = [
            0xeE24c06ae9469E29Fc0107048C2B4e806970ecdA,
            0x7d6F7FB391CD36BAde7baa7465581d9826a8D97D,
            0x665C5C08465E7c52DCD869a5998E11D8A6CdE361,
            0x9A665fb3fFB5906F47C438716D1E009767F96BBD,
            0x60916B17F8B0B9194baa5eCA43b7E1583b99A714,
            0xDAcb094be451A45D6C54fB18Eed1931D04F5793c,
            0xc2DfCFa2Bf1C871cB5af60b7eFBd95864984129D,
            0x155a3b74c26955Ca5174500A8f83947d7793bDd2,
            0xbB599fbd3BB5ce9326EA50dE38D09D5B946B24C1 
        ];

        foundingShares = [
            20,
            23,
            15,
            15,
            9,
            9,
            6,
            5,
            3
        ];

        SplitterInit(foundingFlyz,foundingShares);
    }

    function contractURI() public pure returns (string memory) {
        return "https://frenlyflyz.io/ff-collection-metadata/";
    }

    // *********************************************************************************************
    // Begin overrides to accomodate virtual owners information until owners are committed to state.
    // *********************************************************************************************
    function tokenURI(uint256 tokenId) public pure override(ERC721) returns (string memory) {
        // Since _owners starts empty but this contract represents 4012 NFTs, change the
        // exists check for tokenURI.
        require(0 < tokenId && tokenId < 4013, "Doesn't exist!");
        return string(abi.encodePacked("ipfs://QmSgeFjJWkUkGRMvGDZHGd52VTi1L8yjMMtQaBxXXaC9nV/", tokenId.toString(), ".json"));
    }

    function ownerOf(uint256 tokenId) public view virtual override(ERC721) returns (address) {
        // Since _owners starts empty but this contract represents 4012 NFTs, change the
        // exists check for tokenURI.
        require(0 < tokenId && tokenId < 4013, "Doesn't exist!");

        address owner = _owners[tokenId];
        if (owner != address(0)) {
            return owner;
        } else {
            return _ffmp.ownerOf(tokenId);
        }
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual override(ERC721) returns (bool) {
        require(0 < tokenId && tokenId < 4013, "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    // Free OS Listings
    function isApprovedForAll(
        address owner,
        address operator
    )
        public
        view
        override(ERC721)
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(_openSea);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }
        
        return ERC721.isApprovedForAll(owner, operator);
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override (ERC721) {
        require(ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        // If _balances not yet set from airdrop, then set balance
        // equal to balance of mint pass.
        if (_balances[from] == 0) {
            _balances[from] = _ffmp.balanceOf(from);
        }

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

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

        emit Transfer(from, to, tokenId);
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override(ERC721) {
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override(ERC721) {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override(ERC721) {
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    // If _balances for owner is not set in this contract, return balances from mint pass
    // contract.
    function balanceOf(address owner) public view virtual override(ERC721) returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        if (_balances[owner] == 0) {
            return _ffmp.balanceOf(owner);
        } else {
            return _balances[owner];
        }
    }
    // *************
    // End Overrides
    // *************

    function recoverLostFly(uint256 flyId, bytes memory signature) public {
        // Take a signed message from frenlyflyz.io server to confirm sender
        // was the owner of a pass during the snapshot. If sender was owner,
        // and internal _owners check still returns 0 address, then recover
        // the lost fly.
        //
        // If fly is transferred or sold by the new owner of a pass, it cannot
        // be recovered to protect future buyers.

        require(_owners[flyId] == address(0), "Cannot recover after transfer :(");

        bytes32 hash = keccak256(abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                keccak256(abi.encodePacked(msg.sender, flyId))
            ));

        // Value hard coded to reduce SLOAD.
        require(
            hash.recover(signature) == 0x87A7219276164F5740302c24f5D709830f4Ed91F,
                "Mint not signed!");
        
        if (_balances[msg.sender] == 0) {
            if (ownerOf(flyId) == msg.sender) {
                // For flyz which have not been lost, use the mint pass balance.
                _balances[msg.sender] = _ffmp.balanceOf(msg.sender);
            } else {
                // For flyz which were lost, use mint pass balance plus one.
                _balances[msg.sender] = _ffmp.balanceOf(msg.sender) + 1;
            }
        }

        _owners[flyId] = msg.sender;
    }

    function airdrop(uint256 start, uint256 end) public onlyOwner {
        uint256 i;
        for (i = start; i < end; i++) {
            emit Transfer(address(0), _ffmp.ownerOf(i), i);
        }
    }

    // To restore to previous state after migration.
    function adminTransfer(
        address from,
        address to,
        uint256 tokenId
    ) public onlyOwner {
        require(!_airdropDone, "Can't transfer after airdrop is done.");
        _transfer(from, to, tokenId);
    }

    function finishAirdrop() public onlyOwner {
        _airdropDone = true;
    }
}

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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"PermanentURI","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":"","type":"address"}],"name":"_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"adminTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"finishAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"flyId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recoverLostFly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5062000023336200055560201b60201c565b620000336200061b60201b60201c565b620000af6040518060400160405280600b81526020017f4672656e6c7920466c797a0000000000000000000000000000000000000000008152506040518060400160405280600481526020017f464c595a000000000000000000000000000000000000000000000000000000008152506200062e60201b60201c565b7338ca49b6dfa820bca917a60995cc07b88db7dc4d600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a5409ec958c83c3f309868babaca7c86dcb077c1600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180610120016040528073ee24c06ae9469e29fc0107048c2b4e806970ecda73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001737d6f7fb391cd36bade7baa7465581d9826a8d97d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173665c5c08465e7c52dcd869a5998e11d8a6cde36173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001739a665fb3ffb5906f47c438716d1e009767f96bbd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017360916b17f8b0b9194baa5eca43b7e1583b99a71473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173dacb094be451a45d6c54fb18eed1931d04f5793c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c2dfcfa2bf1c871cb5af60b7efbd95864984129d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173155a3b74c26955ca5174500a8f83947d7793bdd273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173bb599fbd3bb5ce9326ea50de38d09d5b946b24c173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506010906009620003eb929190620009a0565b50604051806101200160405280601460ff168152602001601760ff168152602001600f60ff168152602001600f60ff168152602001600960ff168152602001600960ff168152602001600660ff168152602001600560ff168152602001600360ff1681525060119060096200046292919062000a2f565b506200054f6010805480602002602001604051908101604052809291908181526020018280548015620004eb57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311620004a0575b505050505060118054806020026020016040519081016040528092919081815260200182805480156200053e57602002820191906000526020600020905b81548152602001906001019080831162000529575b50505050506200066460201b60201c565b62000fee565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200062c336200055560201b60201c565b565b81600190805190602001906200064692919062000a86565b5080600290805190602001906200065f92919062000a86565b505050565b8051825114620006ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006a29062000c6a565b60405180910390fd5b6000825111620006f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006e99062000cae565b60405180910390fd5b60005b825181101562000761576200074b83828151811062000719576200071862000e80565b5b602002602001015183838151811062000737576200073662000e80565b5b60200260200101516200076660201b60201c565b8080620007589062000dd4565b915050620006f5565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620007d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007d09062000c48565b60405180910390fd5b600081116200081f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008169062000cd0565b60405180910390fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414620008a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200089b9062000c8c565b60405180910390fd5b600d829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009546200095b919062000d03565b6009819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200099492919062000c1b565b60405180910390a15050565b82805482825590600052602060002090810192821562000a1c579160200282015b8281111562000a1b5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620009c1565b5b50905062000a2b919062000b17565b5090565b82805482825590600052602060002090810192821562000a73579160200282015b8281111562000a72578251829060ff1690559160200191906001019062000a50565b5b50905062000a82919062000b17565b5090565b82805462000a949062000d9e565b90600052602060002090601f01602090048101928262000ab8576000855562000b04565b82601f1062000ad357805160ff191683800117855562000b04565b8280016001018555821562000b04579182015b8281111562000b0357825182559160200191906001019062000ae6565b5b50905062000b13919062000b17565b5090565b5b8082111562000b3257600081600090555060010162000b18565b5090565b62000b418162000d60565b82525050565b600062000b56602c8362000cf2565b915062000b638262000eaf565b604082019050919050565b600062000b7d60328362000cf2565b915062000b8a8262000efe565b604082019050919050565b600062000ba4602b8362000cf2565b915062000bb18262000f4d565b604082019050919050565b600062000bcb601a8362000cf2565b915062000bd88262000f9c565b602082019050919050565b600062000bf2601d8362000cf2565b915062000bff8262000fc5565b602082019050919050565b62000c158162000d94565b82525050565b600060408201905062000c32600083018562000b36565b62000c41602083018462000c0a565b9392505050565b6000602082019050818103600083015262000c638162000b47565b9050919050565b6000602082019050818103600083015262000c858162000b6e565b9050919050565b6000602082019050818103600083015262000ca78162000b95565b9050919050565b6000602082019050818103600083015262000cc98162000bbc565b9050919050565b6000602082019050818103600083015262000ceb8162000be3565b9050919050565b600082825260208201905092915050565b600062000d108262000d94565b915062000d1d8362000d94565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000d555762000d5462000e22565b5b828201905092915050565b600062000d6d8262000d74565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000db757607f821691505b6020821081141562000dce5762000dcd62000e51565b5b50919050565b600062000de18262000d94565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000e175762000e1662000e22565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b614a268062000ffe6000396000f3fe6080604052600436106101dc5760003560e01c8063715018a611610102578063b88d4fde11610095578063e33b7de311610064578063e33b7de314610736578063e8a3d48514610761578063e985e9c51461078c578063f2fde38b146107c95761021c565b8063b88d4fde1461066a578063c87b56dd14610693578063ce7c2ac2146106d0578063da72c1e81461070d5761021c565b806395d89b41116100d157806395d89b411461059c5780639852595c146105c7578063992924a614610604578063a22cb465146106415761021c565b8063715018a6146104e05780637de77ecc146104f75780638b83209b146105345780638da5cb5b146105715761021c565b806323b872dd1161017a5780636352211e116101495780636352211e146104005780636ebcf6071461043d5780636f243a9c1461047a57806370a08231146104a35761021c565b806323b872dd1461035a5780633a98ef391461038357806342842e0e146103ae5780634eec5024146103d75761021c565b8063095ea7b3116101b6578063095ea7b3146102c657806318160ddd146102ef578063191655871461031a5780631a668c42146103435761021c565b806301ffc9a71461022157806306fdde031461025e578063081812fc146102895761021c565b3661021c577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7703334604051610212929190613956565b60405180910390a1005b600080fd5b34801561022d57600080fd5b506102486004803603810190610243919061319f565b6107f2565b604051610255919061397f565b60405180910390f35b34801561026a57600080fd5b506102736108d4565b60405161028091906139df565b60405180910390f35b34801561029557600080fd5b506102b060048036038101906102ab9190613226565b610966565b6040516102bd91906138c6565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e8919061315f565b6109eb565b005b3480156102fb57600080fd5b50610304610af5565b6040516103119190613d01565b60405180910390f35b34801561032657600080fd5b50610341600480360381019061033c9190612fdc565b610afe565b005b34801561034f57600080fd5b50610358610ca9565b005b34801561036657600080fd5b50610381600480360381019061037c9190613049565b610d3b565b005b34801561038f57600080fd5b50610398610d94565b6040516103a59190613d01565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190613049565b610d9e565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190613280565b610dbe565b005b34801561040c57600080fd5b5061042760048036038101906104229190613226565b611211565b60405161043491906138c6565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f9190612f82565b61138c565b6040516104719190613d01565b60405180910390f35b34801561048657600080fd5b506104a1600480360381019061049c91906132dc565b6113a4565b005b3480156104af57600080fd5b506104ca60048036038101906104c59190612f82565b611545565b6040516104d79190613d01565b60405180910390f35b3480156104ec57600080fd5b506104f56116f8565b005b34801561050357600080fd5b5061051e60048036038101906105199190612f82565b611779565b60405161052b9190613d01565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190613226565b611791565b60405161056891906138c6565b60405180910390f35b34801561057d57600080fd5b506105866117d9565b60405161059391906138c6565b60405180910390f35b3480156105a857600080fd5b506105b1611803565b6040516105be91906139df565b60405180910390f35b3480156105d357600080fd5b506105ee60048036038101906105e99190612f82565b611895565b6040516105fb9190613d01565b60405180910390f35b34801561061057600080fd5b5061062b60048036038101906106269190613226565b6118de565b60405161063891906138c6565b60405180910390f35b34801561064d57600080fd5b506106686004803603810190610663919061311f565b611911565b005b34801561067657600080fd5b50610691600480360381019061068c919061309c565b611920565b005b34801561069f57600080fd5b506106ba60048036038101906106b59190613226565b61197b565b6040516106c791906139df565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f29190612f82565b6119fc565b6040516107049190613d01565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f9190613049565b611a45565b005b34801561074257600080fd5b5061074b611b1a565b6040516107589190613d01565b60405180910390f35b34801561076d57600080fd5b50610776611b24565b60405161078391906139df565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae9190613009565b611b44565b6040516107c0919061397f565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb9190612f82565b611c46565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108bd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108cd57506108cc82611d37565b5b9050919050565b6060600180546108e390613ffc565b80601f016020809104026020016040519081016040528092919081815260200182805461090f90613ffc565b801561095c5780601f106109315761010080835404028352916020019161095c565b820191906000526020600020905b81548152906001019060200180831161093f57829003601f168201915b5050505050905090565b600061097182611da1565b6109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a790613c41565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109f682611211565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5e90613cc1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610aa75750610aa68133611b44565b5b610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90613be1565b60405180910390fd5b610af08383611dbb565b505050565b60008054905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7790613aa1565b60405180910390fd5b6000610b8a611b1a565b47610b959190613dc0565b90506000610bac8383610ba786611895565b611e74565b90506000811415610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990613ba1565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c419190613dc0565b9250508190555080600a6000828254610c5a9190613dc0565b92505081905550610c6b8382611ee2565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610c9c9291906138e1565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff16610cc86117d9565b73ffffffffffffffffffffffffffffffffffffffff1614610d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1590613c81565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b610d453382611fd6565b610d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7b90613ce1565b60405180910390fd5b610d8f8383836120bc565b505050565b6000600954905090565b610db983838360405180602001604052806000815250611920565b505050565b600073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5790613b01565b60405180910390fd5b60003383604051602001610e75929190613832565b60405160208183030381529060405280519060200120604051602001610e9b919061385e565b6040516020818303038152906040528051906020012090507387a7219276164f5740302c24f5d709830f4ed91f73ffffffffffffffffffffffffffffffffffffffff16610ef1838361244490919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff1614610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e90613c61565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156111ba573373ffffffffffffffffffffffffffffffffffffffff16610faf84611211565b73ffffffffffffffffffffffffffffffffffffffff1614156110be57600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161102691906138c6565b60206040518083038186803b15801561103e57600080fd5b505afa158015611052573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110769190613253565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111b9565b6001600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161111b91906138c6565b60206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190613253565b6111759190613dc0565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b336003600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60008160001080156112245750610fad82105b611263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125a90613bc1565b60405180910390fd5b60006003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112d85780915050611387565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016113339190613d01565b60206040518083038186803b15801561134b57600080fd5b505afa15801561135f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113839190612faf565b9150505b919050565b60046020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff166113c36117d9565b73ffffffffffffffffffffffffffffffffffffffff1614611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141090613c81565b60405180910390fd5b60008290505b818110156115405780600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016114839190613d01565b60206040518083038186803b15801561149b57600080fd5b505afa1580156114af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d39190612faf565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480806115389061405f565b91505061141f565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ad90613c01565b60405180910390fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156116b057600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161165991906138c6565b60206040518083038186803b15801561167157600080fd5b505afa158015611685573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a99190613253565b90506116f3565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b919050565b3373ffffffffffffffffffffffffffffffffffffffff166117176117d9565b73ffffffffffffffffffffffffffffffffffffffff161461176d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176490613c81565b60405180910390fd5b611777600061246b565b565b60056020528060005260406000206000915090505481565b6000600d82815481106117a7576117a66141cd565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461181290613ffc565b80601f016020809104026020016040519081016040528092919081815260200182805461183e90613ffc565b801561188b5780601f106118605761010080835404028352916020019161188b565b820191906000526020600020905b81548152906001019060200180831161186e57829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61191c338383612531565b5050565b61192a3383611fd6565b611969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196090613ce1565b60405180910390fd5b6119758484848461269e565b50505050565b606081600010801561198e5750610fad82105b6119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c490613bc1565b60405180910390fd5b6119d6826126fa565b6040516020016119e69190613899565b6040516020818303038152906040529050919050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b3373ffffffffffffffffffffffffffffffffffffffff16611a646117d9565b73ffffffffffffffffffffffffffffffffffffffff1614611aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab190613c81565b60405180910390fd5b600e60009054906101000a900460ff1615611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190613ca1565b60405180910390fd5b611b158383836120bc565b505050565b6000600a54905090565b60606040518060600160405280602d81526020016149c4602d9139905090565b600080600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611bbc91906138c6565b60206040518083038186803b158015611bd457600080fd5b505afa158015611be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0c91906131f9565b73ffffffffffffffffffffffffffffffffffffffff161415611c32576001915050611c40565b611c3c848461285b565b9150505b92915050565b3373ffffffffffffffffffffffffffffffffffffffff16611c656117d9565b73ffffffffffffffffffffffffffffffffffffffff1614611cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb290613c81565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2290613a61565b60405180910390fd5b611d348161246b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816000108015611db45750610fad82105b9050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e2e83611211565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600954600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485611ec59190613e47565b611ecf9190613e16565b611ed99190613ea1565b90509392505050565b80471015611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c90613b61565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611f4b90613884565b60006040518083038185875af1925050503d8060008114611f88576040519150601f19603f3d011682016040523d82523d6000602084013e611f8d565b606091505b5050905080611fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc890613b21565b60405180910390fd5b505050565b6000816000108015611fe95750610fad82105b612028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201f90613b81565b60405180910390fd5b600061203383611211565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120a257508373ffffffffffffffffffffffffffffffffffffffff1661208a84610966565b73ffffffffffffffffffffffffffffffffffffffff16145b806120b357506120b28185611b44565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120dc82611211565b73ffffffffffffffffffffffffffffffffffffffff1614612132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212990613a81565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990613ac1565b60405180910390fd5b6000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156122d957600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161224591906138c6565b60206040518083038186803b15801561225d57600080fd5b505afa158015612271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122959190613253565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6122e4600082611dbb565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123349190613ea1565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461238b9190613dc0565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080600061245385856128ef565b9150915061246081612972565b819250505092915050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259790613ae1565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612691919061397f565b60405180910390a3505050565b6126a98484846120bc565b6126b584848484612b47565b6126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb90613a41565b60405180910390fd5b50505050565b60606000821415612742576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612856565b600082905060005b6000821461277457808061275d9061405f565b915050600a8261276d9190613e16565b915061274a565b60008167ffffffffffffffff8111156127905761278f6141fc565b5b6040519080825280601f01601f1916602001820160405280156127c25781602001600182028036833780820191505090505b5090505b6000851461284f576001826127db9190613ea1565b9150600a856127ea91906140e0565b60306127f69190613dc0565b60f81b81838151811061280c5761280b6141cd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128489190613e16565b94506127c6565b8093505050505b919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806041835114156129315760008060006020860151925060408601519150606086015160001a905061292587828585612cd7565b9450945050505061296b565b604083511415612962576000806020850151915060408501519050612957868383612de4565b93509350505061296b565b60006002915091505b9250929050565b600060048111156129865761298561416f565b5b8160048111156129995761299861416f565b5b14156129a457612b44565b600160048111156129b8576129b761416f565b5b8160048111156129cb576129ca61416f565b5b1415612a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0390613a01565b60405180910390fd5b60026004811115612a2057612a1f61416f565b5b816004811115612a3357612a3261416f565b5b1415612a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6b90613a21565b60405180910390fd5b60036004811115612a8857612a8761416f565b5b816004811115612a9b57612a9a61416f565b5b1415612adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad390613b41565b60405180910390fd5b600480811115612aef57612aee61416f565b5b816004811115612b0257612b0161416f565b5b1415612b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3a90613c21565b60405180910390fd5b5b50565b6000612b688473ffffffffffffffffffffffffffffffffffffffff16612e32565b15612cca578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b8152600401612bac949392919061390a565b602060405180830381600087803b158015612bc657600080fd5b505af1925050508015612bf757506040513d601f19601f82011682018060405250810190612bf491906131cc565b60015b612c7a573d8060008114612c27576040519150601f19603f3d011682016040523d82523d6000602084013e612c2c565b606091505b50600081511415612c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6990613a41565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ccf565b600190505b949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612d12576000600391509150612ddb565b601b8560ff1614158015612d2a5750601c8560ff1614155b15612d3c576000600491509150612ddb565b600060018787878760405160008152602001604052604051612d61949392919061399a565b6020604051602081039080840390855afa158015612d83573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612dd257600060019250925050612ddb565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050612e2487828885612cd7565b935093505050935093915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000612e68612e6384613d41565b613d1c565b905082815260208101848484011115612e8457612e83614230565b5b612e8f848285613fba565b509392505050565b600081359050612ea681614939565b92915050565b600081519050612ebb81614939565b92915050565b600081359050612ed081614950565b92915050565b600081359050612ee581614967565b92915050565b600081359050612efa8161497e565b92915050565b600081519050612f0f8161497e565b92915050565b600082601f830112612f2a57612f2961422b565b5b8135612f3a848260208601612e55565b91505092915050565b600081519050612f5281614995565b92915050565b600081359050612f67816149ac565b92915050565b600081519050612f7c816149ac565b92915050565b600060208284031215612f9857612f9761423a565b5b6000612fa684828501612e97565b91505092915050565b600060208284031215612fc557612fc461423a565b5b6000612fd384828501612eac565b91505092915050565b600060208284031215612ff257612ff161423a565b5b600061300084828501612ec1565b91505092915050565b600080604083850312156130205761301f61423a565b5b600061302e85828601612e97565b925050602061303f85828601612e97565b9150509250929050565b6000806000606084860312156130625761306161423a565b5b600061307086828701612e97565b935050602061308186828701612e97565b925050604061309286828701612f58565b9150509250925092565b600080600080608085870312156130b6576130b561423a565b5b60006130c487828801612e97565b94505060206130d587828801612e97565b93505060406130e687828801612f58565b925050606085013567ffffffffffffffff81111561310757613106614235565b5b61311387828801612f15565b91505092959194509250565b600080604083850312156131365761313561423a565b5b600061314485828601612e97565b925050602061315585828601612ed6565b9150509250929050565b600080604083850312156131765761317561423a565b5b600061318485828601612e97565b925050602061319585828601612f58565b9150509250929050565b6000602082840312156131b5576131b461423a565b5b60006131c384828501612eeb565b91505092915050565b6000602082840312156131e2576131e161423a565b5b60006131f084828501612f00565b91505092915050565b60006020828403121561320f5761320e61423a565b5b600061321d84828501612f43565b91505092915050565b60006020828403121561323c5761323b61423a565b5b600061324a84828501612f58565b91505092915050565b6000602082840312156132695761326861423a565b5b600061327784828501612f6d565b91505092915050565b600080604083850312156132975761329661423a565b5b60006132a585828601612f58565b925050602083013567ffffffffffffffff8111156132c6576132c5614235565b5b6132d285828601612f15565b9150509250929050565b600080604083850312156132f3576132f261423a565b5b600061330185828601612f58565b925050602061331285828601612f58565b9150509250929050565b61332581613f84565b82525050565b61333481613ed5565b82525050565b61334b61334682613ed5565b6140a8565b82525050565b61335a81613ef9565b82525050565b61336981613f05565b82525050565b61338061337b82613f05565b6140ba565b82525050565b600061339182613d72565b61339b8185613d88565b93506133ab818560208601613fc9565b6133b48161423f565b840191505092915050565b60006133ca82613d7d565b6133d48185613da4565b93506133e4818560208601613fc9565b6133ed8161423f565b840191505092915050565b600061340382613d7d565b61340d8185613db5565b935061341d818560208601613fc9565b80840191505092915050565b6000613436601883613da4565b91506134418261425d565b602082019050919050565b6000613459601f83613da4565b915061346482614286565b602082019050919050565b600061347c601c83613db5565b9150613487826142af565b601c82019050919050565b600061349f603283613da4565b91506134aa826142d8565b604082019050919050565b60006134c2602683613da4565b91506134cd82614327565b604082019050919050565b60006134e5602583613da4565b91506134f082614376565b604082019050919050565b6000613508602683613da4565b9150613513826143c5565b604082019050919050565b600061352b602483613da4565b915061353682614414565b604082019050919050565b600061354e601983613da4565b915061355982614463565b602082019050919050565b6000613571602083613da4565b915061357c8261448c565b602082019050919050565b6000613594603a83613da4565b915061359f826144b5565b604082019050919050565b60006135b7602283613da4565b91506135c282614504565b604082019050919050565b60006135da601d83613da4565b91506135e582614553565b602082019050919050565b60006135fd602c83613da4565b91506136088261457c565b604082019050919050565b6000613620602b83613da4565b915061362b826145cb565b604082019050919050565b6000613643600e83613da4565b915061364e8261461a565b602082019050919050565b6000613666603883613da4565b915061367182614643565b604082019050919050565b6000613689602a83613da4565b915061369482614692565b604082019050919050565b60006136ac602283613da4565b91506136b7826146e1565b604082019050919050565b60006136cf602c83613da4565b91506136da82614730565b604082019050919050565b60006136f2601083613da4565b91506136fd8261477f565b602082019050919050565b6000613715600583613db5565b9150613720826147a8565b600582019050919050565b6000613738602083613da4565b9150613743826147d1565b602082019050919050565b600061375b602583613da4565b9150613766826147fa565b604082019050919050565b600061377e602183613da4565b915061378982614849565b604082019050919050565b60006137a1600083613d99565b91506137ac82614898565b600082019050919050565b60006137c4603183613da4565b91506137cf8261489b565b604082019050919050565b60006137e7603683613db5565b91506137f2826148ea565b603682019050919050565b61380681613f6d565b82525050565b61381d61381882613f6d565b6140d6565b82525050565b61382c81613f77565b82525050565b600061383e828561333a565b60148201915061384e828461380c565b6020820191508190509392505050565b60006138698261346f565b9150613875828461336f565b60208201915081905092915050565b600061388f82613794565b9150819050919050565b60006138a4826137da565b91506138b082846133f8565b91506138bb82613708565b915081905092915050565b60006020820190506138db600083018461332b565b92915050565b60006040820190506138f6600083018561331c565b61390360208301846137fd565b9392505050565b600060808201905061391f600083018761332b565b61392c602083018661332b565b61393960408301856137fd565b818103606083015261394b8184613386565b905095945050505050565b600060408201905061396b600083018561332b565b61397860208301846137fd565b9392505050565b60006020820190506139946000830184613351565b92915050565b60006080820190506139af6000830187613360565b6139bc6020830186613823565b6139c96040830185613360565b6139d66060830184613360565b95945050505050565b600060208201905081810360008301526139f981846133bf565b905092915050565b60006020820190508181036000830152613a1a81613429565b9050919050565b60006020820190508181036000830152613a3a8161344c565b9050919050565b60006020820190508181036000830152613a5a81613492565b9050919050565b60006020820190508181036000830152613a7a816134b5565b9050919050565b60006020820190508181036000830152613a9a816134d8565b9050919050565b60006020820190508181036000830152613aba816134fb565b9050919050565b60006020820190508181036000830152613ada8161351e565b9050919050565b60006020820190508181036000830152613afa81613541565b9050919050565b60006020820190508181036000830152613b1a81613564565b9050919050565b60006020820190508181036000830152613b3a81613587565b9050919050565b60006020820190508181036000830152613b5a816135aa565b9050919050565b60006020820190508181036000830152613b7a816135cd565b9050919050565b60006020820190508181036000830152613b9a816135f0565b9050919050565b60006020820190508181036000830152613bba81613613565b9050919050565b60006020820190508181036000830152613bda81613636565b9050919050565b60006020820190508181036000830152613bfa81613659565b9050919050565b60006020820190508181036000830152613c1a8161367c565b9050919050565b60006020820190508181036000830152613c3a8161369f565b9050919050565b60006020820190508181036000830152613c5a816136c2565b9050919050565b60006020820190508181036000830152613c7a816136e5565b9050919050565b60006020820190508181036000830152613c9a8161372b565b9050919050565b60006020820190508181036000830152613cba8161374e565b9050919050565b60006020820190508181036000830152613cda81613771565b9050919050565b60006020820190508181036000830152613cfa816137b7565b9050919050565b6000602082019050613d1660008301846137fd565b92915050565b6000613d26613d37565b9050613d32828261402e565b919050565b6000604051905090565b600067ffffffffffffffff821115613d5c57613d5b6141fc565b5b613d658261423f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613dcb82613f6d565b9150613dd683613f6d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e0b57613e0a614111565b5b828201905092915050565b6000613e2182613f6d565b9150613e2c83613f6d565b925082613e3c57613e3b614140565b5b828204905092915050565b6000613e5282613f6d565b9150613e5d83613f6d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e9657613e95614111565b5b828202905092915050565b6000613eac82613f6d565b9150613eb783613f6d565b925082821015613eca57613ec9614111565b5b828203905092915050565b6000613ee082613f4d565b9050919050565b6000613ef282613f4d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000613f4682613ed5565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613f8f82613f96565b9050919050565b6000613fa182613fa8565b9050919050565b6000613fb382613f4d565b9050919050565b82818337600083830152505050565b60005b83811015613fe7578082015181840152602081019050613fcc565b83811115613ff6576000848401525b50505050565b6000600282049050600182168061401457607f821691505b602082108114156140285761402761419e565b5b50919050565b6140378261423f565b810181811067ffffffffffffffff82111715614056576140556141fc565b5b80604052505050565b600061406a82613f6d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561409d5761409c614111565b5b600182019050919050565b60006140b3826140c4565b9050919050565b6000819050919050565b60006140cf82614250565b9050919050565b6000819050919050565b60006140eb82613f6d565b91506140f683613f6d565b92508261410657614105614140565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43616e6e6f74207265636f766572206166746572207472616e73666572203a28600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f446f65736e277420657869737421000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e74206e6f74207369676e65642100000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616e2774207472616e736665722061667465722061697264726f702069732060008201527f646f6e652e000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f697066733a2f2f516d536765466a4a576b556b47524d7647445a48476435325660008201527f5469314c38796a4d4d745161427858586143396e562f00000000000000000000602082015250565b61494281613ed5565b811461494d57600080fd5b50565b61495981613ee7565b811461496457600080fd5b50565b61497081613ef9565b811461497b57600080fd5b50565b61498781613f0f565b811461499257600080fd5b50565b61499e81613f3b565b81146149a957600080fd5b50565b6149b581613f6d565b81146149c057600080fd5b5056fe68747470733a2f2f6672656e6c79666c797a2e696f2f66662d636f6c6c656374696f6e2d6d657461646174612fa264697066735822122013f96229fd2e488f5fcc096a426b1a65748a53cd35752ef8ae068bae289b7d2f64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101dc5760003560e01c8063715018a611610102578063b88d4fde11610095578063e33b7de311610064578063e33b7de314610736578063e8a3d48514610761578063e985e9c51461078c578063f2fde38b146107c95761021c565b8063b88d4fde1461066a578063c87b56dd14610693578063ce7c2ac2146106d0578063da72c1e81461070d5761021c565b806395d89b41116100d157806395d89b411461059c5780639852595c146105c7578063992924a614610604578063a22cb465146106415761021c565b8063715018a6146104e05780637de77ecc146104f75780638b83209b146105345780638da5cb5b146105715761021c565b806323b872dd1161017a5780636352211e116101495780636352211e146104005780636ebcf6071461043d5780636f243a9c1461047a57806370a08231146104a35761021c565b806323b872dd1461035a5780633a98ef391461038357806342842e0e146103ae5780634eec5024146103d75761021c565b8063095ea7b3116101b6578063095ea7b3146102c657806318160ddd146102ef578063191655871461031a5780631a668c42146103435761021c565b806301ffc9a71461022157806306fdde031461025e578063081812fc146102895761021c565b3661021c577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7703334604051610212929190613956565b60405180910390a1005b600080fd5b34801561022d57600080fd5b506102486004803603810190610243919061319f565b6107f2565b604051610255919061397f565b60405180910390f35b34801561026a57600080fd5b506102736108d4565b60405161028091906139df565b60405180910390f35b34801561029557600080fd5b506102b060048036038101906102ab9190613226565b610966565b6040516102bd91906138c6565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e8919061315f565b6109eb565b005b3480156102fb57600080fd5b50610304610af5565b6040516103119190613d01565b60405180910390f35b34801561032657600080fd5b50610341600480360381019061033c9190612fdc565b610afe565b005b34801561034f57600080fd5b50610358610ca9565b005b34801561036657600080fd5b50610381600480360381019061037c9190613049565b610d3b565b005b34801561038f57600080fd5b50610398610d94565b6040516103a59190613d01565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190613049565b610d9e565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190613280565b610dbe565b005b34801561040c57600080fd5b5061042760048036038101906104229190613226565b611211565b60405161043491906138c6565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f9190612f82565b61138c565b6040516104719190613d01565b60405180910390f35b34801561048657600080fd5b506104a1600480360381019061049c91906132dc565b6113a4565b005b3480156104af57600080fd5b506104ca60048036038101906104c59190612f82565b611545565b6040516104d79190613d01565b60405180910390f35b3480156104ec57600080fd5b506104f56116f8565b005b34801561050357600080fd5b5061051e60048036038101906105199190612f82565b611779565b60405161052b9190613d01565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190613226565b611791565b60405161056891906138c6565b60405180910390f35b34801561057d57600080fd5b506105866117d9565b60405161059391906138c6565b60405180910390f35b3480156105a857600080fd5b506105b1611803565b6040516105be91906139df565b60405180910390f35b3480156105d357600080fd5b506105ee60048036038101906105e99190612f82565b611895565b6040516105fb9190613d01565b60405180910390f35b34801561061057600080fd5b5061062b60048036038101906106269190613226565b6118de565b60405161063891906138c6565b60405180910390f35b34801561064d57600080fd5b506106686004803603810190610663919061311f565b611911565b005b34801561067657600080fd5b50610691600480360381019061068c919061309c565b611920565b005b34801561069f57600080fd5b506106ba60048036038101906106b59190613226565b61197b565b6040516106c791906139df565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f29190612f82565b6119fc565b6040516107049190613d01565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f9190613049565b611a45565b005b34801561074257600080fd5b5061074b611b1a565b6040516107589190613d01565b60405180910390f35b34801561076d57600080fd5b50610776611b24565b60405161078391906139df565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae9190613009565b611b44565b6040516107c0919061397f565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb9190612f82565b611c46565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108bd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108cd57506108cc82611d37565b5b9050919050565b6060600180546108e390613ffc565b80601f016020809104026020016040519081016040528092919081815260200182805461090f90613ffc565b801561095c5780601f106109315761010080835404028352916020019161095c565b820191906000526020600020905b81548152906001019060200180831161093f57829003601f168201915b5050505050905090565b600061097182611da1565b6109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a790613c41565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109f682611211565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5e90613cc1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610aa75750610aa68133611b44565b5b610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90613be1565b60405180910390fd5b610af08383611dbb565b505050565b60008054905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7790613aa1565b60405180910390fd5b6000610b8a611b1a565b47610b959190613dc0565b90506000610bac8383610ba786611895565b611e74565b90506000811415610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990613ba1565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c419190613dc0565b9250508190555080600a6000828254610c5a9190613dc0565b92505081905550610c6b8382611ee2565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610c9c9291906138e1565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff16610cc86117d9565b73ffffffffffffffffffffffffffffffffffffffff1614610d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1590613c81565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b610d453382611fd6565b610d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7b90613ce1565b60405180910390fd5b610d8f8383836120bc565b505050565b6000600954905090565b610db983838360405180602001604052806000815250611920565b505050565b600073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5790613b01565b60405180910390fd5b60003383604051602001610e75929190613832565b60405160208183030381529060405280519060200120604051602001610e9b919061385e565b6040516020818303038152906040528051906020012090507387a7219276164f5740302c24f5d709830f4ed91f73ffffffffffffffffffffffffffffffffffffffff16610ef1838361244490919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff1614610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e90613c61565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156111ba573373ffffffffffffffffffffffffffffffffffffffff16610faf84611211565b73ffffffffffffffffffffffffffffffffffffffff1614156110be57600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161102691906138c6565b60206040518083038186803b15801561103e57600080fd5b505afa158015611052573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110769190613253565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111b9565b6001600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161111b91906138c6565b60206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190613253565b6111759190613dc0565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b336003600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60008160001080156112245750610fad82105b611263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125a90613bc1565b60405180910390fd5b60006003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112d85780915050611387565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016113339190613d01565b60206040518083038186803b15801561134b57600080fd5b505afa15801561135f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113839190612faf565b9150505b919050565b60046020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff166113c36117d9565b73ffffffffffffffffffffffffffffffffffffffff1614611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141090613c81565b60405180910390fd5b60008290505b818110156115405780600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016114839190613d01565b60206040518083038186803b15801561149b57600080fd5b505afa1580156114af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d39190612faf565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480806115389061405f565b91505061141f565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ad90613c01565b60405180910390fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156116b057600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161165991906138c6565b60206040518083038186803b15801561167157600080fd5b505afa158015611685573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a99190613253565b90506116f3565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b919050565b3373ffffffffffffffffffffffffffffffffffffffff166117176117d9565b73ffffffffffffffffffffffffffffffffffffffff161461176d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176490613c81565b60405180910390fd5b611777600061246b565b565b60056020528060005260406000206000915090505481565b6000600d82815481106117a7576117a66141cd565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461181290613ffc565b80601f016020809104026020016040519081016040528092919081815260200182805461183e90613ffc565b801561188b5780601f106118605761010080835404028352916020019161188b565b820191906000526020600020905b81548152906001019060200180831161186e57829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61191c338383612531565b5050565b61192a3383611fd6565b611969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196090613ce1565b60405180910390fd5b6119758484848461269e565b50505050565b606081600010801561198e5750610fad82105b6119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c490613bc1565b60405180910390fd5b6119d6826126fa565b6040516020016119e69190613899565b6040516020818303038152906040529050919050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b3373ffffffffffffffffffffffffffffffffffffffff16611a646117d9565b73ffffffffffffffffffffffffffffffffffffffff1614611aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab190613c81565b60405180910390fd5b600e60009054906101000a900460ff1615611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190613ca1565b60405180910390fd5b611b158383836120bc565b505050565b6000600a54905090565b60606040518060600160405280602d81526020016149c4602d9139905090565b600080600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611bbc91906138c6565b60206040518083038186803b158015611bd457600080fd5b505afa158015611be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0c91906131f9565b73ffffffffffffffffffffffffffffffffffffffff161415611c32576001915050611c40565b611c3c848461285b565b9150505b92915050565b3373ffffffffffffffffffffffffffffffffffffffff16611c656117d9565b73ffffffffffffffffffffffffffffffffffffffff1614611cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb290613c81565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2290613a61565b60405180910390fd5b611d348161246b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816000108015611db45750610fad82105b9050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e2e83611211565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600954600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485611ec59190613e47565b611ecf9190613e16565b611ed99190613ea1565b90509392505050565b80471015611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c90613b61565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611f4b90613884565b60006040518083038185875af1925050503d8060008114611f88576040519150601f19603f3d011682016040523d82523d6000602084013e611f8d565b606091505b5050905080611fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc890613b21565b60405180910390fd5b505050565b6000816000108015611fe95750610fad82105b612028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201f90613b81565b60405180910390fd5b600061203383611211565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120a257508373ffffffffffffffffffffffffffffffffffffffff1661208a84610966565b73ffffffffffffffffffffffffffffffffffffffff16145b806120b357506120b28185611b44565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120dc82611211565b73ffffffffffffffffffffffffffffffffffffffff1614612132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212990613a81565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990613ac1565b60405180910390fd5b6000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156122d957600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161224591906138c6565b60206040518083038186803b15801561225d57600080fd5b505afa158015612271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122959190613253565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6122e4600082611dbb565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123349190613ea1565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461238b9190613dc0565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080600061245385856128ef565b9150915061246081612972565b819250505092915050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259790613ae1565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612691919061397f565b60405180910390a3505050565b6126a98484846120bc565b6126b584848484612b47565b6126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb90613a41565b60405180910390fd5b50505050565b60606000821415612742576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612856565b600082905060005b6000821461277457808061275d9061405f565b915050600a8261276d9190613e16565b915061274a565b60008167ffffffffffffffff8111156127905761278f6141fc565b5b6040519080825280601f01601f1916602001820160405280156127c25781602001600182028036833780820191505090505b5090505b6000851461284f576001826127db9190613ea1565b9150600a856127ea91906140e0565b60306127f69190613dc0565b60f81b81838151811061280c5761280b6141cd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128489190613e16565b94506127c6565b8093505050505b919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806041835114156129315760008060006020860151925060408601519150606086015160001a905061292587828585612cd7565b9450945050505061296b565b604083511415612962576000806020850151915060408501519050612957868383612de4565b93509350505061296b565b60006002915091505b9250929050565b600060048111156129865761298561416f565b5b8160048111156129995761299861416f565b5b14156129a457612b44565b600160048111156129b8576129b761416f565b5b8160048111156129cb576129ca61416f565b5b1415612a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0390613a01565b60405180910390fd5b60026004811115612a2057612a1f61416f565b5b816004811115612a3357612a3261416f565b5b1415612a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6b90613a21565b60405180910390fd5b60036004811115612a8857612a8761416f565b5b816004811115612a9b57612a9a61416f565b5b1415612adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad390613b41565b60405180910390fd5b600480811115612aef57612aee61416f565b5b816004811115612b0257612b0161416f565b5b1415612b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3a90613c21565b60405180910390fd5b5b50565b6000612b688473ffffffffffffffffffffffffffffffffffffffff16612e32565b15612cca578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b8152600401612bac949392919061390a565b602060405180830381600087803b158015612bc657600080fd5b505af1925050508015612bf757506040513d601f19601f82011682018060405250810190612bf491906131cc565b60015b612c7a573d8060008114612c27576040519150601f19603f3d011682016040523d82523d6000602084013e612c2c565b606091505b50600081511415612c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6990613a41565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ccf565b600190505b949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612d12576000600391509150612ddb565b601b8560ff1614158015612d2a5750601c8560ff1614155b15612d3c576000600491509150612ddb565b600060018787878760405160008152602001604052604051612d61949392919061399a565b6020604051602081039080840390855afa158015612d83573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612dd257600060019250925050612ddb565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050612e2487828885612cd7565b935093505050935093915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000612e68612e6384613d41565b613d1c565b905082815260208101848484011115612e8457612e83614230565b5b612e8f848285613fba565b509392505050565b600081359050612ea681614939565b92915050565b600081519050612ebb81614939565b92915050565b600081359050612ed081614950565b92915050565b600081359050612ee581614967565b92915050565b600081359050612efa8161497e565b92915050565b600081519050612f0f8161497e565b92915050565b600082601f830112612f2a57612f2961422b565b5b8135612f3a848260208601612e55565b91505092915050565b600081519050612f5281614995565b92915050565b600081359050612f67816149ac565b92915050565b600081519050612f7c816149ac565b92915050565b600060208284031215612f9857612f9761423a565b5b6000612fa684828501612e97565b91505092915050565b600060208284031215612fc557612fc461423a565b5b6000612fd384828501612eac565b91505092915050565b600060208284031215612ff257612ff161423a565b5b600061300084828501612ec1565b91505092915050565b600080604083850312156130205761301f61423a565b5b600061302e85828601612e97565b925050602061303f85828601612e97565b9150509250929050565b6000806000606084860312156130625761306161423a565b5b600061307086828701612e97565b935050602061308186828701612e97565b925050604061309286828701612f58565b9150509250925092565b600080600080608085870312156130b6576130b561423a565b5b60006130c487828801612e97565b94505060206130d587828801612e97565b93505060406130e687828801612f58565b925050606085013567ffffffffffffffff81111561310757613106614235565b5b61311387828801612f15565b91505092959194509250565b600080604083850312156131365761313561423a565b5b600061314485828601612e97565b925050602061315585828601612ed6565b9150509250929050565b600080604083850312156131765761317561423a565b5b600061318485828601612e97565b925050602061319585828601612f58565b9150509250929050565b6000602082840312156131b5576131b461423a565b5b60006131c384828501612eeb565b91505092915050565b6000602082840312156131e2576131e161423a565b5b60006131f084828501612f00565b91505092915050565b60006020828403121561320f5761320e61423a565b5b600061321d84828501612f43565b91505092915050565b60006020828403121561323c5761323b61423a565b5b600061324a84828501612f58565b91505092915050565b6000602082840312156132695761326861423a565b5b600061327784828501612f6d565b91505092915050565b600080604083850312156132975761329661423a565b5b60006132a585828601612f58565b925050602083013567ffffffffffffffff8111156132c6576132c5614235565b5b6132d285828601612f15565b9150509250929050565b600080604083850312156132f3576132f261423a565b5b600061330185828601612f58565b925050602061331285828601612f58565b9150509250929050565b61332581613f84565b82525050565b61333481613ed5565b82525050565b61334b61334682613ed5565b6140a8565b82525050565b61335a81613ef9565b82525050565b61336981613f05565b82525050565b61338061337b82613f05565b6140ba565b82525050565b600061339182613d72565b61339b8185613d88565b93506133ab818560208601613fc9565b6133b48161423f565b840191505092915050565b60006133ca82613d7d565b6133d48185613da4565b93506133e4818560208601613fc9565b6133ed8161423f565b840191505092915050565b600061340382613d7d565b61340d8185613db5565b935061341d818560208601613fc9565b80840191505092915050565b6000613436601883613da4565b91506134418261425d565b602082019050919050565b6000613459601f83613da4565b915061346482614286565b602082019050919050565b600061347c601c83613db5565b9150613487826142af565b601c82019050919050565b600061349f603283613da4565b91506134aa826142d8565b604082019050919050565b60006134c2602683613da4565b91506134cd82614327565b604082019050919050565b60006134e5602583613da4565b91506134f082614376565b604082019050919050565b6000613508602683613da4565b9150613513826143c5565b604082019050919050565b600061352b602483613da4565b915061353682614414565b604082019050919050565b600061354e601983613da4565b915061355982614463565b602082019050919050565b6000613571602083613da4565b915061357c8261448c565b602082019050919050565b6000613594603a83613da4565b915061359f826144b5565b604082019050919050565b60006135b7602283613da4565b91506135c282614504565b604082019050919050565b60006135da601d83613da4565b91506135e582614553565b602082019050919050565b60006135fd602c83613da4565b91506136088261457c565b604082019050919050565b6000613620602b83613da4565b915061362b826145cb565b604082019050919050565b6000613643600e83613da4565b915061364e8261461a565b602082019050919050565b6000613666603883613da4565b915061367182614643565b604082019050919050565b6000613689602a83613da4565b915061369482614692565b604082019050919050565b60006136ac602283613da4565b91506136b7826146e1565b604082019050919050565b60006136cf602c83613da4565b91506136da82614730565b604082019050919050565b60006136f2601083613da4565b91506136fd8261477f565b602082019050919050565b6000613715600583613db5565b9150613720826147a8565b600582019050919050565b6000613738602083613da4565b9150613743826147d1565b602082019050919050565b600061375b602583613da4565b9150613766826147fa565b604082019050919050565b600061377e602183613da4565b915061378982614849565b604082019050919050565b60006137a1600083613d99565b91506137ac82614898565b600082019050919050565b60006137c4603183613da4565b91506137cf8261489b565b604082019050919050565b60006137e7603683613db5565b91506137f2826148ea565b603682019050919050565b61380681613f6d565b82525050565b61381d61381882613f6d565b6140d6565b82525050565b61382c81613f77565b82525050565b600061383e828561333a565b60148201915061384e828461380c565b6020820191508190509392505050565b60006138698261346f565b9150613875828461336f565b60208201915081905092915050565b600061388f82613794565b9150819050919050565b60006138a4826137da565b91506138b082846133f8565b91506138bb82613708565b915081905092915050565b60006020820190506138db600083018461332b565b92915050565b60006040820190506138f6600083018561331c565b61390360208301846137fd565b9392505050565b600060808201905061391f600083018761332b565b61392c602083018661332b565b61393960408301856137fd565b818103606083015261394b8184613386565b905095945050505050565b600060408201905061396b600083018561332b565b61397860208301846137fd565b9392505050565b60006020820190506139946000830184613351565b92915050565b60006080820190506139af6000830187613360565b6139bc6020830186613823565b6139c96040830185613360565b6139d66060830184613360565b95945050505050565b600060208201905081810360008301526139f981846133bf565b905092915050565b60006020820190508181036000830152613a1a81613429565b9050919050565b60006020820190508181036000830152613a3a8161344c565b9050919050565b60006020820190508181036000830152613a5a81613492565b9050919050565b60006020820190508181036000830152613a7a816134b5565b9050919050565b60006020820190508181036000830152613a9a816134d8565b9050919050565b60006020820190508181036000830152613aba816134fb565b9050919050565b60006020820190508181036000830152613ada8161351e565b9050919050565b60006020820190508181036000830152613afa81613541565b9050919050565b60006020820190508181036000830152613b1a81613564565b9050919050565b60006020820190508181036000830152613b3a81613587565b9050919050565b60006020820190508181036000830152613b5a816135aa565b9050919050565b60006020820190508181036000830152613b7a816135cd565b9050919050565b60006020820190508181036000830152613b9a816135f0565b9050919050565b60006020820190508181036000830152613bba81613613565b9050919050565b60006020820190508181036000830152613bda81613636565b9050919050565b60006020820190508181036000830152613bfa81613659565b9050919050565b60006020820190508181036000830152613c1a8161367c565b9050919050565b60006020820190508181036000830152613c3a8161369f565b9050919050565b60006020820190508181036000830152613c5a816136c2565b9050919050565b60006020820190508181036000830152613c7a816136e5565b9050919050565b60006020820190508181036000830152613c9a8161372b565b9050919050565b60006020820190508181036000830152613cba8161374e565b9050919050565b60006020820190508181036000830152613cda81613771565b9050919050565b60006020820190508181036000830152613cfa816137b7565b9050919050565b6000602082019050613d1660008301846137fd565b92915050565b6000613d26613d37565b9050613d32828261402e565b919050565b6000604051905090565b600067ffffffffffffffff821115613d5c57613d5b6141fc565b5b613d658261423f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613dcb82613f6d565b9150613dd683613f6d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e0b57613e0a614111565b5b828201905092915050565b6000613e2182613f6d565b9150613e2c83613f6d565b925082613e3c57613e3b614140565b5b828204905092915050565b6000613e5282613f6d565b9150613e5d83613f6d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e9657613e95614111565b5b828202905092915050565b6000613eac82613f6d565b9150613eb783613f6d565b925082821015613eca57613ec9614111565b5b828203905092915050565b6000613ee082613f4d565b9050919050565b6000613ef282613f4d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000613f4682613ed5565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613f8f82613f96565b9050919050565b6000613fa182613fa8565b9050919050565b6000613fb382613f4d565b9050919050565b82818337600083830152505050565b60005b83811015613fe7578082015181840152602081019050613fcc565b83811115613ff6576000848401525b50505050565b6000600282049050600182168061401457607f821691505b602082108114156140285761402761419e565b5b50919050565b6140378261423f565b810181811067ffffffffffffffff82111715614056576140556141fc565b5b80604052505050565b600061406a82613f6d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561409d5761409c614111565b5b600182019050919050565b60006140b3826140c4565b9050919050565b6000819050919050565b60006140cf82614250565b9050919050565b6000819050919050565b60006140eb82613f6d565b91506140f683613f6d565b92508261410657614105614140565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43616e6e6f74207265636f766572206166746572207472616e73666572203a28600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f446f65736e277420657869737421000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e74206e6f74207369676e65642100000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616e2774207472616e736665722061667465722061697264726f702069732060008201527f646f6e652e000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f697066733a2f2f516d536765466a4a576b556b47524d7647445a48476435325660008201527f5469314c38796a4d4d745161427858586143396e562f00000000000000000000602082015250565b61494281613ed5565b811461494d57600080fd5b50565b61495981613ee7565b811461496457600080fd5b50565b61497081613ef9565b811461497b57600080fd5b50565b61498781613f0f565b811461499257600080fd5b50565b61499e81613f3b565b81146149a957600080fd5b50565b6149b581613f6d565b81146149c057600080fd5b5056fe68747470733a2f2f6672656e6c79666c797a2e696f2f66662d636f6c6c656374696f6e2d6d657461646174612fa264697066735822122013f96229fd2e488f5fcc096a426b1a65748a53cd35752ef8ae068bae289b7d2f64736f6c63430008070033

Deployed Bytecode Sourcemap

47600:7707:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16109:38;16125:10;16137:9;16109:38;;;;;;;:::i;:::-;;;;;;;;47600:7707;;;;;29065:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30319:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31093:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30627:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29378:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17313:566;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55224:80;;;;;;;;;;;;;:::i;:::-;;51912:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16238:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52212:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53269:1436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49787:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28258:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54713:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52864:331;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3848:103;;;;;;;;;;;;;:::i;:::-;;28357:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17013:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3199:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30488:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16813:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28162:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31386:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52413:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49358:421;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16609:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54978:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16423:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48912:132;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50673:475;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4106:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29065:305;29167:4;29219:25;29204:40;;;:11;:40;;;;:105;;;;29276:33;29261:48;;;:11;:48;;;;29204:105;:158;;;;29326:36;29350:11;29326:23;:36::i;:::-;29204:158;29184:178;;29065:305;;;:::o;30319:100::-;30373:13;30406:5;30399:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30319:100;:::o;31093:221::-;31169:7;31197:16;31205:7;31197;:16::i;:::-;31189:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31282:15;:24;31298:7;31282:24;;;;;;;;;;;;;;;;;;;;;31275:31;;31093:221;;;:::o;30627:400::-;30708:13;30724:16;30732:7;30724;:16::i;:::-;30708:32;;30765:5;30759:11;;:2;:11;;;;30751:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30857:5;30843:19;;:10;:19;;;:58;;;;30866:35;30883:5;30890:10;30866:16;:35::i;:::-;30843:58;30821:164;;;;;;;;;;;;:::i;:::-;;;;;;;;;30998:21;31007:2;31011:7;30998:8;:21::i;:::-;30697:330;30627:400;;:::o;29378:90::-;29422:7;29449:11;;29442:18;;29378:90;:::o;17313:566::-;17408:1;17389:7;:16;17397:7;17389:16;;;;;;;;;;;;;;;;:20;17381:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;17465:21;17513:15;:13;:15::i;:::-;17489:21;:39;;;;:::i;:::-;17465:63;;17539:15;17557:58;17573:7;17582:13;17597:17;17606:7;17597:8;:17::i;:::-;17557:15;:58::i;:::-;17539:76;;17647:1;17636:7;:12;;17628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17731:7;17709:9;:18;17719:7;17709:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;17767:7;17749:14;;:25;;;;;;;:::i;:::-;;;;;;;;17787:35;17805:7;17814;17787:17;:35::i;:::-;17838:33;17854:7;17863;17838:33;;;;;;;:::i;:::-;;;;;;;;17370:509;;17313:566;:::o;55224:80::-;3430:10;3419:21;;:7;:5;:7::i;:::-;:21;;;3411:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55292:4:::1;55277:12;;:19;;;;;;;;;;;;;;;;;;55224:80::o:0;51912:292::-;52062:39;52081:10;52093:7;52062:18;:39::i;:::-;52054:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;52168:28;52178:4;52184:2;52188:7;52168:9;:28::i;:::-;51912:292;;;:::o;16238:91::-;16282:7;16309:12;;16302:19;;16238:91;:::o;52212:193::-;52358:39;52375:4;52381:2;52385:7;52358:39;;;;;;;;;;;;:16;:39::i;:::-;52212:193;;;:::o;53269:1436::-;53788:1;53762:28;;:7;:14;53770:5;53762:14;;;;;;;;;;;;;;;;;;;;;:28;;;53754:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53840:12;53980:10;53992:5;53963:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53953:46;;;;;;53865:149;;;;;;;;:::i;:::-;;;;;;;;;;;;;53855:160;;;;;;53840:175;;54123:42;54096:69;;:23;54109:9;54096:4;:12;;:23;;;;:::i;:::-;:69;;;54074:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;54253:1;54228:9;:21;54238:10;54228:21;;;;;;;;;;;;;;;;:26;54224:434;;;54293:10;54275:28;;:14;54283:5;54275:7;:14::i;:::-;:28;;;54271:376;;;54430:5;;;;;;;;;;;:15;;;54446:10;54430:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54406:9;:21;54416:10;54406:21;;;;;;;;;;;;;;;:51;;;;54271:376;;;54630:1;54600:5;;;;;;;;;;;:15;;;54616:10;54600:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;;;;:::i;:::-;54576:9;:21;54586:10;54576:21;;;;;;;;;;;;;;;:55;;;;54271:376;54224:434;54687:10;54670:7;:14;54678:5;54670:14;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;53339:1366;53269:1436;;:::o;49787:474::-;49867:7;50028;50024:1;:11;:29;;;;;50049:4;50039:7;:14;50024:29;50016:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;50085:13;50101:7;:16;50109:7;50101:16;;;;;;;;;;;;;;;;;;;;;50085:32;;50149:1;50132:19;;:5;:19;;;50128:126;;50175:5;50168:12;;;;;50128:126;50220:5;;;;;;;;;;;:13;;;50234:7;50220:22;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50213:29;;;49787:474;;;;:::o;28258:44::-;;;;;;;;;;;;;;;;;:::o;54713:203::-;3430:10;3419:21;;:7;:5;:7::i;:::-;:21;;;3411:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54786:9:::1;54815:5;54811:9;;54806:103;54826:3;54822:1;:7;54806:103;;;54895:1;54877:5;;;;;;;;;;;:13;;;54891:1;54877:16;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54856:41;;54873:1;54856:41;;;;;;;;;;;;54831:3;;;;;:::i;:::-;;;;54806:103;;;54775:141;54713:203:::0;;:::o;52864:331::-;52944:7;52989:1;52972:19;;:5;:19;;;;52964:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;53073:1;53053:9;:16;53063:5;53053:16;;;;;;;;;;;;;;;;:21;53049:139;;;53098:5;;;;;;;;;;;:15;;;53114:5;53098:22;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53091:29;;;;53049:139;53160:9;:16;53170:5;53160:16;;;;;;;;;;;;;;;;53153:23;;52864:331;;;;:::o;3848:103::-;3430:10;3419:21;;:7;:5;:7::i;:::-;:21;;;3411:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;3913:30:::1;3940:1;3913:18;:30::i;:::-;3848:103::o:0;28357:42::-;;;;;;;;;;;;;;;;;:::o;17013:100::-;17064:7;17091;17099:5;17091:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17084:21;;17013:100;;;:::o;3199:87::-;3245:7;3272:6;;;;;;;;;;;3265:13;;3199:87;:::o;30488:104::-;30544:13;30577:7;30570:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30488:104;:::o;16813:109::-;16869:7;16896:9;:18;16906:7;16896:18;;;;;;;;;;;;;;;;16889:25;;16813:109;;;:::o;28162:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;31386:153::-;31481:50;31500:10;31512:8;31522;31481:18;:50::i;:::-;31386:153;;:::o;52413:334::-;52596:39;52615:10;52627:7;52596:18;:39::i;:::-;52588:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;52700:39;52714:4;52720:2;52724:7;52733:5;52700:13;:39::i;:::-;52413:334;;;;:::o;49358:421::-;49431:13;49598:7;49594:1;:11;:29;;;;;49619:4;49609:7;:14;49594:29;49586:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49742:18;:7;:16;:18::i;:::-;49667:103;;;;;;;;:::i;:::-;;;;;;;;;;;;;49653:118;;49358:421;;;:::o;16609:105::-;16663:7;16690;:16;16698:7;16690:16;;;;;;;;;;;;;;;;16683:23;;16609:105;;;:::o;54978:238::-;3430:10;3419:21;;:7;:5;:7::i;:::-;:21;;;3411:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55115:12:::1;;;;;;;;;;;55114:13;55106:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55180:28;55190:4;55196:2;55200:7;55180:9;:28::i;:::-;54978:238:::0;;;:::o;16423:95::-;16469:7;16496:14;;16489:21;;16423:95;:::o;48912:132::-;48956:13;48982:54;;;;;;;;;;;;;;;;;;;48912:132;:::o;50673:475::-;50831:4;50916:27;50960:8;;;;;;;;;;;50916:53;;51025:8;50984:49;;50992:13;:21;;;51014:5;50992:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50984:49;;;50980:93;;;51057:4;51050:11;;;;;50980:93;51100:40;51124:5;51131:8;51100:23;:40::i;:::-;51093:47;;;50673:475;;;;;:::o;4106:201::-;3430:10;3419:21;;:7;:5;:7::i;:::-;:21;;;3411:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;4215:1:::1;4195:22;;:8;:22;;;;4187:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4271:28;4290:8;4271:18;:28::i;:::-;4106:201:::0;:::o;21665:157::-;21750:4;21789:25;21774:40;;;:11;:40;;;;21767:47;;21665:157;;;:::o;31782:126::-;31847:4;31875:7;31871:1;:11;:29;;;;;31896:4;31886:7;:14;31871:29;31864:36;;31782:126;;;:::o;32385:167::-;32487:2;32460:15;:24;32476:7;32460:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32536:7;32532:2;32505:39;;32514:16;32522:7;32514;:16::i;:::-;32505:39;;;;;;;;;;;;32385:167;;:::o;18057:248::-;18203:7;18282:15;18267:12;;18247:7;:16;18255:7;18247:16;;;;;;;;;;;;;;;;18231:13;:32;;;;:::i;:::-;18230:49;;;;:::i;:::-;:67;;;;:::i;:::-;18223:74;;18057:248;;;;;:::o;7114:317::-;7229:6;7204:21;:31;;7196:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7283:12;7301:9;:14;;7323:6;7301:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7282:52;;;7353:7;7345:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;7185:246;7114:317;;:::o;50269:371::-;50379:4;50408:7;50404:1;:11;:29;;;;;50429:4;50419:7;:14;50404:29;50396:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;50493:13;50509:16;50517:7;50509;:16::i;:::-;50493:32;;50555:5;50544:16;;:7;:16;;;:51;;;;50588:7;50564:31;;:20;50576:7;50564:11;:20::i;:::-;:31;;;50544:51;:87;;;;50599:32;50616:5;50623:7;50599:16;:32::i;:::-;50544:87;50536:96;;;50269:371;;;;:::o;51156:748::-;51326:4;51306:24;;:16;51314:7;51306;:16::i;:::-;:24;;;51298:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51405:1;51391:16;;:2;:16;;;;51383:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51595:1;51576:9;:15;51586:4;51576:15;;;;;;;;;;;;;;;;:20;51572:92;;;51631:5;;;;;;;;;;;:15;;;51647:4;51631:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51613:9;:15;51623:4;51613:15;;;;;;;;;;;;;;;:39;;;;51572:92;51728:29;51745:1;51749:7;51728:8;:29::i;:::-;51789:1;51770:9;:15;51780:4;51770:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;51818:1;51801:9;:13;51811:2;51801:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;51849:2;51830:7;:16;51838:7;51830:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51888:7;51884:2;51869:27;;51878:4;51869:27;;;;;;;;;;;;51156:748;;;:::o;42726:231::-;42804:7;42825:17;42844:18;42866:27;42877:4;42883:9;42866:10;:27::i;:::-;42824:69;;;;42904:18;42916:5;42904:11;:18::i;:::-;42940:9;42933:16;;;;42726:231;;;;:::o;4467:191::-;4541:16;4560:6;;;;;;;;;;;4541:25;;4586:8;4577:6;;:17;;;;;;;;;;;;;;;;;;4641:8;4610:40;;4631:8;4610:40;;;;;;;;;;;;4530:128;4467:191;:::o;32694:315::-;32849:8;32840:17;;:5;:17;;;;32832:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32936:8;32898:18;:25;32917:5;32898:25;;;;;;;;;;;;;;;:35;32924:8;32898:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32982:8;32960:41;;32975:5;32960:41;;;32992:8;32960:41;;;;;;:::i;:::-;;;;;;;;32694:315;;;:::o;36175:::-;36332:28;36342:4;36348:2;36352:7;36332:9;:28::i;:::-;36379:48;36402:4;36408:2;36412:7;36421:5;36379:22;:48::i;:::-;36371:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;36175:315;;;;:::o;335:723::-;391:13;621:1;612:5;:10;608:53;;;639:10;;;;;;;;;;;;;;;;;;;;;608:53;671:12;686:5;671:20;;702:14;727:78;742:1;734:4;:9;727:78;;760:8;;;;;:::i;:::-;;;;791:2;783:10;;;;;:::i;:::-;;;727:78;;;815:19;847:6;837:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;815:39;;865:154;881:1;872:5;:10;865:154;;909:1;899:11;;;;;:::i;:::-;;;976:2;968:5;:10;;;;:::i;:::-;955:2;:24;;;;:::i;:::-;942:39;;925:6;932;925:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1005:2;996:11;;;;;:::i;:::-;;;865:154;;;1043:6;1029:21;;;;;335:723;;;;:::o;31610:164::-;31707:4;31731:18;:25;31750:5;31731:25;;;;;;;;;;;;;;;:35;31757:8;31731:35;;;;;;;;;;;;;;;;;;;;;;;;;31724:42;;31610:164;;;;:::o;40616:1308::-;40697:7;40706:12;40951:2;40931:9;:16;:22;40927:990;;;40970:9;40994;41018:7;41227:4;41216:9;41212:20;41206:27;41201:32;;41277:4;41266:9;41262:20;41256:27;41251:32;;41335:4;41324:9;41320:20;41314:27;41311:1;41306:36;41301:41;;41378:25;41389:4;41395:1;41398;41401;41378:10;:25::i;:::-;41371:32;;;;;;;;;40927:990;41445:2;41425:9;:16;:22;41421:496;;;41464:9;41488:10;41700:4;41689:9;41685:20;41679:27;41674:32;;41751:4;41740:9;41736:20;41730:27;41724:33;;41793:23;41804:4;41810:1;41813:2;41793:10;:23::i;:::-;41786:30;;;;;;;;41421:496;41865:1;41869:35;41849:56;;;;40616:1308;;;;;;:::o;38887:643::-;38965:20;38956:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;38952:571;;;39002:7;;38952:571;39063:29;39054:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;39050:473;;;39109:34;;;;;;;;;;:::i;:::-;;;;;;;;39050:473;39174:35;39165:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;39161:362;;;39226:41;;;;;;;;;;:::i;:::-;;;;;;;;39161:362;39298:30;39289:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;39285:238;;;39345:44;;;;;;;;;;:::i;:::-;;;;;;;;39285:238;39420:30;39411:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;39407:116;;;39467:44;;;;;;;;;;:::i;:::-;;;;;;;;39407:116;38887:643;;:::o;37630:797::-;37785:4;37806:15;:2;:13;;;:15::i;:::-;37802:618;;;37858:2;37842:36;;;37879:10;37891:4;37897:7;37906:5;37842:70;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37838:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38099:1;38082:6;:13;:18;38078:272;;;38125:60;;;;;;;;;;:::i;:::-;;;;;;;;38078:272;38300:6;38294:13;38285:6;38281:2;38277:15;38270:38;37838:527;37973:41;;;37963:51;;;:6;:51;;;;37956:58;;;;;37802:618;38404:4;38397:11;;37630:797;;;;;;;:::o;44225:1632::-;44356:7;44365:12;45290:66;45285:1;45277:10;;:79;45273:163;;;45389:1;45393:30;45373:51;;;;;;45273:163;45455:2;45450:1;:7;;;;:18;;;;;45466:2;45461:1;:7;;;;45450:18;45446:102;;;45501:1;45505:30;45485:51;;;;;;45446:102;45645:14;45662:24;45672:4;45678:1;45681;45684;45662:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45645:41;;45719:1;45701:20;;:6;:20;;;45697:103;;;45754:1;45758:29;45738:50;;;;;;;45697:103;45820:6;45828:20;45812:37;;;;;44225:1632;;;;;;;;:::o;43220:391::-;43334:7;43343:12;43368:9;43388:7;43443:66;43439:2;43435:75;43430:80;;43547:2;43542;43537:3;43533:12;43529:21;43524:26;;43578:25;43589:4;43595:1;43598;43601;43578:10;:25::i;:::-;43571:32;;;;;;43220:391;;;;;;:::o;5853:326::-;5913:4;6170:1;6148:7;:19;;;:23;6141:30;;5853:326;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:143::-;625:5;656:6;650:13;641:22;;672:33;699:5;672:33;:::i;:::-;568:143;;;;:::o;717:155::-;771:5;809:6;796:20;787:29;;825:41;860:5;825:41;:::i;:::-;717:155;;;;:::o;878:133::-;921:5;959:6;946:20;937:29;;975:30;999:5;975:30;:::i;:::-;878:133;;;;:::o;1017:137::-;1062:5;1100:6;1087:20;1078:29;;1116:32;1142:5;1116:32;:::i;:::-;1017:137;;;;:::o;1160:141::-;1216:5;1247:6;1241:13;1232:22;;1263:32;1289:5;1263:32;:::i;:::-;1160:141;;;;:::o;1320:338::-;1375:5;1424:3;1417:4;1409:6;1405:17;1401:27;1391:122;;1432:79;;:::i;:::-;1391:122;1549:6;1536:20;1574:78;1648:3;1640:6;1633:4;1625:6;1621:17;1574:78;:::i;:::-;1565:87;;1381:277;1320:338;;;;:::o;1664:201::-;1750:5;1781:6;1775:13;1766:22;;1797:62;1853:5;1797:62;:::i;:::-;1664:201;;;;:::o;1871:139::-;1917:5;1955:6;1942:20;1933:29;;1971:33;1998:5;1971:33;:::i;:::-;1871:139;;;;:::o;2016:143::-;2073:5;2104:6;2098:13;2089:22;;2120:33;2147:5;2120:33;:::i;:::-;2016:143;;;;:::o;2165:329::-;2224:6;2273:2;2261:9;2252:7;2248:23;2244:32;2241:119;;;2279:79;;:::i;:::-;2241:119;2399:1;2424:53;2469:7;2460:6;2449:9;2445:22;2424:53;:::i;:::-;2414:63;;2370:117;2165:329;;;;:::o;2500:351::-;2570:6;2619:2;2607:9;2598:7;2594:23;2590:32;2587:119;;;2625:79;;:::i;:::-;2587:119;2745:1;2770:64;2826:7;2817:6;2806:9;2802:22;2770:64;:::i;:::-;2760:74;;2716:128;2500:351;;;;:::o;2857:345::-;2924:6;2973:2;2961:9;2952:7;2948:23;2944:32;2941:119;;;2979:79;;:::i;:::-;2941:119;3099:1;3124:61;3177:7;3168:6;3157:9;3153:22;3124:61;:::i;:::-;3114:71;;3070:125;2857:345;;;;:::o;3208:474::-;3276:6;3284;3333:2;3321:9;3312:7;3308:23;3304:32;3301:119;;;3339:79;;:::i;:::-;3301:119;3459:1;3484:53;3529:7;3520:6;3509:9;3505:22;3484:53;:::i;:::-;3474:63;;3430:117;3586:2;3612:53;3657:7;3648:6;3637:9;3633:22;3612:53;:::i;:::-;3602:63;;3557:118;3208:474;;;;;:::o;3688:619::-;3765:6;3773;3781;3830:2;3818:9;3809:7;3805:23;3801:32;3798:119;;;3836:79;;:::i;:::-;3798:119;3956:1;3981:53;4026:7;4017:6;4006:9;4002:22;3981:53;:::i;:::-;3971:63;;3927:117;4083:2;4109:53;4154:7;4145:6;4134:9;4130:22;4109:53;:::i;:::-;4099:63;;4054:118;4211:2;4237:53;4282:7;4273:6;4262:9;4258:22;4237:53;:::i;:::-;4227:63;;4182:118;3688:619;;;;;:::o;4313:943::-;4408:6;4416;4424;4432;4481:3;4469:9;4460:7;4456:23;4452:33;4449:120;;;4488:79;;:::i;:::-;4449:120;4608:1;4633:53;4678:7;4669:6;4658:9;4654:22;4633:53;:::i;:::-;4623:63;;4579:117;4735:2;4761:53;4806:7;4797:6;4786:9;4782:22;4761:53;:::i;:::-;4751:63;;4706:118;4863:2;4889:53;4934:7;4925:6;4914:9;4910:22;4889:53;:::i;:::-;4879:63;;4834:118;5019:2;5008:9;5004:18;4991:32;5050:18;5042:6;5039:30;5036:117;;;5072:79;;:::i;:::-;5036:117;5177:62;5231:7;5222:6;5211:9;5207:22;5177:62;:::i;:::-;5167:72;;4962:287;4313:943;;;;;;;:::o;5262:468::-;5327:6;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:50;5705:7;5696:6;5685:9;5681:22;5663:50;:::i;:::-;5653:60;;5608:115;5262:468;;;;;:::o;5736:474::-;5804:6;5812;5861:2;5849:9;5840:7;5836:23;5832:32;5829:119;;;5867:79;;:::i;:::-;5829:119;5987:1;6012:53;6057:7;6048:6;6037:9;6033:22;6012:53;:::i;:::-;6002:63;;5958:117;6114:2;6140:53;6185:7;6176:6;6165:9;6161:22;6140:53;:::i;:::-;6130:63;;6085:118;5736:474;;;;;:::o;6216:327::-;6274:6;6323:2;6311:9;6302:7;6298:23;6294:32;6291:119;;;6329:79;;:::i;:::-;6291:119;6449:1;6474:52;6518:7;6509:6;6498:9;6494:22;6474:52;:::i;:::-;6464:62;;6420:116;6216:327;;;;:::o;6549:349::-;6618:6;6667:2;6655:9;6646:7;6642:23;6638:32;6635:119;;;6673:79;;:::i;:::-;6635:119;6793:1;6818:63;6873:7;6864:6;6853:9;6849:22;6818:63;:::i;:::-;6808:73;;6764:127;6549:349;;;;:::o;6904:409::-;7003:6;7052:2;7040:9;7031:7;7027:23;7023:32;7020:119;;;7058:79;;:::i;:::-;7020:119;7178:1;7203:93;7288:7;7279:6;7268:9;7264:22;7203:93;:::i;:::-;7193:103;;7149:157;6904:409;;;;:::o;7319:329::-;7378:6;7427:2;7415:9;7406:7;7402:23;7398:32;7395:119;;;7433:79;;:::i;:::-;7395:119;7553:1;7578:53;7623:7;7614:6;7603:9;7599:22;7578:53;:::i;:::-;7568:63;;7524:117;7319:329;;;;:::o;7654:351::-;7724:6;7773:2;7761:9;7752:7;7748:23;7744:32;7741:119;;;7779:79;;:::i;:::-;7741:119;7899:1;7924:64;7980:7;7971:6;7960:9;7956:22;7924:64;:::i;:::-;7914:74;;7870:128;7654:351;;;;:::o;8011:652::-;8088:6;8096;8145:2;8133:9;8124:7;8120:23;8116:32;8113:119;;;8151:79;;:::i;:::-;8113:119;8271:1;8296:53;8341:7;8332:6;8321:9;8317:22;8296:53;:::i;:::-;8286:63;;8242:117;8426:2;8415:9;8411:18;8398:32;8457:18;8449:6;8446:30;8443:117;;;8479:79;;:::i;:::-;8443:117;8584:62;8638:7;8629:6;8618:9;8614:22;8584:62;:::i;:::-;8574:72;;8369:287;8011:652;;;;;:::o;8669:474::-;8737:6;8745;8794:2;8782:9;8773:7;8769:23;8765:32;8762:119;;;8800:79;;:::i;:::-;8762:119;8920:1;8945:53;8990:7;8981:6;8970:9;8966:22;8945:53;:::i;:::-;8935:63;;8891:117;9047:2;9073:53;9118:7;9109:6;9098:9;9094:22;9073:53;:::i;:::-;9063:63;;9018:118;8669:474;;;;;:::o;9149:147::-;9244:45;9283:5;9244:45;:::i;:::-;9239:3;9232:58;9149:147;;:::o;9302:118::-;9389:24;9407:5;9389:24;:::i;:::-;9384:3;9377:37;9302:118;;:::o;9426:157::-;9531:45;9551:24;9569:5;9551:24;:::i;:::-;9531:45;:::i;:::-;9526:3;9519:58;9426:157;;:::o;9589:109::-;9670:21;9685:5;9670:21;:::i;:::-;9665:3;9658:34;9589:109;;:::o;9704:118::-;9791:24;9809:5;9791:24;:::i;:::-;9786:3;9779:37;9704:118;;:::o;9828:157::-;9933:45;9953:24;9971:5;9953:24;:::i;:::-;9933:45;:::i;:::-;9928:3;9921:58;9828:157;;:::o;9991:360::-;10077:3;10105:38;10137:5;10105:38;:::i;:::-;10159:70;10222:6;10217:3;10159:70;:::i;:::-;10152:77;;10238:52;10283:6;10278:3;10271:4;10264:5;10260:16;10238:52;:::i;:::-;10315:29;10337:6;10315:29;:::i;:::-;10310:3;10306:39;10299:46;;10081:270;9991:360;;;;:::o;10357:364::-;10445:3;10473:39;10506:5;10473:39;:::i;:::-;10528:71;10592:6;10587:3;10528:71;:::i;:::-;10521:78;;10608:52;10653:6;10648:3;10641:4;10634:5;10630:16;10608:52;:::i;:::-;10685:29;10707:6;10685:29;:::i;:::-;10680:3;10676:39;10669:46;;10449:272;10357:364;;;;:::o;10727:377::-;10833:3;10861:39;10894:5;10861:39;:::i;:::-;10916:89;10998:6;10993:3;10916:89;:::i;:::-;10909:96;;11014:52;11059:6;11054:3;11047:4;11040:5;11036:16;11014:52;:::i;:::-;11091:6;11086:3;11082:16;11075:23;;10837:267;10727:377;;;;:::o;11110:366::-;11252:3;11273:67;11337:2;11332:3;11273:67;:::i;:::-;11266:74;;11349:93;11438:3;11349:93;:::i;:::-;11467:2;11462:3;11458:12;11451:19;;11110:366;;;:::o;11482:::-;11624:3;11645:67;11709:2;11704:3;11645:67;:::i;:::-;11638:74;;11721:93;11810:3;11721:93;:::i;:::-;11839:2;11834:3;11830:12;11823:19;;11482:366;;;:::o;11854:402::-;12014:3;12035:85;12117:2;12112:3;12035:85;:::i;:::-;12028:92;;12129:93;12218:3;12129:93;:::i;:::-;12247:2;12242:3;12238:12;12231:19;;11854:402;;;:::o;12262:366::-;12404:3;12425:67;12489:2;12484:3;12425:67;:::i;:::-;12418:74;;12501:93;12590:3;12501:93;:::i;:::-;12619:2;12614:3;12610:12;12603:19;;12262:366;;;:::o;12634:::-;12776:3;12797:67;12861:2;12856:3;12797:67;:::i;:::-;12790:74;;12873:93;12962:3;12873:93;:::i;:::-;12991:2;12986:3;12982:12;12975:19;;12634:366;;;:::o;13006:::-;13148:3;13169:67;13233:2;13228:3;13169:67;:::i;:::-;13162:74;;13245:93;13334:3;13245:93;:::i;:::-;13363:2;13358:3;13354:12;13347:19;;13006:366;;;:::o;13378:::-;13520:3;13541:67;13605:2;13600:3;13541:67;:::i;:::-;13534:74;;13617:93;13706:3;13617:93;:::i;:::-;13735:2;13730:3;13726:12;13719:19;;13378:366;;;:::o;13750:::-;13892:3;13913:67;13977:2;13972:3;13913:67;:::i;:::-;13906:74;;13989:93;14078:3;13989:93;:::i;:::-;14107:2;14102:3;14098:12;14091:19;;13750:366;;;:::o;14122:::-;14264:3;14285:67;14349:2;14344:3;14285:67;:::i;:::-;14278:74;;14361:93;14450:3;14361:93;:::i;:::-;14479:2;14474:3;14470:12;14463:19;;14122:366;;;:::o;14494:::-;14636:3;14657:67;14721:2;14716:3;14657:67;:::i;:::-;14650:74;;14733:93;14822:3;14733:93;:::i;:::-;14851:2;14846:3;14842:12;14835:19;;14494:366;;;:::o;14866:::-;15008:3;15029:67;15093:2;15088:3;15029:67;:::i;:::-;15022:74;;15105:93;15194:3;15105:93;:::i;:::-;15223:2;15218:3;15214:12;15207:19;;14866:366;;;:::o;15238:::-;15380:3;15401:67;15465:2;15460:3;15401:67;:::i;:::-;15394:74;;15477:93;15566:3;15477:93;:::i;:::-;15595:2;15590:3;15586:12;15579:19;;15238:366;;;:::o;15610:::-;15752:3;15773:67;15837:2;15832:3;15773:67;:::i;:::-;15766:74;;15849:93;15938:3;15849:93;:::i;:::-;15967:2;15962:3;15958:12;15951:19;;15610:366;;;:::o;15982:::-;16124:3;16145:67;16209:2;16204:3;16145:67;:::i;:::-;16138:74;;16221:93;16310:3;16221:93;:::i;:::-;16339:2;16334:3;16330:12;16323:19;;15982:366;;;:::o;16354:::-;16496:3;16517:67;16581:2;16576:3;16517:67;:::i;:::-;16510:74;;16593:93;16682:3;16593:93;:::i;:::-;16711:2;16706:3;16702:12;16695:19;;16354:366;;;:::o;16726:::-;16868:3;16889:67;16953:2;16948:3;16889:67;:::i;:::-;16882:74;;16965:93;17054:3;16965:93;:::i;:::-;17083:2;17078:3;17074:12;17067:19;;16726:366;;;:::o;17098:::-;17240:3;17261:67;17325:2;17320:3;17261:67;:::i;:::-;17254:74;;17337:93;17426:3;17337:93;:::i;:::-;17455:2;17450:3;17446:12;17439:19;;17098:366;;;:::o;17470:::-;17612:3;17633:67;17697:2;17692:3;17633:67;:::i;:::-;17626:74;;17709:93;17798:3;17709:93;:::i;:::-;17827:2;17822:3;17818:12;17811:19;;17470:366;;;:::o;17842:::-;17984:3;18005:67;18069:2;18064:3;18005:67;:::i;:::-;17998:74;;18081:93;18170:3;18081:93;:::i;:::-;18199:2;18194:3;18190:12;18183:19;;17842:366;;;:::o;18214:::-;18356:3;18377:67;18441:2;18436:3;18377:67;:::i;:::-;18370:74;;18453:93;18542:3;18453:93;:::i;:::-;18571:2;18566:3;18562:12;18555:19;;18214:366;;;:::o;18586:::-;18728:3;18749:67;18813:2;18808:3;18749:67;:::i;:::-;18742:74;;18825:93;18914:3;18825:93;:::i;:::-;18943:2;18938:3;18934:12;18927:19;;18586:366;;;:::o;18958:400::-;19118:3;19139:84;19221:1;19216:3;19139:84;:::i;:::-;19132:91;;19232:93;19321:3;19232:93;:::i;:::-;19350:1;19345:3;19341:11;19334:18;;18958:400;;;:::o;19364:366::-;19506:3;19527:67;19591:2;19586:3;19527:67;:::i;:::-;19520:74;;19603:93;19692:3;19603:93;:::i;:::-;19721:2;19716:3;19712:12;19705:19;;19364:366;;;:::o;19736:::-;19878:3;19899:67;19963:2;19958:3;19899:67;:::i;:::-;19892:74;;19975:93;20064:3;19975:93;:::i;:::-;20093:2;20088:3;20084:12;20077:19;;19736:366;;;:::o;20108:::-;20250:3;20271:67;20335:2;20330:3;20271:67;:::i;:::-;20264:74;;20347:93;20436:3;20347:93;:::i;:::-;20465:2;20460:3;20456:12;20449:19;;20108:366;;;:::o;20480:398::-;20639:3;20660:83;20741:1;20736:3;20660:83;:::i;:::-;20653:90;;20752:93;20841:3;20752:93;:::i;:::-;20870:1;20865:3;20861:11;20854:18;;20480:398;;;:::o;20884:366::-;21026:3;21047:67;21111:2;21106:3;21047:67;:::i;:::-;21040:74;;21123:93;21212:3;21123:93;:::i;:::-;21241:2;21236:3;21232:12;21225:19;;20884:366;;;:::o;21256:402::-;21416:3;21437:85;21519:2;21514:3;21437:85;:::i;:::-;21430:92;;21531:93;21620:3;21531:93;:::i;:::-;21649:2;21644:3;21640:12;21633:19;;21256:402;;;:::o;21664:118::-;21751:24;21769:5;21751:24;:::i;:::-;21746:3;21739:37;21664:118;;:::o;21788:157::-;21893:45;21913:24;21931:5;21913:24;:::i;:::-;21893:45;:::i;:::-;21888:3;21881:58;21788:157;;:::o;21951:112::-;22034:22;22050:5;22034:22;:::i;:::-;22029:3;22022:35;21951:112;;:::o;22069:397::-;22209:3;22224:75;22295:3;22286:6;22224:75;:::i;:::-;22324:2;22319:3;22315:12;22308:19;;22337:75;22408:3;22399:6;22337:75;:::i;:::-;22437:2;22432:3;22428:12;22421:19;;22457:3;22450:10;;22069:397;;;;;:::o;22472:522::-;22685:3;22707:148;22851:3;22707:148;:::i;:::-;22700:155;;22865:75;22936:3;22927:6;22865:75;:::i;:::-;22965:2;22960:3;22956:12;22949:19;;22985:3;22978:10;;22472:522;;;;:::o;23000:379::-;23184:3;23206:147;23349:3;23206:147;:::i;:::-;23199:154;;23370:3;23363:10;;23000:379;;;:::o;23385:807::-;23719:3;23741:148;23885:3;23741:148;:::i;:::-;23734:155;;23906:95;23997:3;23988:6;23906:95;:::i;:::-;23899:102;;24018:148;24162:3;24018:148;:::i;:::-;24011:155;;24183:3;24176:10;;23385:807;;;;:::o;24198:222::-;24291:4;24329:2;24318:9;24314:18;24306:26;;24342:71;24410:1;24399:9;24395:17;24386:6;24342:71;:::i;:::-;24198:222;;;;:::o;24426:348::-;24555:4;24593:2;24582:9;24578:18;24570:26;;24606:79;24682:1;24671:9;24667:17;24658:6;24606:79;:::i;:::-;24695:72;24763:2;24752:9;24748:18;24739:6;24695:72;:::i;:::-;24426:348;;;;;:::o;24780:640::-;24975:4;25013:3;25002:9;24998:19;24990:27;;25027:71;25095:1;25084:9;25080:17;25071:6;25027:71;:::i;:::-;25108:72;25176:2;25165:9;25161:18;25152:6;25108:72;:::i;:::-;25190;25258:2;25247:9;25243:18;25234:6;25190:72;:::i;:::-;25309:9;25303:4;25299:20;25294:2;25283:9;25279:18;25272:48;25337:76;25408:4;25399:6;25337:76;:::i;:::-;25329:84;;24780:640;;;;;;;:::o;25426:332::-;25547:4;25585:2;25574:9;25570:18;25562:26;;25598:71;25666:1;25655:9;25651:17;25642:6;25598:71;:::i;:::-;25679:72;25747:2;25736:9;25732:18;25723:6;25679:72;:::i;:::-;25426:332;;;;;:::o;25764:210::-;25851:4;25889:2;25878:9;25874:18;25866:26;;25902:65;25964:1;25953:9;25949:17;25940:6;25902:65;:::i;:::-;25764:210;;;;:::o;25980:545::-;26153:4;26191:3;26180:9;26176:19;26168:27;;26205:71;26273:1;26262:9;26258:17;26249:6;26205:71;:::i;:::-;26286:68;26350:2;26339:9;26335:18;26326:6;26286:68;:::i;:::-;26364:72;26432:2;26421:9;26417:18;26408:6;26364:72;:::i;:::-;26446;26514:2;26503:9;26499:18;26490:6;26446:72;:::i;:::-;25980:545;;;;;;;:::o;26531:313::-;26644:4;26682:2;26671:9;26667:18;26659:26;;26731:9;26725:4;26721:20;26717:1;26706:9;26702:17;26695:47;26759:78;26832:4;26823:6;26759:78;:::i;:::-;26751:86;;26531:313;;;;:::o;26850:419::-;27016:4;27054:2;27043:9;27039:18;27031:26;;27103:9;27097:4;27093:20;27089:1;27078:9;27074:17;27067:47;27131:131;27257:4;27131:131;:::i;:::-;27123:139;;26850:419;;;:::o;27275:::-;27441:4;27479:2;27468:9;27464:18;27456:26;;27528:9;27522:4;27518:20;27514:1;27503:9;27499:17;27492:47;27556:131;27682:4;27556:131;:::i;:::-;27548:139;;27275:419;;;:::o;27700:::-;27866:4;27904:2;27893:9;27889:18;27881:26;;27953:9;27947:4;27943:20;27939:1;27928:9;27924:17;27917:47;27981:131;28107:4;27981:131;:::i;:::-;27973:139;;27700:419;;;:::o;28125:::-;28291:4;28329:2;28318:9;28314:18;28306:26;;28378:9;28372:4;28368:20;28364:1;28353:9;28349:17;28342:47;28406:131;28532:4;28406:131;:::i;:::-;28398:139;;28125:419;;;:::o;28550:::-;28716:4;28754:2;28743:9;28739:18;28731:26;;28803:9;28797:4;28793:20;28789:1;28778:9;28774:17;28767:47;28831:131;28957:4;28831:131;:::i;:::-;28823:139;;28550:419;;;:::o;28975:::-;29141:4;29179:2;29168:9;29164:18;29156:26;;29228:9;29222:4;29218:20;29214:1;29203:9;29199:17;29192:47;29256:131;29382:4;29256:131;:::i;:::-;29248:139;;28975:419;;;:::o;29400:::-;29566:4;29604:2;29593:9;29589:18;29581:26;;29653:9;29647:4;29643:20;29639:1;29628:9;29624:17;29617:47;29681:131;29807:4;29681:131;:::i;:::-;29673:139;;29400:419;;;:::o;29825:::-;29991:4;30029:2;30018:9;30014:18;30006:26;;30078:9;30072:4;30068:20;30064:1;30053:9;30049:17;30042:47;30106:131;30232:4;30106:131;:::i;:::-;30098:139;;29825:419;;;:::o;30250:::-;30416:4;30454:2;30443:9;30439:18;30431:26;;30503:9;30497:4;30493:20;30489:1;30478:9;30474:17;30467:47;30531:131;30657:4;30531:131;:::i;:::-;30523:139;;30250:419;;;:::o;30675:::-;30841:4;30879:2;30868:9;30864:18;30856:26;;30928:9;30922:4;30918:20;30914:1;30903:9;30899:17;30892:47;30956:131;31082:4;30956:131;:::i;:::-;30948:139;;30675:419;;;:::o;31100:::-;31266:4;31304:2;31293:9;31289:18;31281:26;;31353:9;31347:4;31343:20;31339:1;31328:9;31324:17;31317:47;31381:131;31507:4;31381:131;:::i;:::-;31373:139;;31100:419;;;:::o;31525:::-;31691:4;31729:2;31718:9;31714:18;31706:26;;31778:9;31772:4;31768:20;31764:1;31753:9;31749:17;31742:47;31806:131;31932:4;31806:131;:::i;:::-;31798:139;;31525:419;;;:::o;31950:::-;32116:4;32154:2;32143:9;32139:18;32131:26;;32203:9;32197:4;32193:20;32189:1;32178:9;32174:17;32167:47;32231:131;32357:4;32231:131;:::i;:::-;32223:139;;31950:419;;;:::o;32375:::-;32541:4;32579:2;32568:9;32564:18;32556:26;;32628:9;32622:4;32618:20;32614:1;32603:9;32599:17;32592:47;32656:131;32782:4;32656:131;:::i;:::-;32648:139;;32375:419;;;:::o;32800:::-;32966:4;33004:2;32993:9;32989:18;32981:26;;33053:9;33047:4;33043:20;33039:1;33028:9;33024:17;33017:47;33081:131;33207:4;33081:131;:::i;:::-;33073:139;;32800:419;;;:::o;33225:::-;33391:4;33429:2;33418:9;33414:18;33406:26;;33478:9;33472:4;33468:20;33464:1;33453:9;33449:17;33442:47;33506:131;33632:4;33506:131;:::i;:::-;33498:139;;33225:419;;;:::o;33650:::-;33816:4;33854:2;33843:9;33839:18;33831:26;;33903:9;33897:4;33893:20;33889:1;33878:9;33874:17;33867:47;33931:131;34057:4;33931:131;:::i;:::-;33923:139;;33650:419;;;:::o;34075:::-;34241:4;34279:2;34268:9;34264:18;34256:26;;34328:9;34322:4;34318:20;34314:1;34303:9;34299:17;34292:47;34356:131;34482:4;34356:131;:::i;:::-;34348:139;;34075:419;;;:::o;34500:::-;34666:4;34704:2;34693:9;34689:18;34681:26;;34753:9;34747:4;34743:20;34739:1;34728:9;34724:17;34717:47;34781:131;34907:4;34781:131;:::i;:::-;34773:139;;34500:419;;;:::o;34925:::-;35091:4;35129:2;35118:9;35114:18;35106:26;;35178:9;35172:4;35168:20;35164:1;35153:9;35149:17;35142:47;35206:131;35332:4;35206:131;:::i;:::-;35198:139;;34925:419;;;:::o;35350:::-;35516:4;35554:2;35543:9;35539:18;35531:26;;35603:9;35597:4;35593:20;35589:1;35578:9;35574:17;35567:47;35631:131;35757:4;35631:131;:::i;:::-;35623:139;;35350:419;;;:::o;35775:::-;35941:4;35979:2;35968:9;35964:18;35956:26;;36028:9;36022:4;36018:20;36014:1;36003:9;35999:17;35992:47;36056:131;36182:4;36056:131;:::i;:::-;36048:139;;35775:419;;;:::o;36200:::-;36366:4;36404:2;36393:9;36389:18;36381:26;;36453:9;36447:4;36443:20;36439:1;36428:9;36424:17;36417:47;36481:131;36607:4;36481:131;:::i;:::-;36473:139;;36200:419;;;:::o;36625:::-;36791:4;36829:2;36818:9;36814:18;36806:26;;36878:9;36872:4;36868:20;36864:1;36853:9;36849:17;36842:47;36906:131;37032:4;36906:131;:::i;:::-;36898:139;;36625:419;;;:::o;37050:222::-;37143:4;37181:2;37170:9;37166:18;37158:26;;37194:71;37262:1;37251:9;37247:17;37238:6;37194:71;:::i;:::-;37050:222;;;;:::o;37278:129::-;37312:6;37339:20;;:::i;:::-;37329:30;;37368:33;37396:4;37388:6;37368:33;:::i;:::-;37278:129;;;:::o;37413:75::-;37446:6;37479:2;37473:9;37463:19;;37413:75;:::o;37494:307::-;37555:4;37645:18;37637:6;37634:30;37631:56;;;37667:18;;:::i;:::-;37631:56;37705:29;37727:6;37705:29;:::i;:::-;37697:37;;37789:4;37783;37779:15;37771:23;;37494:307;;;:::o;37807:98::-;37858:6;37892:5;37886:12;37876:22;;37807:98;;;:::o;37911:99::-;37963:6;37997:5;37991:12;37981:22;;37911:99;;;:::o;38016:168::-;38099:11;38133:6;38128:3;38121:19;38173:4;38168:3;38164:14;38149:29;;38016:168;;;;:::o;38190:147::-;38291:11;38328:3;38313:18;;38190:147;;;;:::o;38343:169::-;38427:11;38461:6;38456:3;38449:19;38501:4;38496:3;38492:14;38477:29;;38343:169;;;;:::o;38518:148::-;38620:11;38657:3;38642:18;;38518:148;;;;:::o;38672:305::-;38712:3;38731:20;38749:1;38731:20;:::i;:::-;38726:25;;38765:20;38783:1;38765:20;:::i;:::-;38760:25;;38919:1;38851:66;38847:74;38844:1;38841:81;38838:107;;;38925:18;;:::i;:::-;38838:107;38969:1;38966;38962:9;38955:16;;38672:305;;;;:::o;38983:185::-;39023:1;39040:20;39058:1;39040:20;:::i;:::-;39035:25;;39074:20;39092:1;39074:20;:::i;:::-;39069:25;;39113:1;39103:35;;39118:18;;:::i;:::-;39103:35;39160:1;39157;39153:9;39148:14;;38983:185;;;;:::o;39174:348::-;39214:7;39237:20;39255:1;39237:20;:::i;:::-;39232:25;;39271:20;39289:1;39271:20;:::i;:::-;39266:25;;39459:1;39391:66;39387:74;39384:1;39381:81;39376:1;39369:9;39362:17;39358:105;39355:131;;;39466:18;;:::i;:::-;39355:131;39514:1;39511;39507:9;39496:20;;39174:348;;;;:::o;39528:191::-;39568:4;39588:20;39606:1;39588:20;:::i;:::-;39583:25;;39622:20;39640:1;39622:20;:::i;:::-;39617:25;;39661:1;39658;39655:8;39652:34;;;39666:18;;:::i;:::-;39652:34;39711:1;39708;39704:9;39696:17;;39528:191;;;;:::o;39725:96::-;39762:7;39791:24;39809:5;39791:24;:::i;:::-;39780:35;;39725:96;;;:::o;39827:104::-;39872:7;39901:24;39919:5;39901:24;:::i;:::-;39890:35;;39827:104;;;:::o;39937:90::-;39971:7;40014:5;40007:13;40000:21;39989:32;;39937:90;;;:::o;40033:77::-;40070:7;40099:5;40088:16;;40033:77;;;:::o;40116:149::-;40152:7;40192:66;40185:5;40181:78;40170:89;;40116:149;;;:::o;40271:125::-;40337:7;40366:24;40384:5;40366:24;:::i;:::-;40355:35;;40271:125;;;:::o;40402:126::-;40439:7;40479:42;40472:5;40468:54;40457:65;;40402:126;;;:::o;40534:77::-;40571:7;40600:5;40589:16;;40534:77;;;:::o;40617:86::-;40652:7;40692:4;40685:5;40681:16;40670:27;;40617:86;;;:::o;40709:134::-;40767:9;40800:37;40831:5;40800:37;:::i;:::-;40787:50;;40709:134;;;:::o;40849:126::-;40899:9;40932:37;40963:5;40932:37;:::i;:::-;40919:50;;40849:126;;;:::o;40981:113::-;41031:9;41064:24;41082:5;41064:24;:::i;:::-;41051:37;;40981:113;;;:::o;41100:154::-;41184:6;41179:3;41174;41161:30;41246:1;41237:6;41232:3;41228:16;41221:27;41100:154;;;:::o;41260:307::-;41328:1;41338:113;41352:6;41349:1;41346:13;41338:113;;;41437:1;41432:3;41428:11;41422:18;41418:1;41413:3;41409:11;41402:39;41374:2;41371:1;41367:10;41362:15;;41338:113;;;41469:6;41466:1;41463:13;41460:101;;;41549:1;41540:6;41535:3;41531:16;41524:27;41460:101;41309:258;41260:307;;;:::o;41573:320::-;41617:6;41654:1;41648:4;41644:12;41634:22;;41701:1;41695:4;41691:12;41722:18;41712:81;;41778:4;41770:6;41766:17;41756:27;;41712:81;41840:2;41832:6;41829:14;41809:18;41806:38;41803:84;;;41859:18;;:::i;:::-;41803:84;41624:269;41573:320;;;:::o;41899:281::-;41982:27;42004:4;41982:27;:::i;:::-;41974:6;41970:40;42112:6;42100:10;42097:22;42076:18;42064:10;42061:34;42058:62;42055:88;;;42123:18;;:::i;:::-;42055:88;42163:10;42159:2;42152:22;41942:238;41899:281;;:::o;42186:233::-;42225:3;42248:24;42266:5;42248:24;:::i;:::-;42239:33;;42294:66;42287:5;42284:77;42281:103;;;42364:18;;:::i;:::-;42281:103;42411:1;42404:5;42400:13;42393:20;;42186:233;;;:::o;42425:100::-;42464:7;42493:26;42513:5;42493:26;:::i;:::-;42482:37;;42425:100;;;:::o;42531:79::-;42570:7;42599:5;42588:16;;42531:79;;;:::o;42616:94::-;42655:7;42684:20;42698:5;42684:20;:::i;:::-;42673:31;;42616:94;;;:::o;42716:79::-;42755:7;42784:5;42773:16;;42716:79;;;:::o;42801:176::-;42833:1;42850:20;42868:1;42850:20;:::i;:::-;42845:25;;42884:20;42902:1;42884:20;:::i;:::-;42879:25;;42923:1;42913:35;;42928:18;;:::i;:::-;42913:35;42969:1;42966;42962:9;42957:14;;42801:176;;;;:::o;42983:180::-;43031:77;43028:1;43021:88;43128:4;43125:1;43118:15;43152:4;43149:1;43142:15;43169:180;43217:77;43214:1;43207:88;43314:4;43311:1;43304:15;43338:4;43335:1;43328:15;43355:180;43403:77;43400:1;43393:88;43500:4;43497:1;43490:15;43524:4;43521:1;43514:15;43541:180;43589:77;43586:1;43579:88;43686:4;43683:1;43676:15;43710:4;43707:1;43700:15;43727:180;43775:77;43772:1;43765:88;43872:4;43869:1;43862:15;43896:4;43893:1;43886:15;43913:180;43961:77;43958:1;43951:88;44058:4;44055:1;44048:15;44082:4;44079:1;44072:15;44099:117;44208:1;44205;44198:12;44222:117;44331:1;44328;44321:12;44345:117;44454:1;44451;44444:12;44468:117;44577:1;44574;44567:12;44591:102;44632:6;44683:2;44679:7;44674:2;44667:5;44663:14;44659:28;44649:38;;44591:102;;;:::o;44699:94::-;44732:8;44780:5;44776:2;44772:14;44751:35;;44699:94;;;:::o;44799:174::-;44939:26;44935:1;44927:6;44923:14;44916:50;44799:174;:::o;44979:181::-;45119:33;45115:1;45107:6;45103:14;45096:57;44979:181;:::o;45166:214::-;45306:66;45302:1;45294:6;45290:14;45283:90;45166:214;:::o;45386:237::-;45526:34;45522:1;45514:6;45510:14;45503:58;45595:20;45590:2;45582:6;45578:15;45571:45;45386:237;:::o;45629:225::-;45769:34;45765:1;45757:6;45753:14;45746:58;45838:8;45833:2;45825:6;45821:15;45814:33;45629:225;:::o;45860:224::-;46000:34;45996:1;45988:6;45984:14;45977:58;46069:7;46064:2;46056:6;46052:15;46045:32;45860:224;:::o;46090:225::-;46230:34;46226:1;46218:6;46214:14;46207:58;46299:8;46294:2;46286:6;46282:15;46275:33;46090:225;:::o;46321:223::-;46461:34;46457:1;46449:6;46445:14;46438:58;46530:6;46525:2;46517:6;46513:15;46506:31;46321:223;:::o;46550:175::-;46690:27;46686:1;46678:6;46674:14;46667:51;46550:175;:::o;46731:186::-;46871:34;46867:1;46859:6;46855:14;46848:58;46731:186;:::o;46927:257::-;47071:34;47067:1;47059:6;47055:14;47048:58;47144:28;47139:2;47131:6;47127:15;47120:53;46927:257;:::o;47194:233::-;47338:34;47334:1;47326:6;47322:14;47315:58;47411:4;47406:2;47398:6;47394:15;47387:29;47194:233;:::o;47437:187::-;47581:31;47577:1;47569:6;47565:14;47558:55;47437:187;:::o;47634:243::-;47778:34;47774:1;47766:6;47762:14;47755:58;47851:14;47846:2;47838:6;47834:15;47827:39;47634:243;:::o;47887:242::-;48031:34;48027:1;48019:6;48015:14;48008:58;48104:13;48099:2;48091:6;48087:15;48080:38;47887:242;:::o;48139:172::-;48283:16;48279:1;48271:6;48267:14;48260:40;48139:172;:::o;48321:255::-;48465:34;48461:1;48453:6;48449:14;48442:58;48538:26;48533:2;48525:6;48521:15;48514:51;48321:255;:::o;48586:241::-;48730:34;48726:1;48718:6;48714:14;48707:58;48803:12;48798:2;48790:6;48786:15;48779:37;48586:241;:::o;48837:233::-;48981:34;48977:1;48969:6;48965:14;48958:58;49054:4;49049:2;49041:6;49037:15;49030:29;48837:233;:::o;49080:243::-;49224:34;49220:1;49212:6;49208:14;49201:58;49297:14;49292:2;49284:6;49280:15;49273:39;49080:243;:::o;49333:174::-;49477:18;49473:1;49465:6;49461:14;49454:42;49333:174;:::o;49517:163::-;49661:7;49657:1;49649:6;49645:14;49638:31;49517:163;:::o;49690:190::-;49834:34;49830:1;49822:6;49818:14;49811:58;49690:190;:::o;49890:236::-;50034:34;50030:1;50022:6;50018:14;50011:58;50107:7;50102:2;50094:6;50090:15;50083:32;49890:236;:::o;50136:232::-;50280:34;50276:1;50268:6;50264:14;50257:58;50353:3;50348:2;50340:6;50336:15;50329:28;50136:232;:::o;50378:118::-;;:::o;50506:248::-;50650:34;50646:1;50638:6;50634:14;50627:58;50723:19;50718:2;50710:6;50706:15;50699:44;50506:248;:::o;50764:261::-;50908:34;50904:1;50896:6;50892:14;50885:58;50985:24;50980:2;50972:6;50968:15;50961:49;50764:261;:::o;51039:138::-;51120:24;51138:5;51120:24;:::i;:::-;51113:5;51110:35;51100:63;;51159:1;51156;51149:12;51100:63;51039:138;:::o;51191:154::-;51280:32;51306:5;51280:32;:::i;:::-;51273:5;51270:43;51260:71;;51327:1;51324;51317:12;51260:71;51191:154;:::o;51359:132::-;51437:21;51452:5;51437:21;:::i;:::-;51430:5;51427:32;51417:60;;51473:1;51470;51463:12;51417:60;51359:132;:::o;51505:136::-;51585:23;51602:5;51585:23;:::i;:::-;51578:5;51575:34;51565:62;;51623:1;51620;51613:12;51565:62;51505:136;:::o;51655:196::-;51765:53;51812:5;51765:53;:::i;:::-;51758:5;51755:64;51745:92;;51833:1;51830;51823:12;51745:92;51655:196;:::o;51865:138::-;51946:24;51964:5;51946:24;:::i;:::-;51939:5;51936:35;51926:63;;51985:1;51982;51975:12;51926:63;51865:138;:::o

Swarm Source

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