ETH Price: $2,348.96 (+0.48%)

Token

 

Overview

Max Total Supply

639

Holders

35

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

0x8f8016c1c240483dde0c055385444f260a603f8c
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:
Fox1155

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
london EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-05-06
*/

// File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library AddressUpgradeable {
    /**
     * @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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol


// OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol)

pragma solidity ^0.8.2;


/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
 * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
 * case an upgrade adds a module that needs to be initialized.
 *
 * For example:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * contract MyToken is ERC20Upgradeable {
 *     function initialize() initializer public {
 *         __ERC20_init("MyToken", "MTK");
 *     }
 * }
 * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
 *     function initializeV2() reinitializer(2) public {
 *         __ERC20Permit_init("MyToken");
 *     }
 * }
 * ```
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
 * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() {
 *     _disableInitializers();
 * }
 * ```
 * ====
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     * @custom:oz-retyped-from bool
     */
    uint8 private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Triggered when the contract has been initialized or reinitialized.
     */
    event Initialized(uint8 version);

    /**
     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
     * `onlyInitializing` functions can be used to initialize parent contracts.
     *
     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
     * constructor.
     *
     * Emits an {Initialized} event.
     */
    modifier initializer() {
        bool isTopLevelCall = !_initializing;
        require(
            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
            "Initializable: contract is already initialized"
        );
        _initialized = 1;
        if (isTopLevelCall) {
            _initializing = true;
        }
        _;
        if (isTopLevelCall) {
            _initializing = false;
            emit Initialized(1);
        }
    }

    /**
     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
     * used to initialize parent contracts.
     *
     * A reinitializer may be used after the original initialization step. This is essential to configure modules that
     * are added through upgrades and that require initialization.
     *
     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
     * cannot be nested. If one is invoked in the context of another, execution will revert.
     *
     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
     * a contract, executing them in the right order is up to the developer or operator.
     *
     * WARNING: setting the version to 255 will prevent any future reinitialization.
     *
     * Emits an {Initialized} event.
     */
    modifier reinitializer(uint8 version) {
        require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
        _initialized = version;
        _initializing = true;
        _;
        _initializing = false;
        emit Initialized(version);
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} and {reinitializer} modifiers, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    /**
     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called
     * through proxies.
     *
     * Emits an {Initialized} event the first time it is successfully executed.
     */
    function _disableInitializers() internal virtual {
        require(!_initializing, "Initializable: contract is initializing");
        if (_initialized < type(uint8).max) {
            _initialized = type(uint8).max;
            emit Initialized(type(uint8).max);
        }
    }

    /**
     * @dev Returns the highest version that has been initialized. See {reinitializer}.
     */
    function _getInitializedVersion() internal view returns (uint8) {
        return _initialized;
    }

    /**
     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
     */
    function _isInitializing() internal view returns (bool) {
        return _initializing;
    }
}

// File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol


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

pragma solidity ^0.8.0;


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

    function __Context_init_unchained() internal onlyInitializing {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;



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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal onlyInitializing {
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal onlyInitializing {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[49] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.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 IERC165Upgradeable {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.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 ERC165Upgradeable is Initializable, IERC165Upgradeable {
    function __ERC165_init() internal onlyInitializing {
    }

    function __ERC165_init_unchained() internal onlyInitializing {
    }
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165Upgradeable).interfaceId;
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155ReceiverUpgradeable is IERC165Upgradeable {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155Upgradeable is IERC165Upgradeable {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts-upgradeable/token/ERC1155/extensions/IERC1155MetadataURIUpgradeable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURIUpgradeable is IERC1155Upgradeable {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable {
    using AddressUpgradeable for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    function __ERC1155_init(string memory uri_) internal onlyInitializing {
        __ERC1155_init_unchained(uri_);
    }

    function __ERC1155_init_unchained(string memory uri_) internal onlyInitializing {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155ReceiverUpgradeable(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155ReceiverUpgradeable.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155ReceiverUpgradeable.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[47] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155BurnableUpgradeable is Initializable, ERC1155Upgradeable {
    function __ERC1155Burnable_init() internal onlyInitializing {
    }

    function __ERC1155Burnable_init_unchained() internal onlyInitializing {
    }
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );

        _burnBatch(account, ids, values);
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}

// File: contracts/FoxStake1155.sol



pragma solidity ^0.8.15;



interface ITokenERC20 {
    function mintAdminContract(address account, uint256 amount) external;
}

contract Fox1155 is ERC1155BurnableUpgradeable, OwnableUpgradeable {
    // individual uri per type
    mapping (uint256 => string) public typeToUri;
    // whether main uri is freezed
    bool public isUriFreezed;
    // whether each individual uri is freezed
    mapping (uint256 => bool) public typeIsUriFreezed;

    // addresses auto-approved by owner
    mapping (address => bool) public isAutoApproved;
    // triggered when an address is set for auto-approve
    event SetAutoApproved(address indexed addr);

    // address of ERC20 token
    ITokenERC20 public token;
    // rate of return for each type
    mapping (uint256 => uint256) public typeToRate;
    // whether each type is in use already
    mapping (uint256 => bool) public isTypeInUse;
    // triggered when a rate is added
    event SetRateForType(uint256 indexed typeId, uint256 rate);
    // maps each wallet to their claimable amounts
    mapping (address => uint256) public addressToLockedInClaimable;
    // maps each wallet to current total daily rate
    mapping (address => uint256) public addressToTotalDailyRate;
    // maps each wallet to timestamp of last action
    mapping (address => uint256) public addressToLastActionTimestamp;
    // starting timestamp of accrual
    uint256 public startTimestamp;
    // rolling expiry period
    uint256 public constant ROLLING_EXPIRY_PERIOD = 30*24*3600;
    // seconds in a day
    uint256 public constant SECONDS_PER_DAY = 24*3600;

    /**
     * @dev Initializes the contract
     */
    function initialize(address _erc20Address) initializer public {
        __ERC1155_init("");
        __Ownable_init();
        token = ITokenERC20(_erc20Address);
    }

    /**
     * @dev Before token transfer - update daily rate and lock in claimable amount
     */
    function _beforeTokenTransfer(
        address /*operator*/,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory /*data*/
    ) internal override {
        uint256 totalRateChange=0;

        for (uint256 i=0; i<ids.length; i++) {
            totalRateChange += typeToRate[ids[i]] * amounts[i];
        }

        if (from != address(0)) { 
            // compute total accrued so far
            uint256 totalAccrued = computeCurrentlyAccrued(from);

            // update last action timestamp and lock in the amount
            addressToLockedInClaimable[from] += totalAccrued;
            addressToLastActionTimestamp[from] = block.timestamp;

            // update total rate
            addressToTotalDailyRate[from] -= totalRateChange;
        }

        if (to != address(0)) {
            // compute total accrued so far
            uint256 totalAccrued = computeCurrentlyAccrued(to);

            // update last action timestamp and lock in the amount
            addressToLockedInClaimable[to] += totalAccrued;
            addressToLastActionTimestamp[to] = block.timestamp;

            // update total rate
            addressToTotalDailyRate[to] += totalRateChange;
        }
    }

    /**
     * @dev Compute current total accrued by wallet
     */
    function computeCurrentlyAccrued(address wallet) public view returns (uint256){
        require(startTimestamp > 0, "Not started");

        uint256 lastAction = addressToLastActionTimestamp[wallet];
        uint256 timediff = block.timestamp - (lastAction > 0 ? lastAction : startTimestamp);
        timediff = timediff > ROLLING_EXPIRY_PERIOD ? ROLLING_EXPIRY_PERIOD : timediff;
        return timediff * addressToTotalDailyRate[wallet] / SECONDS_PER_DAY;
    }

    /**
     * @dev Get accrued claimable balance
     */
    function getAccruedClaimableBalance(address wallet) public view returns (uint256){
        return computeCurrentlyAccrued(wallet) + addressToLockedInClaimable[wallet];
    }

    /**
     * @dev Claim accrued balance
     */
    function claimAccruedBalance() public {
        uint256 claimableBalance = getAccruedClaimableBalance(msg.sender);

        addressToLockedInClaimable[msg.sender] = 0;
        addressToLastActionTimestamp[msg.sender] = block.timestamp;

        token.mintAdminContract(msg.sender, claimableBalance);
    }

    /**
     * @dev Start accruing
     */
    function startTokenAccruing() public onlyOwner {
        startTimestamp = block.timestamp;
    }

    /**
     * @dev Set rate for type
     */
    function setDailyRateForType(uint256 typeId, uint256 rate) public onlyOwner {
        //require(!isTypeInUse[typeId], "Already in use");
        typeToRate[typeId] = rate;
        emit SetRateForType(typeId, rate);
    }

    /**
     * @dev Set auto-approved address
     */
    function setAutoApproved(address addr, bool value) public onlyOwner {
        isAutoApproved[addr] = value;
        emit SetAutoApproved(addr);
    }
            
    /**
     * @dev Airdrop tokens to owners
     */
    function mintOwner(address[] calldata owners, uint256[] calldata types, uint256[] calldata counts) external onlyOwner {
      require(owners.length == types.length && types.length == counts.length, "Bad array lengths");
         
      for (uint256 i = 0; i < owners.length; i++) {
        if (!isTypeInUse[types[i]]) {
            isTypeInUse[types[i]] = true;
        }
        _mint(owners[i], types[i], counts[i], "");
      }
    }

    /**
     * @dev Airdrop single tokens to owners
     */
    function mintOwnerOneToken(address[] calldata owners, uint256 typeId) external onlyOwner {
        if (!isTypeInUse[typeId]) {
            isTypeInUse[typeId] = true;
        }
        for (uint256 i = 0; i < owners.length; i++) {
            _mint(owners[i], typeId, 1, "");
        }
    }

    /**
     * @dev Type uri
     */
    function uri(uint256 typeId) public view override returns (string memory) {
        string memory typeUri = typeToUri[typeId];
        if (bytes(typeUri).length == 0) {
            return super.uri(typeId);
        } else {
            return typeUri;
        }
    }
   
    /**
     * @dev Updates the metadata URI
     */
    function updateUri(string calldata newUri) public onlyOwner {
        require(!isUriFreezed, "Freezed");
        _setURI(newUri);
    }

    /**
     * @dev Freezes the metadata URI
     */
    function freezeUri() public onlyOwner {
        isUriFreezed = true;
    }

    /**
     * @dev Updates and freezes the metadata URI
     */
    function permanentSetUri(string calldata newUri) public onlyOwner {
        updateUri(newUri);
        freezeUri();
    }

    /**
     * @dev Updates the metadata URI for a specific type
     */
    function updateUriForType(string calldata newUri, uint256 typeId) public onlyOwner {
        require(!typeIsUriFreezed[typeId], "Freezed");
        typeToUri[typeId] = newUri;
    }

    /**
     * @dev Freezes the metadata URI
     */
    function freezeUriForType(uint256 typeId) public onlyOwner {
        typeIsUriFreezed[typeId] = true;
    }

    /**
     * @dev Updates and freezes the metadata URI
     */
    function permanentSetUriForType(string calldata newUri, uint256 typeId) public onlyOwner {
        updateUriForType(newUri, typeId);
        freezeUriForType(typeId);
    }

    /**
     * @dev isApprovedForAll override
     */
    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return isAutoApproved[operator] || super.isApprovedForAll(account, operator);
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"SetAutoApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"}],"name":"SetRateForType","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"ROLLING_EXPIRY_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_PER_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToLastActionTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToLockedInClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToTotalDailyRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAccruedBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"computeCurrentlyAccrued","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"freezeUriForType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getAccruedClaimableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20Address","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAutoApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isTypeInUse","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isUriFreezed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"types","type":"uint256[]"},{"internalType":"uint256[]","name":"counts","type":"uint256[]"}],"name":"mintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"mintOwnerOneToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"permanentSetUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"},{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"permanentSetUriForType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"addr","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutoApproved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setDailyRateForType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTokenAccruing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract ITokenERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeIsUriFreezed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeToRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeToUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"updateUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"},{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"updateUriForType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b5061547e806100206000396000f3fe608060405234801561001057600080fd5b50600436106102525760003560e01c8063715018a611610146578063c30f3bb1116100c3578063e985e9c511610087578063e985e9c5146106f1578063ea4910b114610721578063f242432a14610751578063f2fde38b1461076d578063f5298aca14610789578063fc0c546a146107a557610252565b8063c30f3bb11461064f578063c4d66de81461066b578063c5baacb414610687578063c75e25e1146106b7578063e6fd48bc146106d357610252565b806395d34d9e1161010a57806395d34d9e146105c1578063a22cb465146105dd578063ab05ff41146105f9578063abff7f6e14610617578063b1f6f8361461063357610252565b8063715018a61461051b57806374f0314f146105255780638da5cb5b146105435780638f564b241461056157806390a2204e1461059157610252565b8063267f8640116101d45780633c811719116101985780633c8117191461048b5780634e1273f4146104a95780635031fd2a146104d9578063570b3c6a146104e35780636b20c454146104ff57610252565b8063267f8640146103d757806326bb1cf7146104075780632768d709146104235780632eb2c2d61461043f5780633199da021461045b57610252565b8063086cb7851161021b578063086cb7851461032157806308b58c1d1461032b5780630e89341c146103475780632094aacc1461037757806325324533146103a757610252565b8062fdd58e1461025757806301ffc9a71461028757806307860727146102b757806307fc7500146102c1578063086246bd146102f1575b600080fd5b610271600480360381019061026c919061347f565b6107c3565b60405161027e91906134ce565b60405180910390f35b6102a1600480360381019061029c9190613541565b61088c565b6040516102ae9190613589565b60405180910390f35b6102bf61096e565b005b6102db60048036038101906102d691906135a4565b610a98565b6040516102e891906134ce565b60405180910390f35b61030b600480360381019061030691906135d1565b610ab1565b6040516103189190613589565b60405180910390f35b610329610ad2565b005b61034560048036038101906103409190613663565b610af7565b005b610361600480360381019061035c91906135d1565b610b18565b60405161036e919061375c565b60405180910390f35b610391600480360381019061038c91906135d1565b610bde565b60405161039e919061375c565b60405180910390f35b6103c160048036038101906103bc91906135a4565b610c7e565b6040516103ce91906134ce565b60405180910390f35b6103f160048036038101906103ec91906135d1565b610c97565b6040516103fe9190613589565b60405180910390f35b610421600480360381019061041c91906137aa565b610cb7565b005b61043d60048036038101906104389190613896565b610d5d565b005b61045960048036038101906104549190613b3d565b610ee2565b005b610475600480360381019061047091906135a4565b610f83565b6040516104829190613589565b60405180910390f35b610493610fa3565b6040516104a091906134ce565b60405180910390f35b6104c360048036038101906104be9190613ccf565b610faa565b6040516104d09190613e05565b60405180910390f35b6104e16110c3565b005b6104fd60048036038101906104f89190613e27565b6110d5565b005b61051960048036038101906105149190613e74565b61117e565b005b61052361121b565b005b61052d61122f565b60405161053a91906134ce565b60405180910390f35b61054b611236565b6040516105589190613f0e565b60405180910390f35b61057b600480360381019061057691906135a4565b611260565b60405161058891906134ce565b60405180910390f35b6105ab60048036038101906105a691906135d1565b611279565b6040516105b891906134ce565b60405180910390f35b6105db60048036038101906105d69190613663565b611292565b005b6105f760048036038101906105f291906137aa565b611323565b005b610601611339565b60405161060e9190613589565b60405180910390f35b610631600480360381019061062c9190613e27565b61134c565b005b61064d60048036038101906106489190613f29565b61136a565b005b610669600480360381019061066491906135d1565b6113c6565b005b610685600480360381019061068091906135a4565b6113fd565b005b6106a1600480360381019061069c91906135a4565b611595565b6040516106ae91906134ce565b60405180910390f35b6106d160048036038101906106cc9190613f69565b6116bc565b005b6106db611782565b6040516106e891906134ce565b60405180910390f35b61070b60048036038101906107069190613fc9565b611789565b6040516107189190613589565b60405180910390f35b61073b600480360381019061073691906135a4565b6117f1565b60405161074891906134ce565b60405180910390f35b61076b60048036038101906107669190614009565b61184e565b005b610787600480360381019061078291906135a4565b6118ef565b005b6107a3600480360381019061079e91906140a0565b611972565b005b6107ad611a0f565b6040516107ba9190614152565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082a906141df565b60405180910390fd5b6065600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061095757507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610967575061096682611a35565b5b9050919050565b6000610979336117f1565b9050600061010260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055504261010460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060ff60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d58c2c5533836040518363ffffffff1660e01b8152600401610a639291906141ff565b600060405180830381600087803b158015610a7d57600080fd5b505af1158015610a91573d6000803e3d6000fd5b5050505050565b6101026020528060005260406000206000915090505481565b6101016020528060005260406000206000915054906101000a900460ff1681565b610ada611a9f565b600160fc60006101000a81548160ff021916908315150217905550565b610aff611a9f565b610b0a838383611292565b610b13816113c6565b505050565b6060600060fb60008481526020019081526020016000208054610b3a90614257565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6690614257565b8015610bb35780601f10610b8857610100808354040283529160200191610bb3565b820191906000526020600020905b815481529060010190602001808311610b9657829003601f168201915b505050505090506000815103610bd457610bcc83611b1d565b915050610bd9565b809150505b919050565b60fb6020528060005260406000206000915090508054610bfd90614257565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2990614257565b8015610c765780601f10610c4b57610100808354040283529160200191610c76565b820191906000526020600020905b815481529060010190602001808311610c5957829003601f168201915b505050505081565b6101046020528060005260406000206000915090505481565b60fd6020528060005260406000206000915054906101000a900460ff1681565b610cbf611a9f565b8060fe60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fe7e87d526025768dfbff568780e9eb516bfc7a7d59de38505d40c54b45a78e1060405160405180910390a25050565b610d65611a9f565b8383905086869050148015610d7f57508181905084849050145b610dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db5906142d4565b60405180910390fd5b60005b86869050811015610ed9576101016000868684818110610de457610de36142f4565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16610e525760016101016000878785818110610e2557610e246142f4565b5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055505b610ec6878783818110610e6857610e676142f4565b5b9050602002016020810190610e7d91906135a4565b868684818110610e9057610e8f6142f4565b5b90506020020135858585818110610eaa57610ea96142f4565b5b9050602002013560405180602001604052806000815250611bb1565b8080610ed190614352565b915050610dc1565b50505050505050565b610eea611d62565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610f305750610f2f85610f2a611d62565b611789565b5b610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f669061440c565b60405180910390fd5b610f7c8585858585611d6a565b5050505050565b60fe6020528060005260406000206000915054906101000a900460ff1681565b62278d0081565b60608151835114610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe79061449e565b60405180910390fd5b6000835167ffffffffffffffff81111561100d5761100c61394a565b5b60405190808252806020026020018201604052801561103b5781602001602082028036833780820191505090505b50905060005b84518110156110b8576110888582815181106110605761105f6142f4565b5b602002602001015185838151811061107b5761107a6142f4565b5b60200260200101516107c3565b82828151811061109b5761109a6142f4565b5b602002602001018181525050806110b190614352565b9050611041565b508091505092915050565b6110cb611a9f565b4261010581905550565b6110dd611a9f565b60fc60009054906101000a900460ff161561112d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111249061450a565b60405180910390fd5b61117a82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061208e565b5050565b611186611d62565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806111cc57506111cb836111c6611d62565b611789565b5b61120b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112029061440c565b60405180910390fd5b6112168383836120a1565b505050565b611223611a9f565b61122d6000612371565b565b6201518081565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101036020528060005260406000206000915090505481565b6101006020528060005260406000206000915090505481565b61129a611a9f565b60fd600082815260200190815260200160002060009054906101000a900460ff16156112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f29061450a565b60405180910390fd5b828260fb6000848152602001908152602001600020918261131d9291906146d7565b50505050565b61133561132e611d62565b8383612437565b5050565b60fc60009054906101000a900460ff1681565b611354611a9f565b61135e82826110d5565b611366610ad2565b5050565b611372611a9f565b80610100600084815260200190815260200160002081905550817e1150a3f177527803aa1ce6433158dc2c7ba287a4428c11839c165697fd2a30826040516113ba91906134ce565b60405180910390a25050565b6113ce611a9f565b600160fd600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060019054906101000a900460ff1615905080801561142e5750600160008054906101000a900460ff1660ff16105b8061145b575061143d306125a3565b15801561145a5750600160008054906101000a900460ff1660ff16145b5b61149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149190614819565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156114d7576001600060016101000a81548160ff0219169083151502179055505b6114ef604051806020016040528060008152506125c6565b6114f7612621565b8160ff60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080156115915760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516115889190614881565b60405180910390a15b5050565b60008061010554116115dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d3906148e8565b60405180910390fd5b600061010460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008082116116335761010554611635565b815b426116409190614908565b905062278d0081116116525780611657565b62278d005b90506201518061010360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826116a9919061493c565b6116b391906149c5565b92505050919050565b6116c4611a9f565b610101600082815260200190815260200160002060009054906101000a900460ff16611718576001610101600083815260200190815260200160002060006101000a81548160ff0219169083151502179055505b60005b8383905081101561177c5761176984848381811061173c5761173b6142f4565b5b905060200201602081019061175191906135a4565b83600160405180602001604052806000815250611bb1565b808061177490614352565b91505061171b565b50505050565b6101055481565b600060fe60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806117e957506117e8838361267a565b5b905092915050565b600061010260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461183d83611595565b61184791906149f6565b9050919050565b611856611d62565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061189c575061189b85611896611d62565b611789565b5b6118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d29061440c565b60405180910390fd5b6118e8858585858561270e565b5050505050565b6118f7611a9f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614abe565b60405180910390fd5b61196f81612371565b50565b61197a611d62565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806119c057506119bf836119ba611d62565b611789565b5b6119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f69061440c565b60405180910390fd5b611a0a8383836129ac565b505050565b60ff60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611aa7611d62565b73ffffffffffffffffffffffffffffffffffffffff16611ac5611236565b73ffffffffffffffffffffffffffffffffffffffff1614611b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1290614b2a565b60405180910390fd5b565b606060678054611b2c90614257565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5890614257565b8015611ba55780601f10611b7a57610100808354040283529160200191611ba5565b820191906000526020600020905b815481529060010190602001808311611b8857829003601f168201915b50505050509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1790614bbc565b60405180910390fd5b6000611c2a611d62565b90506000611c3785612bf4565b90506000611c4485612bf4565b9050611c5583600089858589612c6e565b846065600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb591906149f6565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611d33929190614bdc565b60405180910390a4611d4a83600089858589612f65565b611d5983600089898989612f6d565b50505050505050565b600033905090565b8151835114611dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da590614c77565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1490614d09565b60405180910390fd5b6000611e27611d62565b9050611e37818787878787612c6e565b60005b8451811015611feb576000858281518110611e5857611e576142f4565b5b602002602001015190506000858381518110611e7757611e766142f4565b5b6020026020010151905060006065600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1090614d9b565b60405180910390fd5b8181036065600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816065600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fd091906149f6565b9250508190555050505080611fe490614352565b9050611e3a565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612062929190614dbb565b60405180910390a4612078818787878787612f65565b612086818787878787613144565b505050505050565b806067908161209d9190614df2565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210790614f36565b60405180910390fd5b8051825114612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b90614c77565b60405180910390fd5b600061215e611d62565b905061217e81856000868660405180602001604052806000815250612c6e565b60005b83518110156122cd57600084828151811061219f5761219e6142f4565b5b6020026020010151905060008483815181106121be576121bd6142f4565b5b6020026020010151905060006065600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225790614fc8565b60405180910390fd5b8181036065600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505080806122c590614352565b915050612181565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612345929190614dbb565b60405180910390a461236b81856000868660405180602001604052806000815250612f65565b50505050565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160c960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249c9061505a565b60405180910390fd5b80606660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125969190613589565b60405180910390a3505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16612615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260c906150ec565b60405180910390fd5b61261e8161331b565b50565b600060019054906101000a900460ff16612670576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612667906150ec565b60405180910390fd5b612678613376565b565b6000606660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361277d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277490614d09565b60405180910390fd5b6000612787611d62565b9050600061279485612bf4565b905060006127a185612bf4565b90506127b1838989858589612c6e565b60006065600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284090614d9b565b60405180910390fd5b8581036065600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856065600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290091906149f6565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161297d929190614bdc565b60405180910390a4612993848a8a86868a612f65565b6129a1848a8a8a8a8a612f6d565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1290614f36565b60405180910390fd5b6000612a25611d62565b90506000612a3284612bf4565b90506000612a3f84612bf4565b9050612a5f83876000858560405180602001604052806000815250612c6e565b60006065600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aee90614fc8565b60405180910390fd5b8481036065600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612bc5929190614bdc565b60405180910390a4612beb84886000868660405180602001604052806000815250612f65565b50505050505050565b60606000600167ffffffffffffffff811115612c1357612c1261394a565b5b604051908082528060200260200182016040528015612c415781602001602082028036833780820191505090505b5090508281600081518110612c5957612c586142f4565b5b60200260200101818152505080915050919050565b6000805b8451811015612cef57838181518110612c8e57612c8d6142f4565b5b60200260200101516101006000878481518110612cae57612cad6142f4565b5b6020026020010151815260200190815260200160002054612ccf919061493c565b82612cda91906149f6565b91508080612ce790614352565b915050612c72565b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612e26576000612d2f87611595565b90508061010260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d8191906149f6565b925050819055504261010460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508161010360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e1d9190614908565b92505081905550505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612f5c576000612e6586611595565b90508061010260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eb791906149f6565b925050819055504261010460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508161010360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f5391906149f6565b92505081905550505b50505050505050565b505050505050565b612f8c8473ffffffffffffffffffffffffffffffffffffffff166125a3565b1561313c578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612fd2959493929190615161565b6020604051808303816000875af192505050801561300e57506040513d601f19601f8201168201806040525081019061300b91906151d0565b60015b6130b35761301a61520a565b806308c379a003613076575061302e61522c565b806130395750613078565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306d919061375c565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130aa9061532e565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461313a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613131906153c0565b60405180910390fd5b505b505050505050565b6131638473ffffffffffffffffffffffffffffffffffffffff166125a3565b15613313578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016131a99594939291906153e0565b6020604051808303816000875af19250505080156131e557506040513d601f19601f820116820180604052508101906131e291906151d0565b60015b61328a576131f161520a565b806308c379a00361324d575061320561522c565b80613210575061324f565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613244919061375c565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132819061532e565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613311576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613308906153c0565b60405180910390fd5b505b505050505050565b600060019054906101000a900460ff1661336a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613361906150ec565b60405180910390fd5b6133738161208e565b50565b600060019054906101000a900460ff166133c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133bc906150ec565b60405180910390fd5b6133d56133d0611d62565b612371565b565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613416826133eb565b9050919050565b6134268161340b565b811461343157600080fd5b50565b6000813590506134438161341d565b92915050565b6000819050919050565b61345c81613449565b811461346757600080fd5b50565b60008135905061347981613453565b92915050565b60008060408385031215613496576134956133e1565b5b60006134a485828601613434565b92505060206134b58582860161346a565b9150509250929050565b6134c881613449565b82525050565b60006020820190506134e360008301846134bf565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61351e816134e9565b811461352957600080fd5b50565b60008135905061353b81613515565b92915050565b600060208284031215613557576135566133e1565b5b60006135658482850161352c565b91505092915050565b60008115159050919050565b6135838161356e565b82525050565b600060208201905061359e600083018461357a565b92915050565b6000602082840312156135ba576135b96133e1565b5b60006135c884828501613434565b91505092915050565b6000602082840312156135e7576135e66133e1565b5b60006135f58482850161346a565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613623576136226135fe565b5b8235905067ffffffffffffffff8111156136405761363f613603565b5b60208301915083600182028301111561365c5761365b613608565b5b9250929050565b60008060006040848603121561367c5761367b6133e1565b5b600084013567ffffffffffffffff81111561369a576136996133e6565b5b6136a68682870161360d565b935093505060206136b98682870161346a565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60005b838110156136fd5780820151818401526020810190506136e2565b8381111561370c576000848401525b50505050565b6000601f19601f8301169050919050565b600061372e826136c3565b61373881856136ce565b93506137488185602086016136df565b61375181613712565b840191505092915050565b600060208201905081810360008301526137768184613723565b905092915050565b6137878161356e565b811461379257600080fd5b50565b6000813590506137a48161377e565b92915050565b600080604083850312156137c1576137c06133e1565b5b60006137cf85828601613434565b92505060206137e085828601613795565b9150509250929050565b60008083601f840112613800576137ff6135fe565b5b8235905067ffffffffffffffff81111561381d5761381c613603565b5b60208301915083602082028301111561383957613838613608565b5b9250929050565b60008083601f840112613856576138556135fe565b5b8235905067ffffffffffffffff81111561387357613872613603565b5b60208301915083602082028301111561388f5761388e613608565b5b9250929050565b600080600080600080606087890312156138b3576138b26133e1565b5b600087013567ffffffffffffffff8111156138d1576138d06133e6565b5b6138dd89828a016137ea565b9650965050602087013567ffffffffffffffff811115613900576138ff6133e6565b5b61390c89828a01613840565b9450945050604087013567ffffffffffffffff81111561392f5761392e6133e6565b5b61393b89828a01613840565b92509250509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61398282613712565b810181811067ffffffffffffffff821117156139a1576139a061394a565b5b80604052505050565b60006139b46133d7565b90506139c08282613979565b919050565b600067ffffffffffffffff8211156139e0576139df61394a565b5b602082029050602081019050919050565b6000613a046139ff846139c5565b6139aa565b90508083825260208201905060208402830185811115613a2757613a26613608565b5b835b81811015613a505780613a3c888261346a565b845260208401935050602081019050613a29565b5050509392505050565b600082601f830112613a6f57613a6e6135fe565b5b8135613a7f8482602086016139f1565b91505092915050565b600080fd5b600067ffffffffffffffff821115613aa857613aa761394a565b5b613ab182613712565b9050602081019050919050565b82818337600083830152505050565b6000613ae0613adb84613a8d565b6139aa565b905082815260208101848484011115613afc57613afb613a88565b5b613b07848285613abe565b509392505050565b600082601f830112613b2457613b236135fe565b5b8135613b34848260208601613acd565b91505092915050565b600080600080600060a08688031215613b5957613b586133e1565b5b6000613b6788828901613434565b9550506020613b7888828901613434565b945050604086013567ffffffffffffffff811115613b9957613b986133e6565b5b613ba588828901613a5a565b935050606086013567ffffffffffffffff811115613bc657613bc56133e6565b5b613bd288828901613a5a565b925050608086013567ffffffffffffffff811115613bf357613bf26133e6565b5b613bff88828901613b0f565b9150509295509295909350565b600067ffffffffffffffff821115613c2757613c2661394a565b5b602082029050602081019050919050565b6000613c4b613c4684613c0c565b6139aa565b90508083825260208201905060208402830185811115613c6e57613c6d613608565b5b835b81811015613c975780613c838882613434565b845260208401935050602081019050613c70565b5050509392505050565b600082601f830112613cb657613cb56135fe565b5b8135613cc6848260208601613c38565b91505092915050565b60008060408385031215613ce657613ce56133e1565b5b600083013567ffffffffffffffff811115613d0457613d036133e6565b5b613d1085828601613ca1565b925050602083013567ffffffffffffffff811115613d3157613d306133e6565b5b613d3d85828601613a5a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d7c81613449565b82525050565b6000613d8e8383613d73565b60208301905092915050565b6000602082019050919050565b6000613db282613d47565b613dbc8185613d52565b9350613dc783613d63565b8060005b83811015613df8578151613ddf8882613d82565b9750613dea83613d9a565b925050600181019050613dcb565b5085935050505092915050565b60006020820190508181036000830152613e1f8184613da7565b905092915050565b60008060208385031215613e3e57613e3d6133e1565b5b600083013567ffffffffffffffff811115613e5c57613e5b6133e6565b5b613e688582860161360d565b92509250509250929050565b600080600060608486031215613e8d57613e8c6133e1565b5b6000613e9b86828701613434565b935050602084013567ffffffffffffffff811115613ebc57613ebb6133e6565b5b613ec886828701613a5a565b925050604084013567ffffffffffffffff811115613ee957613ee86133e6565b5b613ef586828701613a5a565b9150509250925092565b613f088161340b565b82525050565b6000602082019050613f236000830184613eff565b92915050565b60008060408385031215613f4057613f3f6133e1565b5b6000613f4e8582860161346a565b9250506020613f5f8582860161346a565b9150509250929050565b600080600060408486031215613f8257613f816133e1565b5b600084013567ffffffffffffffff811115613fa057613f9f6133e6565b5b613fac868287016137ea565b93509350506020613fbf8682870161346a565b9150509250925092565b60008060408385031215613fe057613fdf6133e1565b5b6000613fee85828601613434565b9250506020613fff85828601613434565b9150509250929050565b600080600080600060a08688031215614025576140246133e1565b5b600061403388828901613434565b955050602061404488828901613434565b94505060406140558882890161346a565b93505060606140668882890161346a565b925050608086013567ffffffffffffffff811115614087576140866133e6565b5b61409388828901613b0f565b9150509295509295909350565b6000806000606084860312156140b9576140b86133e1565b5b60006140c786828701613434565b93505060206140d88682870161346a565b92505060406140e98682870161346a565b9150509250925092565b6000819050919050565b600061411861411361410e846133eb565b6140f3565b6133eb565b9050919050565b600061412a826140fd565b9050919050565b600061413c8261411f565b9050919050565b61414c81614131565b82525050565b60006020820190506141676000830184614143565b92915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006141c9602a836136ce565b91506141d48261416d565b604082019050919050565b600060208201905081810360008301526141f8816141bc565b9050919050565b60006040820190506142146000830185613eff565b61422160208301846134bf565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061426f57607f821691505b60208210810361428257614281614228565b5b50919050565b7f426164206172726179206c656e67746873000000000000000000000000000000600082015250565b60006142be6011836136ce565b91506142c982614288565b602082019050919050565b600060208201905081810360008301526142ed816142b1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061435d82613449565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361438f5761438e614323565b5b600182019050919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b60006143f6602e836136ce565b91506144018261439a565b604082019050919050565b60006020820190508181036000830152614425816143e9565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006144886029836136ce565b91506144938261442c565b604082019050919050565b600060208201905081810360008301526144b78161447b565b9050919050565b7f467265657a656400000000000000000000000000000000000000000000000000600082015250565b60006144f46007836136ce565b91506144ff826144be565b602082019050919050565b60006020820190508181036000830152614523816144e7565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026145977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261455a565b6145a1868361455a565b95508019841693508086168417925050509392505050565b60006145d46145cf6145ca84613449565b6140f3565b613449565b9050919050565b6000819050919050565b6145ee836145b9565b6146026145fa826145db565b848454614567565b825550505050565b600090565b61461761460a565b6146228184846145e5565b505050565b5b818110156146465761463b60008261460f565b600181019050614628565b5050565b601f82111561468b5761465c81614535565b6146658461454a565b81016020851015614674578190505b6146886146808561454a565b830182614627565b50505b505050565b600082821c905092915050565b60006146ae60001984600802614690565b1980831691505092915050565b60006146c7838361469d565b9150826002028217905092915050565b6146e1838361452a565b67ffffffffffffffff8111156146fa576146f961394a565b5b6147048254614257565b61470f82828561464a565b6000601f83116001811461473e576000841561472c578287013590505b61473685826146bb565b86555061479e565b601f19841661474c86614535565b60005b828110156147745784890135825560018201915060208501945060208101905061474f565b86831015614791578489013561478d601f89168261469d565b8355505b6001600288020188555050505b50505050505050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000614803602e836136ce565b915061480e826147a7565b604082019050919050565b60006020820190508181036000830152614832816147f6565b9050919050565b6000819050919050565b600060ff82169050919050565b600061486b61486661486184614839565b6140f3565b614843565b9050919050565b61487b81614850565b82525050565b60006020820190506148966000830184614872565b92915050565b7f4e6f742073746172746564000000000000000000000000000000000000000000600082015250565b60006148d2600b836136ce565b91506148dd8261489c565b602082019050919050565b60006020820190508181036000830152614901816148c5565b9050919050565b600061491382613449565b915061491e83613449565b92508282101561493157614930614323565b5b828203905092915050565b600061494782613449565b915061495283613449565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561498b5761498a614323565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149d082613449565b91506149db83613449565b9250826149eb576149ea614996565b5b828204905092915050565b6000614a0182613449565b9150614a0c83613449565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a4157614a40614323565b5b828201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614aa86026836136ce565b9150614ab382614a4c565b604082019050919050565b60006020820190508181036000830152614ad781614a9b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614b146020836136ce565b9150614b1f82614ade565b602082019050919050565b60006020820190508181036000830152614b4381614b07565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ba66021836136ce565b9150614bb182614b4a565b604082019050919050565b60006020820190508181036000830152614bd581614b99565b9050919050565b6000604082019050614bf160008301856134bf565b614bfe60208301846134bf565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614c616028836136ce565b9150614c6c82614c05565b604082019050919050565b60006020820190508181036000830152614c9081614c54565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614cf36025836136ce565b9150614cfe82614c97565b604082019050919050565b60006020820190508181036000830152614d2281614ce6565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614d85602a836136ce565b9150614d9082614d29565b604082019050919050565b60006020820190508181036000830152614db481614d78565b9050919050565b60006040820190508181036000830152614dd58185613da7565b90508181036020830152614de98184613da7565b90509392505050565b614dfb826136c3565b67ffffffffffffffff811115614e1457614e1361394a565b5b614e1e8254614257565b614e2982828561464a565b600060209050601f831160018114614e5c5760008415614e4a578287015190505b614e5485826146bb565b865550614ebc565b601f198416614e6a86614535565b60005b82811015614e9257848901518255600182019150602085019450602081019050614e6d565b86831015614eaf5784890151614eab601f89168261469d565b8355505b6001600288020188555050505b505050505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614f206023836136ce565b9150614f2b82614ec4565b604082019050919050565b60006020820190508181036000830152614f4f81614f13565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000614fb26024836136ce565b9150614fbd82614f56565b604082019050919050565b60006020820190508181036000830152614fe181614fa5565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006150446029836136ce565b915061504f82614fe8565b604082019050919050565b6000602082019050818103600083015261507381615037565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b60006150d6602b836136ce565b91506150e18261507a565b604082019050919050565b60006020820190508181036000830152615105816150c9565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006151338261510c565b61513d8185615117565b935061514d8185602086016136df565b61515681613712565b840191505092915050565b600060a0820190506151766000830188613eff565b6151836020830187613eff565b61519060408301866134bf565b61519d60608301856134bf565b81810360808301526151af8184615128565b90509695505050505050565b6000815190506151ca81613515565b92915050565b6000602082840312156151e6576151e56133e1565b5b60006151f4848285016151bb565b91505092915050565b60008160e01c9050919050565b600060033d11156152295760046000803e6152266000516151fd565b90505b90565b600060443d106152b95761523e6133d7565b60043d036004823e80513d602482011167ffffffffffffffff821117156152665750506152b9565b808201805167ffffffffffffffff81111561528457505050506152b9565b80602083010160043d0385018111156152a15750505050506152b9565b6152b082602001850186613979565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006153186034836136ce565b9150615323826152bc565b604082019050919050565b600060208201905081810360008301526153478161530b565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006153aa6028836136ce565b91506153b58261534e565b604082019050919050565b600060208201905081810360008301526153d98161539d565b9050919050565b600060a0820190506153f56000830188613eff565b6154026020830187613eff565b81810360408301526154148186613da7565b905081810360608301526154288185613da7565b9050818103608083015261543c8184615128565b9050969550505050505056fea2646970667358221220a68b308162fd2cc23a46b1dabfee7f0e015e2508d24859a84bcedccb41d8199464736f6c634300080f0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102525760003560e01c8063715018a611610146578063c30f3bb1116100c3578063e985e9c511610087578063e985e9c5146106f1578063ea4910b114610721578063f242432a14610751578063f2fde38b1461076d578063f5298aca14610789578063fc0c546a146107a557610252565b8063c30f3bb11461064f578063c4d66de81461066b578063c5baacb414610687578063c75e25e1146106b7578063e6fd48bc146106d357610252565b806395d34d9e1161010a57806395d34d9e146105c1578063a22cb465146105dd578063ab05ff41146105f9578063abff7f6e14610617578063b1f6f8361461063357610252565b8063715018a61461051b57806374f0314f146105255780638da5cb5b146105435780638f564b241461056157806390a2204e1461059157610252565b8063267f8640116101d45780633c811719116101985780633c8117191461048b5780634e1273f4146104a95780635031fd2a146104d9578063570b3c6a146104e35780636b20c454146104ff57610252565b8063267f8640146103d757806326bb1cf7146104075780632768d709146104235780632eb2c2d61461043f5780633199da021461045b57610252565b8063086cb7851161021b578063086cb7851461032157806308b58c1d1461032b5780630e89341c146103475780632094aacc1461037757806325324533146103a757610252565b8062fdd58e1461025757806301ffc9a71461028757806307860727146102b757806307fc7500146102c1578063086246bd146102f1575b600080fd5b610271600480360381019061026c919061347f565b6107c3565b60405161027e91906134ce565b60405180910390f35b6102a1600480360381019061029c9190613541565b61088c565b6040516102ae9190613589565b60405180910390f35b6102bf61096e565b005b6102db60048036038101906102d691906135a4565b610a98565b6040516102e891906134ce565b60405180910390f35b61030b600480360381019061030691906135d1565b610ab1565b6040516103189190613589565b60405180910390f35b610329610ad2565b005b61034560048036038101906103409190613663565b610af7565b005b610361600480360381019061035c91906135d1565b610b18565b60405161036e919061375c565b60405180910390f35b610391600480360381019061038c91906135d1565b610bde565b60405161039e919061375c565b60405180910390f35b6103c160048036038101906103bc91906135a4565b610c7e565b6040516103ce91906134ce565b60405180910390f35b6103f160048036038101906103ec91906135d1565b610c97565b6040516103fe9190613589565b60405180910390f35b610421600480360381019061041c91906137aa565b610cb7565b005b61043d60048036038101906104389190613896565b610d5d565b005b61045960048036038101906104549190613b3d565b610ee2565b005b610475600480360381019061047091906135a4565b610f83565b6040516104829190613589565b60405180910390f35b610493610fa3565b6040516104a091906134ce565b60405180910390f35b6104c360048036038101906104be9190613ccf565b610faa565b6040516104d09190613e05565b60405180910390f35b6104e16110c3565b005b6104fd60048036038101906104f89190613e27565b6110d5565b005b61051960048036038101906105149190613e74565b61117e565b005b61052361121b565b005b61052d61122f565b60405161053a91906134ce565b60405180910390f35b61054b611236565b6040516105589190613f0e565b60405180910390f35b61057b600480360381019061057691906135a4565b611260565b60405161058891906134ce565b60405180910390f35b6105ab60048036038101906105a691906135d1565b611279565b6040516105b891906134ce565b60405180910390f35b6105db60048036038101906105d69190613663565b611292565b005b6105f760048036038101906105f291906137aa565b611323565b005b610601611339565b60405161060e9190613589565b60405180910390f35b610631600480360381019061062c9190613e27565b61134c565b005b61064d60048036038101906106489190613f29565b61136a565b005b610669600480360381019061066491906135d1565b6113c6565b005b610685600480360381019061068091906135a4565b6113fd565b005b6106a1600480360381019061069c91906135a4565b611595565b6040516106ae91906134ce565b60405180910390f35b6106d160048036038101906106cc9190613f69565b6116bc565b005b6106db611782565b6040516106e891906134ce565b60405180910390f35b61070b60048036038101906107069190613fc9565b611789565b6040516107189190613589565b60405180910390f35b61073b600480360381019061073691906135a4565b6117f1565b60405161074891906134ce565b60405180910390f35b61076b60048036038101906107669190614009565b61184e565b005b610787600480360381019061078291906135a4565b6118ef565b005b6107a3600480360381019061079e91906140a0565b611972565b005b6107ad611a0f565b6040516107ba9190614152565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082a906141df565b60405180910390fd5b6065600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061095757507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610967575061096682611a35565b5b9050919050565b6000610979336117f1565b9050600061010260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055504261010460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060ff60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d58c2c5533836040518363ffffffff1660e01b8152600401610a639291906141ff565b600060405180830381600087803b158015610a7d57600080fd5b505af1158015610a91573d6000803e3d6000fd5b5050505050565b6101026020528060005260406000206000915090505481565b6101016020528060005260406000206000915054906101000a900460ff1681565b610ada611a9f565b600160fc60006101000a81548160ff021916908315150217905550565b610aff611a9f565b610b0a838383611292565b610b13816113c6565b505050565b6060600060fb60008481526020019081526020016000208054610b3a90614257565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6690614257565b8015610bb35780601f10610b8857610100808354040283529160200191610bb3565b820191906000526020600020905b815481529060010190602001808311610b9657829003601f168201915b505050505090506000815103610bd457610bcc83611b1d565b915050610bd9565b809150505b919050565b60fb6020528060005260406000206000915090508054610bfd90614257565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2990614257565b8015610c765780601f10610c4b57610100808354040283529160200191610c76565b820191906000526020600020905b815481529060010190602001808311610c5957829003601f168201915b505050505081565b6101046020528060005260406000206000915090505481565b60fd6020528060005260406000206000915054906101000a900460ff1681565b610cbf611a9f565b8060fe60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fe7e87d526025768dfbff568780e9eb516bfc7a7d59de38505d40c54b45a78e1060405160405180910390a25050565b610d65611a9f565b8383905086869050148015610d7f57508181905084849050145b610dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db5906142d4565b60405180910390fd5b60005b86869050811015610ed9576101016000868684818110610de457610de36142f4565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16610e525760016101016000878785818110610e2557610e246142f4565b5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055505b610ec6878783818110610e6857610e676142f4565b5b9050602002016020810190610e7d91906135a4565b868684818110610e9057610e8f6142f4565b5b90506020020135858585818110610eaa57610ea96142f4565b5b9050602002013560405180602001604052806000815250611bb1565b8080610ed190614352565b915050610dc1565b50505050505050565b610eea611d62565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610f305750610f2f85610f2a611d62565b611789565b5b610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f669061440c565b60405180910390fd5b610f7c8585858585611d6a565b5050505050565b60fe6020528060005260406000206000915054906101000a900460ff1681565b62278d0081565b60608151835114610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe79061449e565b60405180910390fd5b6000835167ffffffffffffffff81111561100d5761100c61394a565b5b60405190808252806020026020018201604052801561103b5781602001602082028036833780820191505090505b50905060005b84518110156110b8576110888582815181106110605761105f6142f4565b5b602002602001015185838151811061107b5761107a6142f4565b5b60200260200101516107c3565b82828151811061109b5761109a6142f4565b5b602002602001018181525050806110b190614352565b9050611041565b508091505092915050565b6110cb611a9f565b4261010581905550565b6110dd611a9f565b60fc60009054906101000a900460ff161561112d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111249061450a565b60405180910390fd5b61117a82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061208e565b5050565b611186611d62565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806111cc57506111cb836111c6611d62565b611789565b5b61120b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112029061440c565b60405180910390fd5b6112168383836120a1565b505050565b611223611a9f565b61122d6000612371565b565b6201518081565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101036020528060005260406000206000915090505481565b6101006020528060005260406000206000915090505481565b61129a611a9f565b60fd600082815260200190815260200160002060009054906101000a900460ff16156112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f29061450a565b60405180910390fd5b828260fb6000848152602001908152602001600020918261131d9291906146d7565b50505050565b61133561132e611d62565b8383612437565b5050565b60fc60009054906101000a900460ff1681565b611354611a9f565b61135e82826110d5565b611366610ad2565b5050565b611372611a9f565b80610100600084815260200190815260200160002081905550817e1150a3f177527803aa1ce6433158dc2c7ba287a4428c11839c165697fd2a30826040516113ba91906134ce565b60405180910390a25050565b6113ce611a9f565b600160fd600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060019054906101000a900460ff1615905080801561142e5750600160008054906101000a900460ff1660ff16105b8061145b575061143d306125a3565b15801561145a5750600160008054906101000a900460ff1660ff16145b5b61149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149190614819565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156114d7576001600060016101000a81548160ff0219169083151502179055505b6114ef604051806020016040528060008152506125c6565b6114f7612621565b8160ff60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080156115915760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516115889190614881565b60405180910390a15b5050565b60008061010554116115dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d3906148e8565b60405180910390fd5b600061010460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008082116116335761010554611635565b815b426116409190614908565b905062278d0081116116525780611657565b62278d005b90506201518061010360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826116a9919061493c565b6116b391906149c5565b92505050919050565b6116c4611a9f565b610101600082815260200190815260200160002060009054906101000a900460ff16611718576001610101600083815260200190815260200160002060006101000a81548160ff0219169083151502179055505b60005b8383905081101561177c5761176984848381811061173c5761173b6142f4565b5b905060200201602081019061175191906135a4565b83600160405180602001604052806000815250611bb1565b808061177490614352565b91505061171b565b50505050565b6101055481565b600060fe60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806117e957506117e8838361267a565b5b905092915050565b600061010260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461183d83611595565b61184791906149f6565b9050919050565b611856611d62565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061189c575061189b85611896611d62565b611789565b5b6118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d29061440c565b60405180910390fd5b6118e8858585858561270e565b5050505050565b6118f7611a9f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614abe565b60405180910390fd5b61196f81612371565b50565b61197a611d62565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806119c057506119bf836119ba611d62565b611789565b5b6119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f69061440c565b60405180910390fd5b611a0a8383836129ac565b505050565b60ff60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611aa7611d62565b73ffffffffffffffffffffffffffffffffffffffff16611ac5611236565b73ffffffffffffffffffffffffffffffffffffffff1614611b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1290614b2a565b60405180910390fd5b565b606060678054611b2c90614257565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5890614257565b8015611ba55780601f10611b7a57610100808354040283529160200191611ba5565b820191906000526020600020905b815481529060010190602001808311611b8857829003601f168201915b50505050509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1790614bbc565b60405180910390fd5b6000611c2a611d62565b90506000611c3785612bf4565b90506000611c4485612bf4565b9050611c5583600089858589612c6e565b846065600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb591906149f6565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611d33929190614bdc565b60405180910390a4611d4a83600089858589612f65565b611d5983600089898989612f6d565b50505050505050565b600033905090565b8151835114611dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da590614c77565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1490614d09565b60405180910390fd5b6000611e27611d62565b9050611e37818787878787612c6e565b60005b8451811015611feb576000858281518110611e5857611e576142f4565b5b602002602001015190506000858381518110611e7757611e766142f4565b5b6020026020010151905060006065600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1090614d9b565b60405180910390fd5b8181036065600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816065600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fd091906149f6565b9250508190555050505080611fe490614352565b9050611e3a565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612062929190614dbb565b60405180910390a4612078818787878787612f65565b612086818787878787613144565b505050505050565b806067908161209d9190614df2565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210790614f36565b60405180910390fd5b8051825114612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b90614c77565b60405180910390fd5b600061215e611d62565b905061217e81856000868660405180602001604052806000815250612c6e565b60005b83518110156122cd57600084828151811061219f5761219e6142f4565b5b6020026020010151905060008483815181106121be576121bd6142f4565b5b6020026020010151905060006065600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225790614fc8565b60405180910390fd5b8181036065600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505080806122c590614352565b915050612181565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612345929190614dbb565b60405180910390a461236b81856000868660405180602001604052806000815250612f65565b50505050565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160c960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249c9061505a565b60405180910390fd5b80606660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125969190613589565b60405180910390a3505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16612615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260c906150ec565b60405180910390fd5b61261e8161331b565b50565b600060019054906101000a900460ff16612670576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612667906150ec565b60405180910390fd5b612678613376565b565b6000606660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361277d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277490614d09565b60405180910390fd5b6000612787611d62565b9050600061279485612bf4565b905060006127a185612bf4565b90506127b1838989858589612c6e565b60006065600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284090614d9b565b60405180910390fd5b8581036065600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856065600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290091906149f6565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161297d929190614bdc565b60405180910390a4612993848a8a86868a612f65565b6129a1848a8a8a8a8a612f6d565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1290614f36565b60405180910390fd5b6000612a25611d62565b90506000612a3284612bf4565b90506000612a3f84612bf4565b9050612a5f83876000858560405180602001604052806000815250612c6e565b60006065600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aee90614fc8565b60405180910390fd5b8481036065600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612bc5929190614bdc565b60405180910390a4612beb84886000868660405180602001604052806000815250612f65565b50505050505050565b60606000600167ffffffffffffffff811115612c1357612c1261394a565b5b604051908082528060200260200182016040528015612c415781602001602082028036833780820191505090505b5090508281600081518110612c5957612c586142f4565b5b60200260200101818152505080915050919050565b6000805b8451811015612cef57838181518110612c8e57612c8d6142f4565b5b60200260200101516101006000878481518110612cae57612cad6142f4565b5b6020026020010151815260200190815260200160002054612ccf919061493c565b82612cda91906149f6565b91508080612ce790614352565b915050612c72565b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612e26576000612d2f87611595565b90508061010260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d8191906149f6565b925050819055504261010460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508161010360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e1d9190614908565b92505081905550505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612f5c576000612e6586611595565b90508061010260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eb791906149f6565b925050819055504261010460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508161010360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f5391906149f6565b92505081905550505b50505050505050565b505050505050565b612f8c8473ffffffffffffffffffffffffffffffffffffffff166125a3565b1561313c578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612fd2959493929190615161565b6020604051808303816000875af192505050801561300e57506040513d601f19601f8201168201806040525081019061300b91906151d0565b60015b6130b35761301a61520a565b806308c379a003613076575061302e61522c565b806130395750613078565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306d919061375c565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130aa9061532e565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461313a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613131906153c0565b60405180910390fd5b505b505050505050565b6131638473ffffffffffffffffffffffffffffffffffffffff166125a3565b15613313578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016131a99594939291906153e0565b6020604051808303816000875af19250505080156131e557506040513d601f19601f820116820180604052508101906131e291906151d0565b60015b61328a576131f161520a565b806308c379a00361324d575061320561522c565b80613210575061324f565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613244919061375c565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132819061532e565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613311576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613308906153c0565b60405180910390fd5b505b505050505050565b600060019054906101000a900460ff1661336a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613361906150ec565b60405180910390fd5b6133738161208e565b50565b600060019054906101000a900460ff166133c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133bc906150ec565b60405180910390fd5b6133d56133d0611d62565b612371565b565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613416826133eb565b9050919050565b6134268161340b565b811461343157600080fd5b50565b6000813590506134438161341d565b92915050565b6000819050919050565b61345c81613449565b811461346757600080fd5b50565b60008135905061347981613453565b92915050565b60008060408385031215613496576134956133e1565b5b60006134a485828601613434565b92505060206134b58582860161346a565b9150509250929050565b6134c881613449565b82525050565b60006020820190506134e360008301846134bf565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61351e816134e9565b811461352957600080fd5b50565b60008135905061353b81613515565b92915050565b600060208284031215613557576135566133e1565b5b60006135658482850161352c565b91505092915050565b60008115159050919050565b6135838161356e565b82525050565b600060208201905061359e600083018461357a565b92915050565b6000602082840312156135ba576135b96133e1565b5b60006135c884828501613434565b91505092915050565b6000602082840312156135e7576135e66133e1565b5b60006135f58482850161346a565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613623576136226135fe565b5b8235905067ffffffffffffffff8111156136405761363f613603565b5b60208301915083600182028301111561365c5761365b613608565b5b9250929050565b60008060006040848603121561367c5761367b6133e1565b5b600084013567ffffffffffffffff81111561369a576136996133e6565b5b6136a68682870161360d565b935093505060206136b98682870161346a565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60005b838110156136fd5780820151818401526020810190506136e2565b8381111561370c576000848401525b50505050565b6000601f19601f8301169050919050565b600061372e826136c3565b61373881856136ce565b93506137488185602086016136df565b61375181613712565b840191505092915050565b600060208201905081810360008301526137768184613723565b905092915050565b6137878161356e565b811461379257600080fd5b50565b6000813590506137a48161377e565b92915050565b600080604083850312156137c1576137c06133e1565b5b60006137cf85828601613434565b92505060206137e085828601613795565b9150509250929050565b60008083601f840112613800576137ff6135fe565b5b8235905067ffffffffffffffff81111561381d5761381c613603565b5b60208301915083602082028301111561383957613838613608565b5b9250929050565b60008083601f840112613856576138556135fe565b5b8235905067ffffffffffffffff81111561387357613872613603565b5b60208301915083602082028301111561388f5761388e613608565b5b9250929050565b600080600080600080606087890312156138b3576138b26133e1565b5b600087013567ffffffffffffffff8111156138d1576138d06133e6565b5b6138dd89828a016137ea565b9650965050602087013567ffffffffffffffff811115613900576138ff6133e6565b5b61390c89828a01613840565b9450945050604087013567ffffffffffffffff81111561392f5761392e6133e6565b5b61393b89828a01613840565b92509250509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61398282613712565b810181811067ffffffffffffffff821117156139a1576139a061394a565b5b80604052505050565b60006139b46133d7565b90506139c08282613979565b919050565b600067ffffffffffffffff8211156139e0576139df61394a565b5b602082029050602081019050919050565b6000613a046139ff846139c5565b6139aa565b90508083825260208201905060208402830185811115613a2757613a26613608565b5b835b81811015613a505780613a3c888261346a565b845260208401935050602081019050613a29565b5050509392505050565b600082601f830112613a6f57613a6e6135fe565b5b8135613a7f8482602086016139f1565b91505092915050565b600080fd5b600067ffffffffffffffff821115613aa857613aa761394a565b5b613ab182613712565b9050602081019050919050565b82818337600083830152505050565b6000613ae0613adb84613a8d565b6139aa565b905082815260208101848484011115613afc57613afb613a88565b5b613b07848285613abe565b509392505050565b600082601f830112613b2457613b236135fe565b5b8135613b34848260208601613acd565b91505092915050565b600080600080600060a08688031215613b5957613b586133e1565b5b6000613b6788828901613434565b9550506020613b7888828901613434565b945050604086013567ffffffffffffffff811115613b9957613b986133e6565b5b613ba588828901613a5a565b935050606086013567ffffffffffffffff811115613bc657613bc56133e6565b5b613bd288828901613a5a565b925050608086013567ffffffffffffffff811115613bf357613bf26133e6565b5b613bff88828901613b0f565b9150509295509295909350565b600067ffffffffffffffff821115613c2757613c2661394a565b5b602082029050602081019050919050565b6000613c4b613c4684613c0c565b6139aa565b90508083825260208201905060208402830185811115613c6e57613c6d613608565b5b835b81811015613c975780613c838882613434565b845260208401935050602081019050613c70565b5050509392505050565b600082601f830112613cb657613cb56135fe565b5b8135613cc6848260208601613c38565b91505092915050565b60008060408385031215613ce657613ce56133e1565b5b600083013567ffffffffffffffff811115613d0457613d036133e6565b5b613d1085828601613ca1565b925050602083013567ffffffffffffffff811115613d3157613d306133e6565b5b613d3d85828601613a5a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d7c81613449565b82525050565b6000613d8e8383613d73565b60208301905092915050565b6000602082019050919050565b6000613db282613d47565b613dbc8185613d52565b9350613dc783613d63565b8060005b83811015613df8578151613ddf8882613d82565b9750613dea83613d9a565b925050600181019050613dcb565b5085935050505092915050565b60006020820190508181036000830152613e1f8184613da7565b905092915050565b60008060208385031215613e3e57613e3d6133e1565b5b600083013567ffffffffffffffff811115613e5c57613e5b6133e6565b5b613e688582860161360d565b92509250509250929050565b600080600060608486031215613e8d57613e8c6133e1565b5b6000613e9b86828701613434565b935050602084013567ffffffffffffffff811115613ebc57613ebb6133e6565b5b613ec886828701613a5a565b925050604084013567ffffffffffffffff811115613ee957613ee86133e6565b5b613ef586828701613a5a565b9150509250925092565b613f088161340b565b82525050565b6000602082019050613f236000830184613eff565b92915050565b60008060408385031215613f4057613f3f6133e1565b5b6000613f4e8582860161346a565b9250506020613f5f8582860161346a565b9150509250929050565b600080600060408486031215613f8257613f816133e1565b5b600084013567ffffffffffffffff811115613fa057613f9f6133e6565b5b613fac868287016137ea565b93509350506020613fbf8682870161346a565b9150509250925092565b60008060408385031215613fe057613fdf6133e1565b5b6000613fee85828601613434565b9250506020613fff85828601613434565b9150509250929050565b600080600080600060a08688031215614025576140246133e1565b5b600061403388828901613434565b955050602061404488828901613434565b94505060406140558882890161346a565b93505060606140668882890161346a565b925050608086013567ffffffffffffffff811115614087576140866133e6565b5b61409388828901613b0f565b9150509295509295909350565b6000806000606084860312156140b9576140b86133e1565b5b60006140c786828701613434565b93505060206140d88682870161346a565b92505060406140e98682870161346a565b9150509250925092565b6000819050919050565b600061411861411361410e846133eb565b6140f3565b6133eb565b9050919050565b600061412a826140fd565b9050919050565b600061413c8261411f565b9050919050565b61414c81614131565b82525050565b60006020820190506141676000830184614143565b92915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006141c9602a836136ce565b91506141d48261416d565b604082019050919050565b600060208201905081810360008301526141f8816141bc565b9050919050565b60006040820190506142146000830185613eff565b61422160208301846134bf565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061426f57607f821691505b60208210810361428257614281614228565b5b50919050565b7f426164206172726179206c656e67746873000000000000000000000000000000600082015250565b60006142be6011836136ce565b91506142c982614288565b602082019050919050565b600060208201905081810360008301526142ed816142b1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061435d82613449565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361438f5761438e614323565b5b600182019050919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b60006143f6602e836136ce565b91506144018261439a565b604082019050919050565b60006020820190508181036000830152614425816143e9565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006144886029836136ce565b91506144938261442c565b604082019050919050565b600060208201905081810360008301526144b78161447b565b9050919050565b7f467265657a656400000000000000000000000000000000000000000000000000600082015250565b60006144f46007836136ce565b91506144ff826144be565b602082019050919050565b60006020820190508181036000830152614523816144e7565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026145977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261455a565b6145a1868361455a565b95508019841693508086168417925050509392505050565b60006145d46145cf6145ca84613449565b6140f3565b613449565b9050919050565b6000819050919050565b6145ee836145b9565b6146026145fa826145db565b848454614567565b825550505050565b600090565b61461761460a565b6146228184846145e5565b505050565b5b818110156146465761463b60008261460f565b600181019050614628565b5050565b601f82111561468b5761465c81614535565b6146658461454a565b81016020851015614674578190505b6146886146808561454a565b830182614627565b50505b505050565b600082821c905092915050565b60006146ae60001984600802614690565b1980831691505092915050565b60006146c7838361469d565b9150826002028217905092915050565b6146e1838361452a565b67ffffffffffffffff8111156146fa576146f961394a565b5b6147048254614257565b61470f82828561464a565b6000601f83116001811461473e576000841561472c578287013590505b61473685826146bb565b86555061479e565b601f19841661474c86614535565b60005b828110156147745784890135825560018201915060208501945060208101905061474f565b86831015614791578489013561478d601f89168261469d565b8355505b6001600288020188555050505b50505050505050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000614803602e836136ce565b915061480e826147a7565b604082019050919050565b60006020820190508181036000830152614832816147f6565b9050919050565b6000819050919050565b600060ff82169050919050565b600061486b61486661486184614839565b6140f3565b614843565b9050919050565b61487b81614850565b82525050565b60006020820190506148966000830184614872565b92915050565b7f4e6f742073746172746564000000000000000000000000000000000000000000600082015250565b60006148d2600b836136ce565b91506148dd8261489c565b602082019050919050565b60006020820190508181036000830152614901816148c5565b9050919050565b600061491382613449565b915061491e83613449565b92508282101561493157614930614323565b5b828203905092915050565b600061494782613449565b915061495283613449565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561498b5761498a614323565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149d082613449565b91506149db83613449565b9250826149eb576149ea614996565b5b828204905092915050565b6000614a0182613449565b9150614a0c83613449565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a4157614a40614323565b5b828201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614aa86026836136ce565b9150614ab382614a4c565b604082019050919050565b60006020820190508181036000830152614ad781614a9b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614b146020836136ce565b9150614b1f82614ade565b602082019050919050565b60006020820190508181036000830152614b4381614b07565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ba66021836136ce565b9150614bb182614b4a565b604082019050919050565b60006020820190508181036000830152614bd581614b99565b9050919050565b6000604082019050614bf160008301856134bf565b614bfe60208301846134bf565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614c616028836136ce565b9150614c6c82614c05565b604082019050919050565b60006020820190508181036000830152614c9081614c54565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614cf36025836136ce565b9150614cfe82614c97565b604082019050919050565b60006020820190508181036000830152614d2281614ce6565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614d85602a836136ce565b9150614d9082614d29565b604082019050919050565b60006020820190508181036000830152614db481614d78565b9050919050565b60006040820190508181036000830152614dd58185613da7565b90508181036020830152614de98184613da7565b90509392505050565b614dfb826136c3565b67ffffffffffffffff811115614e1457614e1361394a565b5b614e1e8254614257565b614e2982828561464a565b600060209050601f831160018114614e5c5760008415614e4a578287015190505b614e5485826146bb565b865550614ebc565b601f198416614e6a86614535565b60005b82811015614e9257848901518255600182019150602085019450602081019050614e6d565b86831015614eaf5784890151614eab601f89168261469d565b8355505b6001600288020188555050505b505050505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614f206023836136ce565b9150614f2b82614ec4565b604082019050919050565b60006020820190508181036000830152614f4f81614f13565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000614fb26024836136ce565b9150614fbd82614f56565b604082019050919050565b60006020820190508181036000830152614fe181614fa5565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006150446029836136ce565b915061504f82614fe8565b604082019050919050565b6000602082019050818103600083015261507381615037565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b60006150d6602b836136ce565b91506150e18261507a565b604082019050919050565b60006020820190508181036000830152615105816150c9565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006151338261510c565b61513d8185615117565b935061514d8185602086016136df565b61515681613712565b840191505092915050565b600060a0820190506151766000830188613eff565b6151836020830187613eff565b61519060408301866134bf565b61519d60608301856134bf565b81810360808301526151af8184615128565b90509695505050505050565b6000815190506151ca81613515565b92915050565b6000602082840312156151e6576151e56133e1565b5b60006151f4848285016151bb565b91505092915050565b60008160e01c9050919050565b600060033d11156152295760046000803e6152266000516151fd565b90505b90565b600060443d106152b95761523e6133d7565b60043d036004823e80513d602482011167ffffffffffffffff821117156152665750506152b9565b808201805167ffffffffffffffff81111561528457505050506152b9565b80602083010160043d0385018111156152a15750505050506152b9565b6152b082602001850186613979565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006153186034836136ce565b9150615323826152bc565b604082019050919050565b600060208201905081810360008301526153478161530b565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006153aa6028836136ce565b91506153b58261534e565b604082019050919050565b600060208201905081810360008301526153d98161539d565b9050919050565b600060a0820190506153f56000830188613eff565b6154026020830187613eff565b81810360408301526154148186613da7565b905081810360608301526154288185613da7565b9050818103608083015261543c8184615128565b9050969550505050505056fea2646970667358221220a68b308162fd2cc23a46b1dabfee7f0e015e2508d24859a84bcedccb41d8199464736f6c634300080f0033

Deployed Bytecode Sourcemap

50144:7678:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32432:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31411:354;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54143:312;;;:::i;:::-;;51081:62;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50874:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56586:76;;;:::i;:::-;;57379:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56043:274;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50250:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51322:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50415:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54953:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55181:445;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34375:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50514:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51497:58;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32828:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54509:98;;;:::i;:::-;;56384:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49301:358;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18832:103;;;:::i;:::-;;51587:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18184:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51203:59;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50777:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56946:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33425:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50337:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56738:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54664:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57194:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51701:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53368:470;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55697:298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51431:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57619:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53907:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33892:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19090:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48967:326;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50709:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32432:230;32518:7;32565:1;32546:21;;:7;:21;;;32538:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;32632:9;:13;32642:2;32632:13;;;;;;;;;;;:22;32646:7;32632:22;;;;;;;;;;;;;;;;32625:29;;32432:230;;;;:::o;31411:354::-;31535:4;31587:37;31572:52;;;:11;:52;;;;:132;;;;31656:48;31641:63;;;:11;:63;;;;31572:132;:185;;;;31721:36;31745:11;31721:23;:36::i;:::-;31572:185;31552:205;;31411:354;;;:::o;54143:312::-;54192:24;54219:38;54246:10;54219:26;:38::i;:::-;54192:65;;54311:1;54270:26;:38;54297:10;54270:38;;;;;;;;;;;;;;;:42;;;;54366:15;54323:28;:40;54352:10;54323:40;;;;;;;;;;;;;;;:58;;;;54394:5;;;;;;;;;;;:23;;;54418:10;54430:16;54394:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54181:274;54143:312::o;51081:62::-;;;;;;;;;;;;;;;;;:::o;50874:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;56586:76::-;18070:13;:11;:13::i;:::-;56650:4:::1;56635:12;;:19;;;;;;;;;;;;;;;;;;56586:76::o:0;57379:175::-;18070:13;:11;:13::i;:::-;57479:32:::1;57496:6;;57504;57479:16;:32::i;:::-;57522:24;57539:6;57522:16;:24::i;:::-;57379:175:::0;;;:::o;56043:274::-;56102:13;56128:21;56152:9;:17;56162:6;56152:17;;;;;;;;;;;56128:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56209:1;56190:7;56184:21;:26;56180:130;;56234:17;56244:6;56234:9;:17::i;:::-;56227:24;;;;;56180:130;56291:7;56284:14;;;56043:274;;;;:::o;50250:44::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51322:64::-;;;;;;;;;;;;;;;;;:::o;50415:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;54953:152::-;18070:13;:11;:13::i;:::-;55055:5:::1;55032:14;:20;55047:4;55032:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;55092:4;55076:21;;;;;;;;;;;;54953:152:::0;;:::o;55181:445::-;18070:13;:11;:13::i;:::-;55333:5:::1;;:12;;55316:6;;:13;;:29;:62;;;;;55365:6;;:13;;55349:5;;:12;;:29;55316:62;55308:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;55425:9;55420:199;55444:6;;:13;;55440:1;:17;55420:199;;;55480:11;:21;55492:5;;55498:1;55492:8;;;;;;;:::i;:::-;;;;;;;;55480:21;;;;;;;;;;;;;;;;;;;;;55475:83;;55542:4;55518:11;:21;55530:5;;55536:1;55530:8;;;;;;;:::i;:::-;;;;;;;;55518:21;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;55475:83;55568:41;55574:6;;55581:1;55574:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55585:5;;55591:1;55585:8;;;;;;;:::i;:::-;;;;;;;;55595:6;;55602:1;55595:9;;;;;;;:::i;:::-;;;;;;;;55568:41;;;;;;;;;;;::::0;:5:::1;:41::i;:::-;55459:3;;;;;:::i;:::-;;;;55420:199;;;;55181:445:::0;;;;;;:::o;34375:438::-;34616:12;:10;:12::i;:::-;34608:20;;:4;:20;;;:60;;;;34632:36;34649:4;34655:12;:10;:12::i;:::-;34632:16;:36::i;:::-;34608:60;34586:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;34753:52;34776:4;34782:2;34786:3;34791:7;34800:4;34753:22;:52::i;:::-;34375:438;;;;;:::o;50514:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;51497:58::-;51545:10;51497:58;:::o;32828:524::-;32984:16;33045:3;:10;33026:8;:15;:29;33018:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;33114:30;33161:8;:15;33147:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33114:63;;33195:9;33190:122;33214:8;:15;33210:1;:19;33190:122;;;33270:30;33280:8;33289:1;33280:11;;;;;;;;:::i;:::-;;;;;;;;33293:3;33297:1;33293:6;;;;;;;;:::i;:::-;;;;;;;;33270:9;:30::i;:::-;33251:13;33265:1;33251:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;33231:3;;;;:::i;:::-;;;33190:122;;;;33331:13;33324:20;;;32828:524;;;;:::o;54509:98::-;18070:13;:11;:13::i;:::-;54584:15:::1;54567:14;:32;;;;54509:98::o:0;56384:138::-;18070:13;:11;:13::i;:::-;56464:12:::1;;;;;;;;;;;56463:13;56455:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;56499:15;56507:6;;56499:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:15::i;:::-;56384:138:::0;;:::o;49301:358::-;49477:12;:10;:12::i;:::-;49466:23;;:7;:23;;;:66;;;;49493:39;49510:7;49519:12;:10;:12::i;:::-;49493:16;:39::i;:::-;49466:66;49444:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;49619:32;49630:7;49639:3;49644:6;49619:10;:32::i;:::-;49301:358;;;:::o;18832:103::-;18070:13;:11;:13::i;:::-;18897:30:::1;18924:1;18897:18;:30::i;:::-;18832:103::o:0;51587:49::-;51629:7;51587:49;:::o;18184:87::-;18230:7;18257:6;;;;;;;;;;;18250:13;;18184:87;:::o;51203:59::-;;;;;;;;;;;;;;;;;:::o;50777:46::-;;;;;;;;;;;;;;;;;:::o;56946:184::-;18070:13;:11;:13::i;:::-;57049:16:::1;:24;57066:6;57049:24;;;;;;;;;;;;;;;;;;;;;57048:25;57040:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;57116:6;;57096:9;:17;57106:6;57096:17;;;;;;;;;;;:26;;;;;;;:::i;:::-;;56946:184:::0;;;:::o;33425:155::-;33520:52;33539:12;:10;:12::i;:::-;33553:8;33563;33520:18;:52::i;:::-;33425:155;;:::o;50337:24::-;;;;;;;;;;;;;:::o;56738:124::-;18070:13;:11;:13::i;:::-;56815:17:::1;56825:6;;56815:9;:17::i;:::-;56843:11;:9;:11::i;:::-;56738:124:::0;;:::o;54664:224::-;18070:13;:11;:13::i;:::-;54832:4:::1;54811:10;:18;54822:6;54811:18;;;;;;;;;;;:25;;;;54867:6;54852:28;54875:4;54852:28;;;;;;:::i;:::-;;;;;;;;54664:224:::0;;:::o;57194:109::-;18070:13;:11;:13::i;:::-;57291:4:::1;57264:16;:24;57281:6;57264:24;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;57194:109:::0;:::o;51701:171::-;11901:19;11924:13;;;;;;;;;;;11923:14;11901:36;;11971:14;:34;;;;;12004:1;11989:12;;;;;;;;;;:16;;;11971:34;11970:108;;;;12012:44;12050:4;12012:29;:44::i;:::-;12011:45;:66;;;;;12076:1;12060:12;;;;;;;;;;:17;;;12011:66;11970:108;11948:204;;;;;;;;;;;;:::i;:::-;;;;;;;;;12178:1;12163:12;;:16;;;;;;;;;;;;;;;;;;12194:14;12190:67;;;12241:4;12225:13;;:20;;;;;;;;;;;;;;;;;;12190:67;51774:18:::1;;;;;;;;;;;;::::0;:14:::1;:18::i;:::-;51803:16;:14;:16::i;:::-;51850:13;51830:5;;:34;;;;;;;;;;;;;;;;;;12283:14:::0;12279:102;;;12330:5;12314:13;;:21;;;;;;;;;;;;;;;;;;12355:14;12367:1;12355:14;;;;;;:::i;:::-;;;;;;;;12279:102;11890:498;51701:171;:::o;53368:470::-;53438:7;53482:1;53465:14;;:18;53457:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;53512:18;53533:28;:36;53562:6;53533:36;;;;;;;;;;;;;;;;53512:57;;53580:16;53631:1;53618:10;:14;:44;;53648:14;;53618:44;;;53635:10;53618:44;53599:15;:64;;;;:::i;:::-;53580:83;;51545:10;53685:8;:32;:67;;53744:8;53685:67;;;51545:10;53685:67;53674:78;;51629:7;53781:23;:31;53805:6;53781:31;;;;;;;;;;;;;;;;53770:8;:42;;;;:::i;:::-;:60;;;;:::i;:::-;53763:67;;;;53368:470;;;:::o;55697:298::-;18070:13;:11;:13::i;:::-;55802:11:::1;:19;55814:6;55802:19;;;;;;;;;;;;;;;;;;;;;55797:79;;55860:4;55838:11;:19;55850:6;55838:19;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;55797:79;55891:9;55886:102;55910:6;;:13;;55906:1;:17;55886:102;;;55945:31;55951:6;;55958:1;55951:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55962:6;55970:1;55945:31;;;;;;;;;;;::::0;:5:::1;:31::i;:::-;55925:3;;;;;:::i;:::-;;;;55886:102;;;;55697:298:::0;;;:::o;51431:29::-;;;;:::o;57619:200::-;57718:4;57742:14;:24;57757:8;57742:24;;;;;;;;;;;;;;;;;;;;;;;;;:69;;;;57770:41;57793:7;57802:8;57770:22;:41::i;:::-;57742:69;57735:76;;57619:200;;;;:::o;53907:175::-;53980:7;54040:26;:34;54067:6;54040:34;;;;;;;;;;;;;;;;54006:31;54030:6;54006:23;:31::i;:::-;:68;;;;:::i;:::-;53999:75;;53907:175;;;:::o;33892:406::-;34108:12;:10;:12::i;:::-;34100:20;;:4;:20;;;:60;;;;34124:36;34141:4;34147:12;:10;:12::i;:::-;34124:16;:36::i;:::-;34100:60;34078:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;34245:45;34263:4;34269:2;34273;34277:6;34285:4;34245:17;:45::i;:::-;33892:406;;;;;:::o;19090:201::-;18070:13;:11;:13::i;:::-;19199:1:::1;19179:22;;:8;:22;;::::0;19171:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19255:28;19274:8;19255:18;:28::i;:::-;19090:201:::0;:::o;48967:326::-;49118:12;:10;:12::i;:::-;49107:23;;:7;:23;;;:66;;;;49134:39;49151:7;49160:12;:10;:12::i;:::-;49134:16;:39::i;:::-;49107:66;49085:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;49260:25;49266:7;49275:2;49279:5;49260;:25::i;:::-;48967:326;;;:::o;50709:24::-;;;;;;;;;;;;;:::o;21967:168::-;22052:4;22091:36;22076:51;;;:11;:51;;;;22069:58;;21967:168;;;:::o;18349:132::-;18424:12;:10;:12::i;:::-;18413:23;;:7;:5;:7::i;:::-;:23;;;18405:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18349:132::o;32176:105::-;32236:13;32269:4;32262:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32176:105;;;:::o;39073:729::-;39240:1;39226:16;;:2;:16;;;39218:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;39293:16;39312:12;:10;:12::i;:::-;39293:31;;39335:20;39358:21;39376:2;39358:17;:21::i;:::-;39335:44;;39390:24;39417:25;39435:6;39417:17;:25::i;:::-;39390:52;;39455:66;39476:8;39494:1;39498:2;39502:3;39507:7;39516:4;39455:20;:66::i;:::-;39555:6;39534:9;:13;39544:2;39534:13;;;;;;;;;;;:17;39548:2;39534:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;39614:2;39577:52;;39610:1;39577:52;;39592:8;39577:52;;;39618:2;39622:6;39577:52;;;;;;;:::i;:::-;;;;;;;;39642:65;39662:8;39680:1;39684:2;39688:3;39693:7;39702:4;39642:19;:65::i;:::-;39720:74;39751:8;39769:1;39773:2;39777;39781:6;39789:4;39720:30;:74::i;:::-;39207:595;;;39073:729;;;;:::o;16222:98::-;16275:7;16302:10;16295:17;;16222:98;:::o;36609:1146::-;36836:7;:14;36822:3;:10;:28;36814:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;36928:1;36914:16;;:2;:16;;;36906:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;36985:16;37004:12;:10;:12::i;:::-;36985:31;;37029:60;37050:8;37060:4;37066:2;37070:3;37075:7;37084:4;37029:20;:60::i;:::-;37107:9;37102:421;37126:3;:10;37122:1;:14;37102:421;;;37158:10;37171:3;37175:1;37171:6;;;;;;;;:::i;:::-;;;;;;;;37158:19;;37192:14;37209:7;37217:1;37209:10;;;;;;;;:::i;:::-;;;;;;;;37192:27;;37236:19;37258:9;:13;37268:2;37258:13;;;;;;;;;;;:19;37272:4;37258:19;;;;;;;;;;;;;;;;37236:41;;37315:6;37300:11;:21;;37292:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37448:6;37434:11;:20;37412:9;:13;37422:2;37412:13;;;;;;;;;;;:19;37426:4;37412:19;;;;;;;;;;;;;;;:42;;;;37505:6;37484:9;:13;37494:2;37484:13;;;;;;;;;;;:17;37498:2;37484:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;37143:380;;;37138:3;;;;:::i;:::-;;;37102:421;;;;37570:2;37540:47;;37564:4;37540:47;;37554:8;37540:47;;;37574:3;37579:7;37540:47;;;;;;;:::i;:::-;;;;;;;;37600:59;37620:8;37630:4;37636:2;37640:3;37645:7;37654:4;37600:19;:59::i;:::-;37672:75;37708:8;37718:4;37724:2;37728:3;37733:7;37742:4;37672:35;:75::i;:::-;36803:952;36609:1146;;;;;:::o;38599:88::-;38673:6;38666:4;:13;;;;;;:::i;:::-;;38599:88;:::o;42374:969::-;42542:1;42526:18;;:4;:18;;;42518:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;42617:7;:14;42603:3;:10;:28;42595:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42689:16;42708:12;:10;:12::i;:::-;42689:31;;42733:66;42754:8;42764:4;42778:1;42782:3;42787:7;42733:66;;;;;;;;;;;;:20;:66::i;:::-;42817:9;42812:373;42836:3;:10;42832:1;:14;42812:373;;;42868:10;42881:3;42885:1;42881:6;;;;;;;;:::i;:::-;;;;;;;;42868:19;;42902:14;42919:7;42927:1;42919:10;;;;;;;;:::i;:::-;;;;;;;;42902:27;;42946:19;42968:9;:13;42978:2;42968:13;;;;;;;;;;;:19;42982:4;42968:19;;;;;;;;;;;;;;;;42946:41;;43025:6;43010:11;:21;;43002:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;43152:6;43138:11;:20;43116:9;:13;43126:2;43116:13;;;;;;;;;;;:19;43130:4;43116:19;;;;;;;;;;;;;;;:42;;;;42853:332;;;42848:3;;;;;:::i;:::-;;;;42812:373;;;;43240:1;43202:55;;43226:4;43202:55;;43216:8;43202:55;;;43244:3;43249:7;43202:55;;;;;;;:::i;:::-;;;;;;;;43270:65;43290:8;43300:4;43314:1;43318:3;43323:7;43270:65;;;;;;;;;;;;:19;:65::i;:::-;42507:836;42374:969;;;:::o;19451:191::-;19525:16;19544:6;;;;;;;;;;;19525:25;;19570:8;19561:6;;:17;;;;;;;;;;;;;;;;;;19625:8;19594:40;;19615:8;19594:40;;;;;;;;;;;;19514:128;19451:191;:::o;43486:331::-;43641:8;43632:17;;:5;:17;;;43624:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43744:8;43706:18;:25;43725:5;43706:25;;;;;;;;;;;;;;;:35;43732:8;43706:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;43790:8;43768:41;;43783:5;43768:41;;;43800:8;43768:41;;;;;;:::i;:::-;;;;;;;;43486:331;;;:::o;1267:326::-;1327:4;1584:1;1562:7;:19;;;:23;1555:30;;1267:326;;;:::o;31100:119::-;14044:13;;;;;;;;;;;14036:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;31181:30:::1;31206:4;31181:24;:30::i;:::-;31100:119:::0;:::o;17727:97::-;14044:13;;;;;;;;;;;14036:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;17790:26:::1;:24;:26::i;:::-;17727:97::o:0;33652:168::-;33751:4;33775:18;:27;33794:7;33775:27;;;;;;;;;;;;;;;:37;33803:8;33775:37;;;;;;;;;;;;;;;;;;;;;;;;;33768:44;;33652:168;;;;:::o;35277:974::-;35479:1;35465:16;;:2;:16;;;35457:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;35536:16;35555:12;:10;:12::i;:::-;35536:31;;35578:20;35601:21;35619:2;35601:17;:21::i;:::-;35578:44;;35633:24;35660:25;35678:6;35660:17;:25::i;:::-;35633:52;;35698:60;35719:8;35729:4;35735:2;35739:3;35744:7;35753:4;35698:20;:60::i;:::-;35771:19;35793:9;:13;35803:2;35793:13;;;;;;;;;;;:19;35807:4;35793:19;;;;;;;;;;;;;;;;35771:41;;35846:6;35831:11;:21;;35823:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35971:6;35957:11;:20;35935:9;:13;35945:2;35935:13;;;;;;;;;;;:19;35949:4;35935:19;;;;;;;;;;;;;;;:42;;;;36020:6;35999:9;:13;36009:2;35999:13;;;;;;;;;;;:17;36013:2;35999:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;36075:2;36044:46;;36069:4;36044:46;;36059:8;36044:46;;;36079:2;36083:6;36044:46;;;;;;;:::i;:::-;;;;;;;;36103:59;36123:8;36133:4;36139:2;36143:3;36148:7;36157:4;36103:19;:59::i;:::-;36175:68;36206:8;36216:4;36222:2;36226;36230:6;36238:4;36175:30;:68::i;:::-;35446:805;;;;35277:974;;;;;:::o;41316:808::-;41459:1;41443:18;;:4;:18;;;41435:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41514:16;41533:12;:10;:12::i;:::-;41514:31;;41556:20;41579:21;41597:2;41579:17;:21::i;:::-;41556:44;;41611:24;41638:25;41656:6;41638:17;:25::i;:::-;41611:52;;41676:66;41697:8;41707:4;41721:1;41725:3;41730:7;41676:66;;;;;;;;;;;;:20;:66::i;:::-;41755:19;41777:9;:13;41787:2;41777:13;;;;;;;;;;;:19;41791:4;41777:19;;;;;;;;;;;;;;;;41755:41;;41830:6;41815:11;:21;;41807:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;41949:6;41935:11;:20;41913:9;:13;41923:2;41913:13;;;;;;;;;;;:19;41927:4;41913:19;;;;;;;;;;;;;;;:42;;;;42023:1;41984:54;;42009:4;41984:54;;41999:8;41984:54;;;42027:2;42031:6;41984:54;;;;;;;:::i;:::-;;;;;;;;42051:65;42071:8;42081:4;42095:1;42099:3;42104:7;42051:65;;;;;;;;;;;;:19;:65::i;:::-;41424:700;;;;41316:808;;;:::o;47796:198::-;47862:16;47891:22;47930:1;47916:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47891:41;;47954:7;47943:5;47949:1;47943:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;47981:5;47974:12;;;47796:198;;;:::o;51982:1307::-;52221:23;52264:9;52259:114;52279:3;:10;52277:1;:12;52259:114;;;52351:7;52359:1;52351:10;;;;;;;;:::i;:::-;;;;;;;;52330;:18;52341:3;52345:1;52341:6;;;;;;;;:::i;:::-;;;;;;;;52330:18;;;;;;;;;;;;:31;;;;:::i;:::-;52311:50;;;;;:::i;:::-;;;52291:3;;;;;:::i;:::-;;;;52259:114;;;;52405:1;52389:18;;:4;:18;;;52385:448;;52470:20;52493:29;52517:4;52493:23;:29::i;:::-;52470:52;;52643:12;52607:26;:32;52634:4;52607:32;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;52707:15;52670:28;:34;52699:4;52670:34;;;;;;;;;;;;;;;:52;;;;52806:15;52773:23;:29;52797:4;52773:29;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;52409:424;52385:448;52863:1;52849:16;;:2;:16;;;52845:437;;52927:20;52950:27;52974:2;52950:23;:27::i;:::-;52927:50;;53096:12;53062:26;:30;53089:2;53062:30;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;53158:15;53123:28;:32;53152:2;53123:32;;;;;;;;;;;;;;;:50;;;;53255:15;53224:23;:27;53248:2;53224:27;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;52867:415;52845:437;52210:1079;51982:1307;;;;;;:::o;45951:220::-;;;;;;;:::o;46179:766::-;46394:15;:2;:13;;;:15::i;:::-;46390:548;;;46458:2;46430:49;;;46480:8;46490:4;46496:2;46500:6;46508:4;46430:83;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46426:501;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;46800:6;46793:14;;;;;;;;;;;:::i;:::-;;;;;;;;46426:501;;;46849:62;;;;;;;;;;:::i;:::-;;;;;;;;46426:501;46575:54;;;46563:66;;;:8;:66;;;;46559:165;;46654:50;;;;;;;;;;:::i;:::-;;;;;;;;46559:165;46514:225;46390:548;46179:766;;;;;;:::o;46953:835::-;47193:15;:2;:13;;;:15::i;:::-;47189:592;;;47257:2;47229:54;;;47284:8;47294:4;47300:3;47305:7;47314:4;47229:90;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47225:545;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;47643:6;47636:14;;;;;;;;;;;:::i;:::-;;;;;;;;47225:545;;;47692:62;;;;;;;;;;:::i;:::-;;;;;;;;47225:545;47413:59;;;47401:71;;;:8;:71;;;;47397:170;;47497:50;;;;;;;;;;:::i;:::-;;;;;;;;47397:170;47320:262;47189:592;46953:835;;;;;;:::o;31227:112::-;14044:13;;;;;;;;;;;14036:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;31318:13:::1;31326:4;31318:7;:13::i;:::-;31227:112:::0;:::o;17832:113::-;14044:13;;;;;;;;;;;14036:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;17905:32:::1;17924:12;:10;:12::i;:::-;17905:18;:32::i;:::-;17832:113::o:0;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:329::-;3272:6;3321:2;3309:9;3300:7;3296:23;3292:32;3289:119;;;3327:79;;:::i;:::-;3289:119;3447:1;3472:53;3517:7;3508:6;3497:9;3493:22;3472:53;:::i;:::-;3462:63;;3418:117;3213:329;;;;:::o;3548:::-;3607:6;3656:2;3644:9;3635:7;3631:23;3627:32;3624:119;;;3662:79;;:::i;:::-;3624:119;3782:1;3807:53;3852:7;3843:6;3832:9;3828:22;3807:53;:::i;:::-;3797:63;;3753:117;3548:329;;;;:::o;3883:117::-;3992:1;3989;3982:12;4006:117;4115:1;4112;4105:12;4129:117;4238:1;4235;4228:12;4266:553;4324:8;4334:6;4384:3;4377:4;4369:6;4365:17;4361:27;4351:122;;4392:79;;:::i;:::-;4351:122;4505:6;4492:20;4482:30;;4535:18;4527:6;4524:30;4521:117;;;4557:79;;:::i;:::-;4521:117;4671:4;4663:6;4659:17;4647:29;;4725:3;4717:4;4709:6;4705:17;4695:8;4691:32;4688:41;4685:128;;;4732:79;;:::i;:::-;4685:128;4266:553;;;;;:::o;4825:674::-;4905:6;4913;4921;4970:2;4958:9;4949:7;4945:23;4941:32;4938:119;;;4976:79;;:::i;:::-;4938:119;5124:1;5113:9;5109:17;5096:31;5154:18;5146:6;5143:30;5140:117;;;5176:79;;:::i;:::-;5140:117;5289:65;5346:7;5337:6;5326:9;5322:22;5289:65;:::i;:::-;5271:83;;;;5067:297;5403:2;5429:53;5474:7;5465:6;5454:9;5450:22;5429:53;:::i;:::-;5419:63;;5374:118;4825:674;;;;;:::o;5505:99::-;5557:6;5591:5;5585:12;5575:22;;5505:99;;;:::o;5610:169::-;5694:11;5728:6;5723:3;5716:19;5768:4;5763:3;5759:14;5744:29;;5610:169;;;;:::o;5785:307::-;5853:1;5863:113;5877:6;5874:1;5871:13;5863:113;;;5962:1;5957:3;5953:11;5947:18;5943:1;5938:3;5934:11;5927:39;5899:2;5896:1;5892:10;5887:15;;5863:113;;;5994:6;5991:1;5988:13;5985:101;;;6074:1;6065:6;6060:3;6056:16;6049:27;5985:101;5834:258;5785:307;;;:::o;6098:102::-;6139:6;6190:2;6186:7;6181:2;6174:5;6170:14;6166:28;6156:38;;6098:102;;;:::o;6206:364::-;6294:3;6322:39;6355:5;6322:39;:::i;:::-;6377:71;6441:6;6436:3;6377:71;:::i;:::-;6370:78;;6457:52;6502:6;6497:3;6490:4;6483:5;6479:16;6457:52;:::i;:::-;6534:29;6556:6;6534:29;:::i;:::-;6529:3;6525:39;6518:46;;6298:272;6206:364;;;;:::o;6576:313::-;6689:4;6727:2;6716:9;6712:18;6704:26;;6776:9;6770:4;6766:20;6762:1;6751:9;6747:17;6740:47;6804:78;6877:4;6868:6;6804:78;:::i;:::-;6796:86;;6576:313;;;;:::o;6895:116::-;6965:21;6980:5;6965:21;:::i;:::-;6958:5;6955:32;6945:60;;7001:1;6998;6991:12;6945:60;6895:116;:::o;7017:133::-;7060:5;7098:6;7085:20;7076:29;;7114:30;7138:5;7114:30;:::i;:::-;7017:133;;;;:::o;7156:468::-;7221:6;7229;7278:2;7266:9;7257:7;7253:23;7249:32;7246:119;;;7284:79;;:::i;:::-;7246:119;7404:1;7429:53;7474:7;7465:6;7454:9;7450:22;7429:53;:::i;:::-;7419:63;;7375:117;7531:2;7557:50;7599:7;7590:6;7579:9;7575:22;7557:50;:::i;:::-;7547:60;;7502:115;7156:468;;;;;:::o;7647:568::-;7720:8;7730:6;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7901:6;7888:20;7878:30;;7931:18;7923:6;7920:30;7917:117;;;7953:79;;:::i;:::-;7917:117;8067:4;8059:6;8055:17;8043:29;;8121:3;8113:4;8105:6;8101:17;8091:8;8087:32;8084:41;8081:128;;;8128:79;;:::i;:::-;8081:128;7647:568;;;;;:::o;8238:::-;8311:8;8321:6;8371:3;8364:4;8356:6;8352:17;8348:27;8338:122;;8379:79;;:::i;:::-;8338:122;8492:6;8479:20;8469:30;;8522:18;8514:6;8511:30;8508:117;;;8544:79;;:::i;:::-;8508:117;8658:4;8650:6;8646:17;8634:29;;8712:3;8704:4;8696:6;8692:17;8682:8;8678:32;8675:41;8672:128;;;8719:79;;:::i;:::-;8672:128;8238:568;;;;;:::o;8812:1309::-;8970:6;8978;8986;8994;9002;9010;9059:2;9047:9;9038:7;9034:23;9030:32;9027:119;;;9065:79;;:::i;:::-;9027:119;9213:1;9202:9;9198:17;9185:31;9243:18;9235:6;9232:30;9229:117;;;9265:79;;:::i;:::-;9229:117;9378:80;9450:7;9441:6;9430:9;9426:22;9378:80;:::i;:::-;9360:98;;;;9156:312;9535:2;9524:9;9520:18;9507:32;9566:18;9558:6;9555:30;9552:117;;;9588:79;;:::i;:::-;9552:117;9701:80;9773:7;9764:6;9753:9;9749:22;9701:80;:::i;:::-;9683:98;;;;9478:313;9858:2;9847:9;9843:18;9830:32;9889:18;9881:6;9878:30;9875:117;;;9911:79;;:::i;:::-;9875:117;10024:80;10096:7;10087:6;10076:9;10072:22;10024:80;:::i;:::-;10006:98;;;;9801:313;8812:1309;;;;;;;;:::o;10127:180::-;10175:77;10172:1;10165:88;10272:4;10269:1;10262:15;10296:4;10293:1;10286:15;10313:281;10396:27;10418:4;10396:27;:::i;:::-;10388:6;10384:40;10526:6;10514:10;10511:22;10490:18;10478:10;10475:34;10472:62;10469:88;;;10537:18;;:::i;:::-;10469:88;10577:10;10573:2;10566:22;10356:238;10313:281;;:::o;10600:129::-;10634:6;10661:20;;:::i;:::-;10651:30;;10690:33;10718:4;10710:6;10690:33;:::i;:::-;10600:129;;;:::o;10735:311::-;10812:4;10902:18;10894:6;10891:30;10888:56;;;10924:18;;:::i;:::-;10888:56;10974:4;10966:6;10962:17;10954:25;;11034:4;11028;11024:15;11016:23;;10735:311;;;:::o;11069:710::-;11165:5;11190:81;11206:64;11263:6;11206:64;:::i;:::-;11190:81;:::i;:::-;11181:90;;11291:5;11320:6;11313:5;11306:21;11354:4;11347:5;11343:16;11336:23;;11407:4;11399:6;11395:17;11387:6;11383:30;11436:3;11428:6;11425:15;11422:122;;;11455:79;;:::i;:::-;11422:122;11570:6;11553:220;11587:6;11582:3;11579:15;11553:220;;;11662:3;11691:37;11724:3;11712:10;11691:37;:::i;:::-;11686:3;11679:50;11758:4;11753:3;11749:14;11742:21;;11629:144;11613:4;11608:3;11604:14;11597:21;;11553:220;;;11557:21;11171:608;;11069:710;;;;;:::o;11802:370::-;11873:5;11922:3;11915:4;11907:6;11903:17;11899:27;11889:122;;11930:79;;:::i;:::-;11889:122;12047:6;12034:20;12072:94;12162:3;12154:6;12147:4;12139:6;12135:17;12072:94;:::i;:::-;12063:103;;11879:293;11802:370;;;;:::o;12178:117::-;12287:1;12284;12277:12;12301:307;12362:4;12452:18;12444:6;12441:30;12438:56;;;12474:18;;:::i;:::-;12438:56;12512:29;12534:6;12512:29;:::i;:::-;12504:37;;12596:4;12590;12586:15;12578:23;;12301:307;;;:::o;12614:154::-;12698:6;12693:3;12688;12675:30;12760:1;12751:6;12746:3;12742:16;12735:27;12614:154;;;:::o;12774:410::-;12851:5;12876:65;12892:48;12933:6;12892:48;:::i;:::-;12876:65;:::i;:::-;12867:74;;12964:6;12957:5;12950:21;13002:4;12995:5;12991:16;13040:3;13031:6;13026:3;13022:16;13019:25;13016:112;;;13047:79;;:::i;:::-;13016:112;13137:41;13171:6;13166:3;13161;13137:41;:::i;:::-;12857:327;12774:410;;;;;:::o;13203:338::-;13258:5;13307:3;13300:4;13292:6;13288:17;13284:27;13274:122;;13315:79;;:::i;:::-;13274:122;13432:6;13419:20;13457:78;13531:3;13523:6;13516:4;13508:6;13504:17;13457:78;:::i;:::-;13448:87;;13264:277;13203:338;;;;:::o;13547:1509::-;13701:6;13709;13717;13725;13733;13782:3;13770:9;13761:7;13757:23;13753:33;13750:120;;;13789:79;;:::i;:::-;13750:120;13909:1;13934:53;13979:7;13970:6;13959:9;13955:22;13934:53;:::i;:::-;13924:63;;13880:117;14036:2;14062:53;14107:7;14098:6;14087:9;14083:22;14062:53;:::i;:::-;14052:63;;14007:118;14192:2;14181:9;14177:18;14164:32;14223:18;14215:6;14212:30;14209:117;;;14245:79;;:::i;:::-;14209:117;14350:78;14420:7;14411:6;14400:9;14396:22;14350:78;:::i;:::-;14340:88;;14135:303;14505:2;14494:9;14490:18;14477:32;14536:18;14528:6;14525:30;14522:117;;;14558:79;;:::i;:::-;14522:117;14663:78;14733:7;14724:6;14713:9;14709:22;14663:78;:::i;:::-;14653:88;;14448:303;14818:3;14807:9;14803:19;14790:33;14850:18;14842:6;14839:30;14836:117;;;14872:79;;:::i;:::-;14836:117;14977:62;15031:7;15022:6;15011:9;15007:22;14977:62;:::i;:::-;14967:72;;14761:288;13547:1509;;;;;;;;:::o;15062:311::-;15139:4;15229:18;15221:6;15218:30;15215:56;;;15251:18;;:::i;:::-;15215:56;15301:4;15293:6;15289:17;15281:25;;15361:4;15355;15351:15;15343:23;;15062:311;;;:::o;15396:710::-;15492:5;15517:81;15533:64;15590:6;15533:64;:::i;:::-;15517:81;:::i;:::-;15508:90;;15618:5;15647:6;15640:5;15633:21;15681:4;15674:5;15670:16;15663:23;;15734:4;15726:6;15722:17;15714:6;15710:30;15763:3;15755:6;15752:15;15749:122;;;15782:79;;:::i;:::-;15749:122;15897:6;15880:220;15914:6;15909:3;15906:15;15880:220;;;15989:3;16018:37;16051:3;16039:10;16018:37;:::i;:::-;16013:3;16006:50;16085:4;16080:3;16076:14;16069:21;;15956:144;15940:4;15935:3;15931:14;15924:21;;15880:220;;;15884:21;15498:608;;15396:710;;;;;:::o;16129:370::-;16200:5;16249:3;16242:4;16234:6;16230:17;16226:27;16216:122;;16257:79;;:::i;:::-;16216:122;16374:6;16361:20;16399:94;16489:3;16481:6;16474:4;16466:6;16462:17;16399:94;:::i;:::-;16390:103;;16206:293;16129:370;;;;:::o;16505:894::-;16623:6;16631;16680:2;16668:9;16659:7;16655:23;16651:32;16648:119;;;16686:79;;:::i;:::-;16648:119;16834:1;16823:9;16819:17;16806:31;16864:18;16856:6;16853:30;16850:117;;;16886:79;;:::i;:::-;16850:117;16991:78;17061:7;17052:6;17041:9;17037:22;16991:78;:::i;:::-;16981:88;;16777:302;17146:2;17135:9;17131:18;17118:32;17177:18;17169:6;17166:30;17163:117;;;17199:79;;:::i;:::-;17163:117;17304:78;17374:7;17365:6;17354:9;17350:22;17304:78;:::i;:::-;17294:88;;17089:303;16505:894;;;;;:::o;17405:114::-;17472:6;17506:5;17500:12;17490:22;;17405:114;;;:::o;17525:184::-;17624:11;17658:6;17653:3;17646:19;17698:4;17693:3;17689:14;17674:29;;17525:184;;;;:::o;17715:132::-;17782:4;17805:3;17797:11;;17835:4;17830:3;17826:14;17818:22;;17715:132;;;:::o;17853:108::-;17930:24;17948:5;17930:24;:::i;:::-;17925:3;17918:37;17853:108;;:::o;17967:179::-;18036:10;18057:46;18099:3;18091:6;18057:46;:::i;:::-;18135:4;18130:3;18126:14;18112:28;;17967:179;;;;:::o;18152:113::-;18222:4;18254;18249:3;18245:14;18237:22;;18152:113;;;:::o;18301:732::-;18420:3;18449:54;18497:5;18449:54;:::i;:::-;18519:86;18598:6;18593:3;18519:86;:::i;:::-;18512:93;;18629:56;18679:5;18629:56;:::i;:::-;18708:7;18739:1;18724:284;18749:6;18746:1;18743:13;18724:284;;;18825:6;18819:13;18852:63;18911:3;18896:13;18852:63;:::i;:::-;18845:70;;18938:60;18991:6;18938:60;:::i;:::-;18928:70;;18784:224;18771:1;18768;18764:9;18759:14;;18724:284;;;18728:14;19024:3;19017:10;;18425:608;;;18301:732;;;;:::o;19039:373::-;19182:4;19220:2;19209:9;19205:18;19197:26;;19269:9;19263:4;19259:20;19255:1;19244:9;19240:17;19233:47;19297:108;19400:4;19391:6;19297:108;:::i;:::-;19289:116;;19039:373;;;;:::o;19418:529::-;19489:6;19497;19546:2;19534:9;19525:7;19521:23;19517:32;19514:119;;;19552:79;;:::i;:::-;19514:119;19700:1;19689:9;19685:17;19672:31;19730:18;19722:6;19719:30;19716:117;;;19752:79;;:::i;:::-;19716:117;19865:65;19922:7;19913:6;19902:9;19898:22;19865:65;:::i;:::-;19847:83;;;;19643:297;19418:529;;;;;:::o;19953:1039::-;20080:6;20088;20096;20145:2;20133:9;20124:7;20120:23;20116:32;20113:119;;;20151:79;;:::i;:::-;20113:119;20271:1;20296:53;20341:7;20332:6;20321:9;20317:22;20296:53;:::i;:::-;20286:63;;20242:117;20426:2;20415:9;20411:18;20398:32;20457:18;20449:6;20446:30;20443:117;;;20479:79;;:::i;:::-;20443:117;20584:78;20654:7;20645:6;20634:9;20630:22;20584:78;:::i;:::-;20574:88;;20369:303;20739:2;20728:9;20724:18;20711:32;20770:18;20762:6;20759:30;20756:117;;;20792:79;;:::i;:::-;20756:117;20897:78;20967:7;20958:6;20947:9;20943:22;20897:78;:::i;:::-;20887:88;;20682:303;19953:1039;;;;;:::o;20998:118::-;21085:24;21103:5;21085:24;:::i;:::-;21080:3;21073:37;20998:118;;:::o;21122:222::-;21215:4;21253:2;21242:9;21238:18;21230:26;;21266:71;21334:1;21323:9;21319:17;21310:6;21266:71;:::i;:::-;21122:222;;;;:::o;21350:474::-;21418:6;21426;21475:2;21463:9;21454:7;21450:23;21446:32;21443:119;;;21481:79;;:::i;:::-;21443:119;21601:1;21626:53;21671:7;21662:6;21651:9;21647:22;21626:53;:::i;:::-;21616:63;;21572:117;21728:2;21754:53;21799:7;21790:6;21779:9;21775:22;21754:53;:::i;:::-;21744:63;;21699:118;21350:474;;;;;:::o;21830:704::-;21925:6;21933;21941;21990:2;21978:9;21969:7;21965:23;21961:32;21958:119;;;21996:79;;:::i;:::-;21958:119;22144:1;22133:9;22129:17;22116:31;22174:18;22166:6;22163:30;22160:117;;;22196:79;;:::i;:::-;22160:117;22309:80;22381:7;22372:6;22361:9;22357:22;22309:80;:::i;:::-;22291:98;;;;22087:312;22438:2;22464:53;22509:7;22500:6;22489:9;22485:22;22464:53;:::i;:::-;22454:63;;22409:118;21830:704;;;;;:::o;22540:474::-;22608:6;22616;22665:2;22653:9;22644:7;22640:23;22636:32;22633:119;;;22671:79;;:::i;:::-;22633:119;22791:1;22816:53;22861:7;22852:6;22841:9;22837:22;22816:53;:::i;:::-;22806:63;;22762:117;22918:2;22944:53;22989:7;22980:6;22969:9;22965:22;22944:53;:::i;:::-;22934:63;;22889:118;22540:474;;;;;:::o;23020:1089::-;23124:6;23132;23140;23148;23156;23205:3;23193:9;23184:7;23180:23;23176:33;23173:120;;;23212:79;;:::i;:::-;23173:120;23332:1;23357:53;23402:7;23393:6;23382:9;23378:22;23357:53;:::i;:::-;23347:63;;23303:117;23459:2;23485:53;23530:7;23521:6;23510:9;23506:22;23485:53;:::i;:::-;23475:63;;23430:118;23587:2;23613:53;23658:7;23649:6;23638:9;23634:22;23613:53;:::i;:::-;23603:63;;23558:118;23715:2;23741:53;23786:7;23777:6;23766:9;23762:22;23741:53;:::i;:::-;23731:63;;23686:118;23871:3;23860:9;23856:19;23843:33;23903:18;23895:6;23892:30;23889:117;;;23925:79;;:::i;:::-;23889:117;24030:62;24084:7;24075:6;24064:9;24060:22;24030:62;:::i;:::-;24020:72;;23814:288;23020:1089;;;;;;;;:::o;24115:619::-;24192:6;24200;24208;24257:2;24245:9;24236:7;24232:23;24228:32;24225:119;;;24263:79;;:::i;:::-;24225:119;24383:1;24408:53;24453:7;24444:6;24433:9;24429:22;24408:53;:::i;:::-;24398:63;;24354:117;24510:2;24536:53;24581:7;24572:6;24561:9;24557:22;24536:53;:::i;:::-;24526:63;;24481:118;24638:2;24664:53;24709:7;24700:6;24689:9;24685:22;24664:53;:::i;:::-;24654:63;;24609:118;24115:619;;;;;:::o;24740:60::-;24768:3;24789:5;24782:12;;24740:60;;;:::o;24806:142::-;24856:9;24889:53;24907:34;24916:24;24934:5;24916:24;:::i;:::-;24907:34;:::i;:::-;24889:53;:::i;:::-;24876:66;;24806:142;;;:::o;24954:126::-;25004:9;25037:37;25068:5;25037:37;:::i;:::-;25024:50;;24954:126;;;:::o;25086:146::-;25156:9;25189:37;25220:5;25189:37;:::i;:::-;25176:50;;25086:146;;;:::o;25238:171::-;25345:57;25396:5;25345:57;:::i;:::-;25340:3;25333:70;25238:171;;:::o;25415:262::-;25528:4;25566:2;25555:9;25551:18;25543:26;;25579:91;25667:1;25656:9;25652:17;25643:6;25579:91;:::i;:::-;25415:262;;;;:::o;25683:229::-;25823:34;25819:1;25811:6;25807:14;25800:58;25892:12;25887:2;25879:6;25875:15;25868:37;25683:229;:::o;25918:366::-;26060:3;26081:67;26145:2;26140:3;26081:67;:::i;:::-;26074:74;;26157:93;26246:3;26157:93;:::i;:::-;26275:2;26270:3;26266:12;26259:19;;25918:366;;;:::o;26290:419::-;26456:4;26494:2;26483:9;26479:18;26471:26;;26543:9;26537:4;26533:20;26529:1;26518:9;26514:17;26507:47;26571:131;26697:4;26571:131;:::i;:::-;26563:139;;26290:419;;;:::o;26715:332::-;26836:4;26874:2;26863:9;26859:18;26851:26;;26887:71;26955:1;26944:9;26940:17;26931:6;26887:71;:::i;:::-;26968:72;27036:2;27025:9;27021:18;27012:6;26968:72;:::i;:::-;26715:332;;;;;:::o;27053:180::-;27101:77;27098:1;27091:88;27198:4;27195:1;27188:15;27222:4;27219:1;27212:15;27239:320;27283:6;27320:1;27314:4;27310:12;27300:22;;27367:1;27361:4;27357:12;27388:18;27378:81;;27444:4;27436:6;27432:17;27422:27;;27378:81;27506:2;27498:6;27495:14;27475:18;27472:38;27469:84;;27525:18;;:::i;:::-;27469:84;27290:269;27239:320;;;:::o;27565:167::-;27705:19;27701:1;27693:6;27689:14;27682:43;27565:167;:::o;27738:366::-;27880:3;27901:67;27965:2;27960:3;27901:67;:::i;:::-;27894:74;;27977:93;28066:3;27977:93;:::i;:::-;28095:2;28090:3;28086:12;28079:19;;27738:366;;;:::o;28110:419::-;28276:4;28314:2;28303:9;28299:18;28291:26;;28363:9;28357:4;28353:20;28349:1;28338:9;28334:17;28327:47;28391:131;28517:4;28391:131;:::i;:::-;28383:139;;28110:419;;;:::o;28535:180::-;28583:77;28580:1;28573:88;28680:4;28677:1;28670:15;28704:4;28701:1;28694:15;28721:180;28769:77;28766:1;28759:88;28866:4;28863:1;28856:15;28890:4;28887:1;28880:15;28907:233;28946:3;28969:24;28987:5;28969:24;:::i;:::-;28960:33;;29015:66;29008:5;29005:77;29002:103;;29085:18;;:::i;:::-;29002:103;29132:1;29125:5;29121:13;29114:20;;28907:233;;;:::o;29146:::-;29286:34;29282:1;29274:6;29270:14;29263:58;29355:16;29350:2;29342:6;29338:15;29331:41;29146:233;:::o;29385:366::-;29527:3;29548:67;29612:2;29607:3;29548:67;:::i;:::-;29541:74;;29624:93;29713:3;29624:93;:::i;:::-;29742:2;29737:3;29733:12;29726:19;;29385:366;;;:::o;29757:419::-;29923:4;29961:2;29950:9;29946:18;29938:26;;30010:9;30004:4;30000:20;29996:1;29985:9;29981:17;29974:47;30038:131;30164:4;30038:131;:::i;:::-;30030:139;;29757:419;;;:::o;30182:228::-;30322:34;30318:1;30310:6;30306:14;30299:58;30391:11;30386:2;30378:6;30374:15;30367:36;30182:228;:::o;30416:366::-;30558:3;30579:67;30643:2;30638:3;30579:67;:::i;:::-;30572:74;;30655:93;30744:3;30655:93;:::i;:::-;30773:2;30768:3;30764:12;30757:19;;30416:366;;;:::o;30788:419::-;30954:4;30992:2;30981:9;30977:18;30969:26;;31041:9;31035:4;31031:20;31027:1;31016:9;31012:17;31005:47;31069:131;31195:4;31069:131;:::i;:::-;31061:139;;30788:419;;;:::o;31213:157::-;31353:9;31349:1;31341:6;31337:14;31330:33;31213:157;:::o;31376:365::-;31518:3;31539:66;31603:1;31598:3;31539:66;:::i;:::-;31532:73;;31614:93;31703:3;31614:93;:::i;:::-;31732:2;31727:3;31723:12;31716:19;;31376:365;;;:::o;31747:419::-;31913:4;31951:2;31940:9;31936:18;31928:26;;32000:9;31994:4;31990:20;31986:1;31975:9;31971:17;31964:47;32028:131;32154:4;32028:131;:::i;:::-;32020:139;;31747:419;;;:::o;32172:97::-;32231:6;32259:3;32249:13;;32172:97;;;;:::o;32275:141::-;32324:4;32347:3;32339:11;;32370:3;32367:1;32360:14;32404:4;32401:1;32391:18;32383:26;;32275:141;;;:::o;32422:93::-;32459:6;32506:2;32501;32494:5;32490:14;32486:23;32476:33;;32422:93;;;:::o;32521:107::-;32565:8;32615:5;32609:4;32605:16;32584:37;;32521:107;;;;:::o;32634:393::-;32703:6;32753:1;32741:10;32737:18;32776:97;32806:66;32795:9;32776:97;:::i;:::-;32894:39;32924:8;32913:9;32894:39;:::i;:::-;32882:51;;32966:4;32962:9;32955:5;32951:21;32942:30;;33015:4;33005:8;33001:19;32994:5;32991:30;32981:40;;32710:317;;32634:393;;;;;:::o;33033:142::-;33083:9;33116:53;33134:34;33143:24;33161:5;33143:24;:::i;:::-;33134:34;:::i;:::-;33116:53;:::i;:::-;33103:66;;33033:142;;;:::o;33181:75::-;33224:3;33245:5;33238:12;;33181:75;;;:::o;33262:269::-;33372:39;33403:7;33372:39;:::i;:::-;33433:91;33482:41;33506:16;33482:41;:::i;:::-;33474:6;33467:4;33461:11;33433:91;:::i;:::-;33427:4;33420:105;33338:193;33262:269;;;:::o;33537:73::-;33582:3;33537:73;:::o;33616:189::-;33693:32;;:::i;:::-;33734:65;33792:6;33784;33778:4;33734:65;:::i;:::-;33669:136;33616:189;;:::o;33811:186::-;33871:120;33888:3;33881:5;33878:14;33871:120;;;33942:39;33979:1;33972:5;33942:39;:::i;:::-;33915:1;33908:5;33904:13;33895:22;;33871:120;;;33811:186;;:::o;34003:543::-;34104:2;34099:3;34096:11;34093:446;;;34138:38;34170:5;34138:38;:::i;:::-;34222:29;34240:10;34222:29;:::i;:::-;34212:8;34208:44;34405:2;34393:10;34390:18;34387:49;;;34426:8;34411:23;;34387:49;34449:80;34505:22;34523:3;34505:22;:::i;:::-;34495:8;34491:37;34478:11;34449:80;:::i;:::-;34108:431;;34093:446;34003:543;;;:::o;34552:117::-;34606:8;34656:5;34650:4;34646:16;34625:37;;34552:117;;;;:::o;34675:169::-;34719:6;34752:51;34800:1;34796:6;34788:5;34785:1;34781:13;34752:51;:::i;:::-;34748:56;34833:4;34827;34823:15;34813:25;;34726:118;34675:169;;;;:::o;34849:295::-;34925:4;35071:29;35096:3;35090:4;35071:29;:::i;:::-;35063:37;;35133:3;35130:1;35126:11;35120:4;35117:21;35109:29;;34849:295;;;;:::o;35149:1403::-;35273:44;35313:3;35308;35273:44;:::i;:::-;35382:18;35374:6;35371:30;35368:56;;;35404:18;;:::i;:::-;35368:56;35448:38;35480:4;35474:11;35448:38;:::i;:::-;35533:67;35593:6;35585;35579:4;35533:67;:::i;:::-;35627:1;35656:2;35648:6;35645:14;35673:1;35668:632;;;;36344:1;36361:6;36358:84;;;36417:9;36412:3;36408:19;36395:33;36386:42;;36358:84;36468:67;36528:6;36521:5;36468:67;:::i;:::-;36462:4;36455:81;36317:229;35638:908;;35668:632;35720:4;35716:9;35708:6;35704:22;35754:37;35786:4;35754:37;:::i;:::-;35813:1;35827:215;35841:7;35838:1;35835:14;35827:215;;;35927:9;35922:3;35918:19;35905:33;35897:6;35890:49;35978:1;35970:6;35966:14;35956:24;;36025:2;36014:9;36010:18;35997:31;;35864:4;35861:1;35857:12;35852:17;;35827:215;;;36070:6;36061:7;36058:19;36055:186;;;36135:9;36130:3;36126:19;36113:33;36178:48;36220:4;36212:6;36208:17;36197:9;36178:48;:::i;:::-;36170:6;36163:64;36078:163;36055:186;36287:1;36283;36275:6;36271:14;36267:22;36261:4;36254:36;35675:625;;;35638:908;;35248:1304;;;35149:1403;;;:::o;36558:233::-;36698:34;36694:1;36686:6;36682:14;36675:58;36767:16;36762:2;36754:6;36750:15;36743:41;36558:233;:::o;36797:366::-;36939:3;36960:67;37024:2;37019:3;36960:67;:::i;:::-;36953:74;;37036:93;37125:3;37036:93;:::i;:::-;37154:2;37149:3;37145:12;37138:19;;36797:366;;;:::o;37169:419::-;37335:4;37373:2;37362:9;37358:18;37350:26;;37422:9;37416:4;37412:20;37408:1;37397:9;37393:17;37386:47;37450:131;37576:4;37450:131;:::i;:::-;37442:139;;37169:419;;;:::o;37594:85::-;37639:7;37668:5;37657:16;;37594:85;;;:::o;37685:86::-;37720:7;37760:4;37753:5;37749:16;37738:27;;37685:86;;;:::o;37777:154::-;37833:9;37866:59;37882:42;37891:32;37917:5;37891:32;:::i;:::-;37882:42;:::i;:::-;37866:59;:::i;:::-;37853:72;;37777:154;;;:::o;37937:143::-;38030:43;38067:5;38030:43;:::i;:::-;38025:3;38018:56;37937:143;;:::o;38086:234::-;38185:4;38223:2;38212:9;38208:18;38200:26;;38236:77;38310:1;38299:9;38295:17;38286:6;38236:77;:::i;:::-;38086:234;;;;:::o;38326:161::-;38466:13;38462:1;38454:6;38450:14;38443:37;38326:161;:::o;38493:366::-;38635:3;38656:67;38720:2;38715:3;38656:67;:::i;:::-;38649:74;;38732:93;38821:3;38732:93;:::i;:::-;38850:2;38845:3;38841:12;38834:19;;38493:366;;;:::o;38865:419::-;39031:4;39069:2;39058:9;39054:18;39046:26;;39118:9;39112:4;39108:20;39104:1;39093:9;39089:17;39082:47;39146:131;39272:4;39146:131;:::i;:::-;39138:139;;38865:419;;;:::o;39290:191::-;39330:4;39350:20;39368:1;39350:20;:::i;:::-;39345:25;;39384:20;39402:1;39384:20;:::i;:::-;39379:25;;39423:1;39420;39417:8;39414:34;;;39428:18;;:::i;:::-;39414:34;39473:1;39470;39466:9;39458:17;;39290:191;;;;:::o;39487:348::-;39527:7;39550:20;39568:1;39550:20;:::i;:::-;39545:25;;39584:20;39602:1;39584:20;:::i;:::-;39579:25;;39772:1;39704:66;39700:74;39697:1;39694:81;39689:1;39682:9;39675:17;39671:105;39668:131;;;39779:18;;:::i;:::-;39668:131;39827:1;39824;39820:9;39809:20;;39487:348;;;;:::o;39841:180::-;39889:77;39886:1;39879:88;39986:4;39983:1;39976:15;40010:4;40007:1;40000:15;40027:185;40067:1;40084:20;40102:1;40084:20;:::i;:::-;40079:25;;40118:20;40136:1;40118:20;:::i;:::-;40113:25;;40157:1;40147:35;;40162:18;;:::i;:::-;40147:35;40204:1;40201;40197:9;40192:14;;40027:185;;;;:::o;40218:305::-;40258:3;40277:20;40295:1;40277:20;:::i;:::-;40272:25;;40311:20;40329:1;40311:20;:::i;:::-;40306:25;;40465:1;40397:66;40393:74;40390:1;40387:81;40384:107;;;40471:18;;:::i;:::-;40384:107;40515:1;40512;40508:9;40501:16;;40218:305;;;;:::o;40529:225::-;40669:34;40665:1;40657:6;40653:14;40646:58;40738:8;40733:2;40725:6;40721:15;40714:33;40529:225;:::o;40760:366::-;40902:3;40923:67;40987:2;40982:3;40923:67;:::i;:::-;40916:74;;40999:93;41088:3;40999:93;:::i;:::-;41117:2;41112:3;41108:12;41101:19;;40760:366;;;:::o;41132:419::-;41298:4;41336:2;41325:9;41321:18;41313:26;;41385:9;41379:4;41375:20;41371:1;41360:9;41356:17;41349:47;41413:131;41539:4;41413:131;:::i;:::-;41405:139;;41132:419;;;:::o;41557:182::-;41697:34;41693:1;41685:6;41681:14;41674:58;41557:182;:::o;41745:366::-;41887:3;41908:67;41972:2;41967:3;41908:67;:::i;:::-;41901:74;;41984:93;42073:3;41984:93;:::i;:::-;42102:2;42097:3;42093:12;42086:19;;41745:366;;;:::o;42117:419::-;42283:4;42321:2;42310:9;42306:18;42298:26;;42370:9;42364:4;42360:20;42356:1;42345:9;42341:17;42334:47;42398:131;42524:4;42398:131;:::i;:::-;42390:139;;42117:419;;;:::o;42542:220::-;42682:34;42678:1;42670:6;42666:14;42659:58;42751:3;42746:2;42738:6;42734:15;42727:28;42542:220;:::o;42768:366::-;42910:3;42931:67;42995:2;42990:3;42931:67;:::i;:::-;42924:74;;43007:93;43096:3;43007:93;:::i;:::-;43125:2;43120:3;43116:12;43109:19;;42768:366;;;:::o;43140:419::-;43306:4;43344:2;43333:9;43329:18;43321:26;;43393:9;43387:4;43383:20;43379:1;43368:9;43364:17;43357:47;43421:131;43547:4;43421:131;:::i;:::-;43413:139;;43140:419;;;:::o;43565:332::-;43686:4;43724:2;43713:9;43709:18;43701:26;;43737:71;43805:1;43794:9;43790:17;43781:6;43737:71;:::i;:::-;43818:72;43886:2;43875:9;43871:18;43862:6;43818:72;:::i;:::-;43565:332;;;;;:::o;43903:227::-;44043:34;44039:1;44031:6;44027:14;44020:58;44112:10;44107:2;44099:6;44095:15;44088:35;43903:227;:::o;44136:366::-;44278:3;44299:67;44363:2;44358:3;44299:67;:::i;:::-;44292:74;;44375:93;44464:3;44375:93;:::i;:::-;44493:2;44488:3;44484:12;44477:19;;44136:366;;;:::o;44508:419::-;44674:4;44712:2;44701:9;44697:18;44689:26;;44761:9;44755:4;44751:20;44747:1;44736:9;44732:17;44725:47;44789:131;44915:4;44789:131;:::i;:::-;44781:139;;44508:419;;;:::o;44933:224::-;45073:34;45069:1;45061:6;45057:14;45050:58;45142:7;45137:2;45129:6;45125:15;45118:32;44933:224;:::o;45163:366::-;45305:3;45326:67;45390:2;45385:3;45326:67;:::i;:::-;45319:74;;45402:93;45491:3;45402:93;:::i;:::-;45520:2;45515:3;45511:12;45504:19;;45163:366;;;:::o;45535:419::-;45701:4;45739:2;45728:9;45724:18;45716:26;;45788:9;45782:4;45778:20;45774:1;45763:9;45759:17;45752:47;45816:131;45942:4;45816:131;:::i;:::-;45808:139;;45535:419;;;:::o;45960:229::-;46100:34;46096:1;46088:6;46084:14;46077:58;46169:12;46164:2;46156:6;46152:15;46145:37;45960:229;:::o;46195:366::-;46337:3;46358:67;46422:2;46417:3;46358:67;:::i;:::-;46351:74;;46434:93;46523:3;46434:93;:::i;:::-;46552:2;46547:3;46543:12;46536:19;;46195:366;;;:::o;46567:419::-;46733:4;46771:2;46760:9;46756:18;46748:26;;46820:9;46814:4;46810:20;46806:1;46795:9;46791:17;46784:47;46848:131;46974:4;46848:131;:::i;:::-;46840:139;;46567:419;;;:::o;46992:634::-;47213:4;47251:2;47240:9;47236:18;47228:26;;47300:9;47294:4;47290:20;47286:1;47275:9;47271:17;47264:47;47328:108;47431:4;47422:6;47328:108;:::i;:::-;47320:116;;47483:9;47477:4;47473:20;47468:2;47457:9;47453:18;47446:48;47511:108;47614:4;47605:6;47511:108;:::i;:::-;47503:116;;46992:634;;;;;:::o;47632:1395::-;47749:37;47782:3;47749:37;:::i;:::-;47851:18;47843:6;47840:30;47837:56;;;47873:18;;:::i;:::-;47837:56;47917:38;47949:4;47943:11;47917:38;:::i;:::-;48002:67;48062:6;48054;48048:4;48002:67;:::i;:::-;48096:1;48120:4;48107:17;;48152:2;48144:6;48141:14;48169:1;48164:618;;;;48826:1;48843:6;48840:77;;;48892:9;48887:3;48883:19;48877:26;48868:35;;48840:77;48943:67;49003:6;48996:5;48943:67;:::i;:::-;48937:4;48930:81;48799:222;48134:887;;48164:618;48216:4;48212:9;48204:6;48200:22;48250:37;48282:4;48250:37;:::i;:::-;48309:1;48323:208;48337:7;48334:1;48331:14;48323:208;;;48416:9;48411:3;48407:19;48401:26;48393:6;48386:42;48467:1;48459:6;48455:14;48445:24;;48514:2;48503:9;48499:18;48486:31;;48360:4;48357:1;48353:12;48348:17;;48323:208;;;48559:6;48550:7;48547:19;48544:179;;;48617:9;48612:3;48608:19;48602:26;48660:48;48702:4;48694:6;48690:17;48679:9;48660:48;:::i;:::-;48652:6;48645:64;48567:156;48544:179;48769:1;48765;48757:6;48753:14;48749:22;48743:4;48736:36;48171:611;;;48134:887;;47724:1303;;;47632:1395;;:::o;49033:222::-;49173:34;49169:1;49161:6;49157:14;49150:58;49242:5;49237:2;49229:6;49225:15;49218:30;49033:222;:::o;49261:366::-;49403:3;49424:67;49488:2;49483:3;49424:67;:::i;:::-;49417:74;;49500:93;49589:3;49500:93;:::i;:::-;49618:2;49613:3;49609:12;49602:19;;49261:366;;;:::o;49633:419::-;49799:4;49837:2;49826:9;49822:18;49814:26;;49886:9;49880:4;49876:20;49872:1;49861:9;49857:17;49850:47;49914:131;50040:4;49914:131;:::i;:::-;49906:139;;49633:419;;;:::o;50058:223::-;50198:34;50194:1;50186:6;50182:14;50175:58;50267:6;50262:2;50254:6;50250:15;50243:31;50058:223;:::o;50287:366::-;50429:3;50450:67;50514:2;50509:3;50450:67;:::i;:::-;50443:74;;50526:93;50615:3;50526:93;:::i;:::-;50644:2;50639:3;50635:12;50628:19;;50287:366;;;:::o;50659:419::-;50825:4;50863:2;50852:9;50848:18;50840:26;;50912:9;50906:4;50902:20;50898:1;50887:9;50883:17;50876:47;50940:131;51066:4;50940:131;:::i;:::-;50932:139;;50659:419;;;:::o;51084:228::-;51224:34;51220:1;51212:6;51208:14;51201:58;51293:11;51288:2;51280:6;51276:15;51269:36;51084:228;:::o;51318:366::-;51460:3;51481:67;51545:2;51540:3;51481:67;:::i;:::-;51474:74;;51557:93;51646:3;51557:93;:::i;:::-;51675:2;51670:3;51666:12;51659:19;;51318:366;;;:::o;51690:419::-;51856:4;51894:2;51883:9;51879:18;51871:26;;51943:9;51937:4;51933:20;51929:1;51918:9;51914:17;51907:47;51971:131;52097:4;51971:131;:::i;:::-;51963:139;;51690:419;;;:::o;52115:230::-;52255:34;52251:1;52243:6;52239:14;52232:58;52324:13;52319:2;52311:6;52307:15;52300:38;52115:230;:::o;52351:366::-;52493:3;52514:67;52578:2;52573:3;52514:67;:::i;:::-;52507:74;;52590:93;52679:3;52590:93;:::i;:::-;52708:2;52703:3;52699:12;52692:19;;52351:366;;;:::o;52723:419::-;52889:4;52927:2;52916:9;52912:18;52904:26;;52976:9;52970:4;52966:20;52962:1;52951:9;52947:17;52940:47;53004:131;53130:4;53004:131;:::i;:::-;52996:139;;52723:419;;;:::o;53148:98::-;53199:6;53233:5;53227:12;53217:22;;53148:98;;;:::o;53252:168::-;53335:11;53369:6;53364:3;53357:19;53409:4;53404:3;53400:14;53385:29;;53252:168;;;;:::o;53426:360::-;53512:3;53540:38;53572:5;53540:38;:::i;:::-;53594:70;53657:6;53652:3;53594:70;:::i;:::-;53587:77;;53673:52;53718:6;53713:3;53706:4;53699:5;53695:16;53673:52;:::i;:::-;53750:29;53772:6;53750:29;:::i;:::-;53745:3;53741:39;53734:46;;53516:270;53426:360;;;;:::o;53792:751::-;54015:4;54053:3;54042:9;54038:19;54030:27;;54067:71;54135:1;54124:9;54120:17;54111:6;54067:71;:::i;:::-;54148:72;54216:2;54205:9;54201:18;54192:6;54148:72;:::i;:::-;54230;54298:2;54287:9;54283:18;54274:6;54230:72;:::i;:::-;54312;54380:2;54369:9;54365:18;54356:6;54312:72;:::i;:::-;54432:9;54426:4;54422:20;54416:3;54405:9;54401:19;54394:49;54460:76;54531:4;54522:6;54460:76;:::i;:::-;54452:84;;53792:751;;;;;;;;:::o;54549:141::-;54605:5;54636:6;54630:13;54621:22;;54652:32;54678:5;54652:32;:::i;:::-;54549:141;;;;:::o;54696:349::-;54765:6;54814:2;54802:9;54793:7;54789:23;54785:32;54782:119;;;54820:79;;:::i;:::-;54782:119;54940:1;54965:63;55020:7;55011:6;55000:9;54996:22;54965:63;:::i;:::-;54955:73;;54911:127;54696:349;;;;:::o;55051:106::-;55095:8;55144:5;55139:3;55135:15;55114:36;;55051:106;;;:::o;55163:183::-;55198:3;55236:1;55218:16;55215:23;55212:128;;;55274:1;55271;55268;55253:23;55296:34;55327:1;55321:8;55296:34;:::i;:::-;55289:41;;55212:128;55163:183;:::o;55352:711::-;55391:3;55429:4;55411:16;55408:26;55437:5;55405:39;55466:20;;:::i;:::-;55541:1;55523:16;55519:24;55516:1;55510:4;55495:49;55574:4;55568:11;55673:16;55666:4;55658:6;55654:17;55651:39;55618:18;55610:6;55607:30;55591:113;55588:146;;;55719:5;;;;55588:146;55765:6;55759:4;55755:17;55801:3;55795:10;55828:18;55820:6;55817:30;55814:43;;;55850:5;;;;;;55814:43;55898:6;55891:4;55886:3;55882:14;55878:27;55957:1;55939:16;55935:24;55929:4;55925:35;55920:3;55917:44;55914:57;;;55964:5;;;;;;;55914:57;55981;56029:6;56023:4;56019:17;56011:6;56007:30;56001:4;55981:57;:::i;:::-;56054:3;56047:10;;55395:668;;;;;55352:711;;:::o;56069:239::-;56209:34;56205:1;56197:6;56193:14;56186:58;56278:22;56273:2;56265:6;56261:15;56254:47;56069:239;:::o;56314:366::-;56456:3;56477:67;56541:2;56536:3;56477:67;:::i;:::-;56470:74;;56553:93;56642:3;56553:93;:::i;:::-;56671:2;56666:3;56662:12;56655:19;;56314:366;;;:::o;56686:419::-;56852:4;56890:2;56879:9;56875:18;56867:26;;56939:9;56933:4;56929:20;56925:1;56914:9;56910:17;56903:47;56967:131;57093:4;56967:131;:::i;:::-;56959:139;;56686:419;;;:::o;57111:227::-;57251:34;57247:1;57239:6;57235:14;57228:58;57320:10;57315:2;57307:6;57303:15;57296:35;57111:227;:::o;57344:366::-;57486:3;57507:67;57571:2;57566:3;57507:67;:::i;:::-;57500:74;;57583:93;57672:3;57583:93;:::i;:::-;57701:2;57696:3;57692:12;57685:19;;57344:366;;;:::o;57716:419::-;57882:4;57920:2;57909:9;57905:18;57897:26;;57969:9;57963:4;57959:20;57955:1;57944:9;57940:17;57933:47;57997:131;58123:4;57997:131;:::i;:::-;57989:139;;57716:419;;;:::o;58141:1053::-;58464:4;58502:3;58491:9;58487:19;58479:27;;58516:71;58584:1;58573:9;58569:17;58560:6;58516:71;:::i;:::-;58597:72;58665:2;58654:9;58650:18;58641:6;58597:72;:::i;:::-;58716:9;58710:4;58706:20;58701:2;58690:9;58686:18;58679:48;58744:108;58847:4;58838:6;58744:108;:::i;:::-;58736:116;;58899:9;58893:4;58889:20;58884:2;58873:9;58869:18;58862:48;58927:108;59030:4;59021:6;58927:108;:::i;:::-;58919:116;;59083:9;59077:4;59073:20;59067:3;59056:9;59052:19;59045:49;59111:76;59182:4;59173:6;59111:76;:::i;:::-;59103:84;;58141:1053;;;;;;;;:::o

Swarm Source

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