Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60a06040 | 19840270 | 132 days ago | IN | 0 ETH | 0.04044592 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
FabricaToken
Compiler Version
v0.8.25+commit.b61c2a91
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-05-10 */ // Dependency file: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(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); } } } // Dependency file: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) // pragma solidity ^0.8.2; // import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; /** * @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] * ```solidity * 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; } } // Dependency file: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) // pragma solidity ^0.8.0; // import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } /** * @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; } // Dependency file: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; // import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /** * @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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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; } // Dependency file: @openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; // import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @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; } // Dependency 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); } // Dependency file: @openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; /** * @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; } // Dependency file: @openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; /** * @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); } // Dependency file: @openzeppelin/contracts-upgradeable/token/ERC1155/extensions/IERC1155MetadataURIUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol"; /** * @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); } // Dependency file: @openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; // import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /** * @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; } // Dependency file: @openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/ERC1155.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/IERC1155MetadataURIUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol"; // import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /** * @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; } // Dependency file: @openzeppelin/contracts-upgradeable/utils/introspection/ERC165CheckerUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/introspection/ERC165Checker.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; /** * @dev Library used to query support of an interface declared via {IERC165}. * * Note that these functions return the actual result of the query: they do not * `revert` if an interface is not supported. It is up to the caller to decide * what to do in these cases. */ library ERC165CheckerUpgradeable { // As per the EIP-165 spec, no interface should ever match 0xffffffff bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff; /** * @dev Returns true if `account` supports the {IERC165} interface. */ function supportsERC165(address account) internal view returns (bool) { // Any contract that implements ERC165 must explicitly indicate support of // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid return supportsERC165InterfaceUnchecked(account, type(IERC165Upgradeable).interfaceId) && !supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID); } /** * @dev Returns true if `account` supports the interface defined by * `interfaceId`. Support for {IERC165} itself is queried automatically. * * See {IERC165-supportsInterface}. */ function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { // query support of both ERC165 as per the spec and support of _interfaceId return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId); } /** * @dev Returns a boolean array where each value corresponds to the * interfaces passed in and whether they're supported or not. This allows * you to batch check interfaces for a contract where your expectation * is that some interfaces may not be supported. * * See {IERC165-supportsInterface}. * * _Available since v3.4._ */ function getSupportedInterfaces( address account, bytes4[] memory interfaceIds ) internal view returns (bool[] memory) { // an array of booleans corresponding to interfaceIds and whether they're supported or not bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); // query support of ERC165 itself if (supportsERC165(account)) { // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]); } } return interfaceIdsSupported; } /** * @dev Returns true if `account` supports all the interfaces defined in * `interfaceIds`. Support for {IERC165} itself is queried automatically. * * Batch-querying can lead to gas savings by skipping repeated checks for * {IERC165} support. * * See {IERC165-supportsInterface}. */ function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { // query support of ERC165 itself if (!supportsERC165(account)) { return false; } // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) { return false; } } // all interfaces supported return true; } /** * @notice Query if a contract implements an interface, does not check ERC165 support * @param account The address of the contract to query for support of an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @return true if the contract at account indicates support of the interface with * identifier interfaceId, false otherwise * @dev Assumes that account contains a contract that supports ERC165, otherwise * the behavior of this method is undefined. This precondition can be checked * with {supportsERC165}. * * Some precompiled contracts will falsely indicate support for a given interface, so caution * should be exercised when using this function. * * Interface identification is specified in ERC-165. */ function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) { // prepare call bytes memory encodedParams = abi.encodeWithSelector(IERC165Upgradeable.supportsInterface.selector, interfaceId); // perform static call bool success; uint256 returnSize; uint256 returnValue; assembly { success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20) returnSize := returndatasize() returnValue := mload(0x00) } return success && returnSize >= 0x20 && returnValue > 0; } } // Dependency file: @openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) // pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // Dependency file: @openzeppelin/contracts-upgradeable/utils/math/SignedMathUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) // pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMathUpgradeable { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // Dependency file: @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/math/SignedMathUpgradeable.sol"; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = MathUpgradeable.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMathUpgradeable.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, MathUpgradeable.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // Dependency file: @openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) // pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // Dependency file: @openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) // pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // Dependency file: @openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol) // pragma solidity ^0.8.0; /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. * * _Available since v4.8.3._ */ interface IERC1967Upgradeable { /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); } // Dependency file: @openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. // pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } } // Dependency file: @openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol) // pragma solidity ^0.8.2; // import "@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol"; // import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ */ abstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable { // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), 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; } // Dependency file: @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol"; // import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeTo(address newImplementation) public virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @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; } // Dependency file: src/FabricaUUPSUpgradeable.sol // pragma solidity ^0.8.25; // import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; // import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; abstract contract FabricaUUPSUpgradeable is Initializable, ContextUpgradeable, UUPSUpgradeable { function __FabricaUUPSUpgradeable_init() internal onlyInitializing { __Context_init(); __UUPSUpgradeable_init(); } function __FabricaUUPSUpgradeable_init_unchained() internal onlyInitializing { __Context_init(); __UUPSUpgradeable_init_unchained(); } function _authorizeUpgrade(address) internal view override { _checkProxyAdmin(); } function implementation() public view returns (address) { return _getImplementation(); } /** * @dev Throws if called by any account other than the proxy admin */ modifier onlyProxyAdmin() { _checkProxyAdmin(); _; } /** * @dev Throws if the sender is not the proxy admin. */ function _checkProxyAdmin() internal view virtual { require(_getAdmin() == _msgSender(), "FabricaUUPSUpgradeable: caller is not the proxy admin"); } /** * @dev Returns the current proxy admin address. */ function proxyAdmin() public view returns (address) { return ERC1967UpgradeUpgradeable._getAdmin(); } /** * @dev Updates the current admin address. */ function setProxyAdmin(address _newProxyAdmin) public onlyProxyAdmin { // _setAdmin() doesn't emit the Upgraded event; _changeAdmin() does. ERC1967UpgradeUpgradeable._changeAdmin(_newProxyAdmin); } } // Dependency file: src/IFabricaValidator.sol // Validator smart contract interface for Fabrica // pragma solidity ^0.8.25; interface IFabricaValidator { function defaultOperatingAgreement() external view returns (string memory); function operatingAgreementName(string memory uri_) external view returns (string memory); function uri(uint256 id) external view returns (string memory); } // Dependency file: src/IFabricaValidatorRegistry.sol // pragma solidity ^0.8.25; interface IFabricaValidatorRegistry { function name(address addr) external view returns (string memory); } // Root file: src/FabricaToken.sol pragma solidity ^0.8.25; // import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; // import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165CheckerUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol"; // import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; // import "src/FabricaUUPSUpgradeable.sol"; // import "src/IFabricaValidator.sol"; // import "src/IFabricaValidatorRegistry.sol"; /** * @dev Implementation of the Fabrica ERC1155 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 FabricaToken is Initializable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable, OwnableUpgradeable, PausableUpgradeable, FabricaUUPSUpgradeable { using AddressUpgradeable for address; constructor() { _disableInitializers(); } function initialize() public initializer { __ERC165_init(); __FabricaUUPSUpgradeable_init(); __Ownable_init(); __Pausable_init(); } function initializeV2() public reinitializer(2) { // Token-specific migration code has been removed } function initializeV3() public reinitializer(3) { emit TraitMetadataURIUpdated(); } // Struct needed to avoid stack too deep error struct Property { uint256 supply; string operatingAgreement; string definition; string configuration; address validator; } // 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; // Mapping from token ID to property info mapping(uint256 => Property) public _property; address private _defaultValidator; address private _validatorRegistry; // On-chain data update event UpdateConfiguration(uint256, string newData); event UpdateOperatingAgreement(uint256, string newData); event UpdateValidator(uint256 tokenId, string dataType, address validator); event TraitMetadataURIUpdated(); event TraitUpdated(bytes32 indexed traitKey, uint256 tokenId, bytes32 traitValue); /** * @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 || // 0xaf332f3e is ERC-7496 interfaceId == 0xaf332f3e || super.supportsInterface(interfaceId); } function pause() public onlyOwner whenNotPaused { _pause(); } function unpause() public onlyOwner whenPaused { _unpause(); } function setDefaultValidator(address newDefaultValidator) public onlyOwner { _defaultValidator = newDefaultValidator; } function defaultValidator() public view returns (address) { return _defaultValidator; } function setValidatorRegistry(address newValidatorRegistry) public onlyOwner { _validatorRegistry = newValidatorRegistry; } function validatorRegistry() public view returns (address) { return _validatorRegistry; } // getTraitValue() defined as part of ERC-7496 Specification function getTraitValue(uint256 tokenId, bytes32 traitKey) external view returns (bytes32) { if (traitKey == keccak256("validator")) { return bytes32(bytes(_getValidatorName(tokenId))); } if (traitKey == keccak256("operatingAgreement")) { return bytes32(bytes(_getOperatingAgreementName(tokenId))); } revert("Unknown trait key"); } // getTraitValues() defined as part of ERC-7496 Specification function getTraitValues(uint256 tokenId, bytes32[] calldata traitKeys) external view returns (bytes32[] memory) { bytes32[] memory values = new bytes32[](traitKeys.length); for (uint256 i = 0 ; i < traitKeys.length ; i++) { bytes32 traitKey = traitKeys[i]; if (traitKey == keccak256("validator")) { values[i] = bytes32(bytes(_getValidatorName(tokenId))); continue; } if (traitKey == keccak256("operatingAgreement")) { values[i] = bytes32(bytes(_getOperatingAgreementName(tokenId))); continue; } revert(string.concat("Unknown trait key at index ", StringsUpgradeable.toString(i))); } return values; } // getTraitMetadataURI() defined as part of the ERC-7496 Specification function getTraitMetadataURI() external pure returns (string memory) { return "data:application/json;charset=utf-8;base64,ewogICJ0cmFpdHMiOiB7CiAgICAidmFsaWRhdG9yIjogewogICAgICAiZGlzcGxheU5hbWUiOiAiVmFsaWRhdG9yIiwKICAgICAgImRhdGFUeXBlIjogewogICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgIm1pbkxlbmd0aCI6IDEKICAgICAgfSwKICAgICAgInZhbGlkYXRlT25TYWxlIjogInJlcXVpcmVFcSIKICAgIH0sCiAgICAib3BlcmF0aW5nQWdyZWVtZW50IjogewogICAgICAiZGlzcGxheU5hbWUiOiAiT3BlcmF0aW5nIEFncmVlbWVudCIsCiAgICAgICJkYXRhVHlwZSI6IHsKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICJtaW5MZW5ndGgiOiAxCiAgICAgIH0sCiAgICAgICJ2YWxpZGF0ZU9uU2FsZSI6ICJyZXF1aXJlRXEiCiAgICB9CiAgfQp9"; } /** * @dev Delegate to the validator contract: default to the Fabrica validator */ function uri(uint256 id) override public view returns (string memory) { address validator = _property[id].validator == address(0) ? _defaultValidator : _property[id].validator; return IFabricaValidator(validator).uri(id); } /** * @dev `mint` allows users to mint to 3rd party (although it allows to mint to self as well) */ function mint( address[] memory recipients, uint256 sessionId, uint256[] memory amounts, string memory definition, string memory operatingAgreement, string memory configuration, address validator ) public whenNotPaused returns (uint256) { uint256 supply = 0; for (uint256 i = 0; i < amounts.length; i++) { uint256 amount = amounts[i]; require(amount > 0, 'Each amount must be greater than zero'); supply += amount; } Property memory property; property.supply = supply; property.operatingAgreement = operatingAgreement; property.definition = definition; property.configuration = configuration; property.validator = validator; uint256 id = _mint(recipients, sessionId, amounts, property, ""); return id; } /** * @dev `mintBatch` allows users to mint in bulk */ function mintBatch( address[] memory recipients, uint256[] memory sessionIds, uint256[] memory amounts, string[] memory definitions, string[] memory operatingAgreements, string[] memory configurations, address[] memory validators ) public whenNotPaused returns (uint256[] memory ids) { uint256 supply = 0; for (uint256 i = 0; i < amounts.length; i++) { uint256 amount = amounts[i]; require(amount > 0, 'Each amount must be greater than zero'); supply += amount; } uint256 size = sessionIds.length; Property[] memory properties = new Property[](size); for (uint256 i = 0; i < size; i++) { properties[i].supply = supply; properties[i].operatingAgreement = operatingAgreements[i]; properties[i].definition = definitions[i]; properties[i].configuration = configurations[i]; properties[i].validator = validators[i]; } ids = _mintBatch(recipients, sessionIds, amounts, properties, ""); } function burn( address from, uint256 id, uint256 amount ) public whenNotPaused returns (bool success) { _burn(from, id, amount); success = true; } function burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) public whenNotPaused returns (bool success) { _burnBatch(from, ids, amounts); success = true; } /** * @dev generate token id (to avoid frontrunning) */ function generateId(address operator, uint256 sessionId, string memory operatingAgreement) public view whenNotPaused returns(uint256) { /** * @dev hash operator address with sessionId and chainId to generate unique token Id * format: string(sender_address) + string(sessionId) => hash to byte32 => cast to uint */ string memory operatorString = StringsUpgradeable.toHexString(uint(uint160(operator)), 20); string memory idString = string.concat( StringsUpgradeable.toString(block.chainid), StringsUpgradeable.toHexString(address(this)), operatorString, StringsUpgradeable.toString(sessionId), operatingAgreement ); uint256 bigId = uint256(keccak256(abi.encodePacked(idString))); uint64 smallId = uint64(bigId); return uint256(smallId); } /** * @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 whenNotPaused { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override whenNotPaused 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 whenNotPaused { 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 whenNotPaused { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } // @dev only executable by > 70% owner function updateOperatingAgreement(string memory operatingAgreement, uint256 id) public whenNotPaused returns (bool) { require(_percentOwner(_msgSender(), id, 70), "Only > 70% can update"); _property[id].operatingAgreement = operatingAgreement; emit UpdateOperatingAgreement(id, operatingAgreement); emit TraitUpdated(keccak256("operatingAgreement"), id, bytes32(bytes(_getOperatingAgreementName(id)))); return true; } // @dev only executable by > 50% owner function updateConfiguration(string memory configuration, uint256 id) public whenNotPaused returns (bool) { require(_percentOwner(_msgSender(), id, 50), "Only > 50% can update"); _property[id].configuration = configuration; emit UpdateConfiguration(id, configuration); return true; } // @dev only executable by > 70% owner function updateValidator(address validator, uint256 id) public whenNotPaused returns (bool) { require(_percentOwner(_msgSender(), id, 70), "Only > 70% can update"); _property[id].validator = validator; emit UpdateValidator(id, "validator", validator); emit TraitUpdated(keccak256("validator"), id, bytes32(bytes(_getValidatorName(id)))); return true; } function _getValidatorName(uint256 tokenId) internal view returns (string memory) { string memory validatorName = IFabricaValidatorRegistry(_validatorRegistry).name(_property[tokenId].validator); if (bytes(validatorName).length > 0) { return validatorName; } else { return "Custom"; } } function _getOperatingAgreementName(uint256 tokenId) internal view returns (string memory) { return IFabricaValidator(_property[tokenId].validator) .operatingAgreementName(_property[tokenId].operatingAgreement); } // @dev `threshold`: percentage threshold function _percentOwner(address wallet, uint256 id, uint256 threshold) internal virtual returns (bool) { uint256 shares = _balances[id][wallet]; if (shares == 0) { return false; } uint256 supply = _property[id].supply; if (supply == 0) { return false; } uint256 percent = MathUpgradeable.mulDiv(shares, 100, supply); return percent > threshold; } /** * @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 whenNotPaused { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); 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); _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 whenNotPaused { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); 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); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @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. * - `definition` cannot be null. */ function _mint( address[] memory recipients, uint sessionId, uint256[] memory amounts, Property memory property, bytes memory data ) internal virtual whenNotPaused returns(uint256) { require(bytes(property.definition).length > 0, "Definition is required"); require(sessionId > 0, "Valid sessionId is required"); require(property.supply > 0, "Minimum supply is 1"); require(recipients.length == amounts.length, 'Number of recipients and amounts must match'); // If validator is not specified during mint, use default validator address if (property.validator == address(0)) { // set default validator address property.validator = _defaultValidator; } if (bytes(property.operatingAgreement).length < 1) { property.operatingAgreement = IFabricaValidator(property.validator).defaultOperatingAgreement(); } uint256 id = generateId(_msgSender(), sessionId, property.operatingAgreement); require(_property[id].supply == 0, "Session ID already exist, please use a different one"); for (uint256 i = 0; i < recipients.length; i++) { address to = recipients[i]; require(to != address(0), "ERC1155: mint to the zero address"); uint256 amount = amounts[i]; _balances[id][to] += amount; _doSafeTransferAcceptanceCheck(_msgSender(), address(0), to, id, amount, data); emit TransferSingle(_msgSender(), address(0), to, id, amount); } // Update property data _property[id] = property; return id; } /** * @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[] memory recipients, uint256[] memory sessionIds, uint256[] memory amounts, Property[] memory properties, bytes memory data ) internal virtual whenNotPaused returns(uint256[] memory) { require(recipients.length == amounts.length, 'Number of recipients and amounts must match'); require(sessionIds.length == properties.length, "sessionIds and properties length mismatch"); // hit stack too deep error when using more variables, so we use sessionsIds.length in multiple // places instead of creating new variables uint256[] memory ids = new uint256[](sessionIds.length); for (uint256 i = 0; i < sessionIds.length; i++) { require(bytes(properties[i].definition).length > 0, "Definition is required"); require(sessionIds[i] > 0, "Valid sessionId is required"); require(properties[i].supply > 0, "Minimum supply is 1"); uint256 id = generateId(_msgSender(), sessionIds[i], properties[i].operatingAgreement); for (uint256 j = 0; j < recipients.length; j++) { address to = recipients[j]; require(to != address(0), "ERC1155: mint to the zero address"); uint256 amount = amounts[j]; _balances[id][to] += amount; uint256[] memory amountsForRecipient = new uint256[](ids.length); for (uint256 k = 0; k < ids.length; k++) { amountsForRecipient[k] = amount; } _doSafeBatchTransferAcceptanceCheck(_msgSender(), address(0), to, ids, amountsForRecipient, data); emit TransferBatch(_msgSender(), address(0), to, ids, amountsForRecipient); } require(_property[id].supply == 0, "Session ID already exist, please use a different one"); // If validator is not specified during mint, use default validator address if (properties[i].validator == address(0)) { // set default validator address properties[i].validator = _defaultValidator; } ids[i] = id; // Update property data _property[id] = properties[i]; } return ids; } /** * @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(); require(operator == from, "ERC1155: operator can only burn own token supply"); uint256 fromBalance = _balances[id][from]; uint256 fromSupply = _property[id].supply; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); require(fromSupply >= amount, "ERC1155: burn amount exceeds supply"); unchecked { _balances[id][from] = fromBalance - amount; _property[id].supply = fromSupply - amount; } emit TransferSingle(operator, from, address(0), id, amount); _doSafeTransferAcceptanceCheck(operator, from, address(0), id, amount, ""); } /** * @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(); require(operator == from, "ERC1155: operator can only burn own token supply"); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; uint256 fromSupply = _property[id].supply; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); require(fromSupply >= amount, "ERC1155: burn amount exceeds supply"); unchecked { _balances[id][from] = fromBalance - amount; _property[id].supply = fromSupply - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _doSafeBatchTransferAcceptanceCheck(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 whenNotPaused { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private whenNotPaused { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155ReceiverUpgradeable.onERC1155Received.selector) { revert("ERC1155: ERC1155ReceiverUpgradeable rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155ReceiverUpgradeable implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private whenNotPaused { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155ReceiverUpgradeable.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155ReceiverUpgradeable rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155ReceiverUpgradeable implementer"); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"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":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"TraitMetadataURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"traitKey","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"traitValue","type":"bytes32"}],"name":"TraitUpdated","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"string","name":"newData","type":"string"}],"name":"UpdateConfiguration","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"string","name":"newData","type":"string"}],"name":"UpdateOperatingAgreement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"dataType","type":"string"},{"indexed":false,"internalType":"address","name":"validator","type":"address"}],"name":"UpdateValidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_property","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"string","name":"operatingAgreement","type":"string"},{"internalType":"string","name":"definition","type":"string"},{"internalType":"string","name":"configuration","type":"string"},{"internalType":"address","name":"validator","type":"address"}],"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":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultValidator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"sessionId","type":"uint256"},{"internalType":"string","name":"operatingAgreement","type":"string"}],"name":"generateId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTraitMetadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"traitKey","type":"bytes32"}],"name":"getTraitValue","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32[]","name":"traitKeys","type":"bytes32[]"}],"name":"getTraitValues","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializeV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializeV3","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":"recipients","type":"address[]"},{"internalType":"uint256","name":"sessionId","type":"uint256"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"string","name":"definition","type":"string"},{"internalType":"string","name":"operatingAgreement","type":"string"},{"internalType":"string","name":"configuration","type":"string"},{"internalType":"address","name":"validator","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"sessionIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"string[]","name":"definitions","type":"string[]"},{"internalType":"string[]","name":"operatingAgreements","type":"string[]"},{"internalType":"string[]","name":"configurations","type":"string[]"},{"internalType":"address[]","name":"validators","type":"address[]"}],"name":"mintBatch","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"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":"newDefaultValidator","type":"address"}],"name":"setDefaultValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newProxyAdmin","type":"address"}],"name":"setProxyAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newValidatorRegistry","type":"address"}],"name":"setValidatorRegistry","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"configuration","type":"string"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"updateConfiguration","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"operatingAgreement","type":"string"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"updateOperatingAgreement","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"validator","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"updateValidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"validatorRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405230608052348015610013575f80fd5b5061001c610021565b6100dd565b5f54610100900460ff161561008c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146100db575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051614fc26101115f395f818161096c015281816109ac01528181610c5d01528181610c9d0152610d180152614fc25ff3fe6080604052600436106101be575f3560e01c8062fdd58e146101c257806301ffc9a7146101f45780630e89341c146102235780631117a0981461024f57806312279613146102705780632eb2c2d61461028f5780633659cfe6146102ae57806338e454b1146102cd5780633e47158c146102e15780633f4ba83a1461030257806347c026611461031657806349773050146103355780634e1273f4146103545780634f1ef2861461038057806352d1902d146103935780635c60da1b146103a75780635c975abb146103bb5780635cd8a76b146103d25780636a982298146103e65780636b20c45414610416578063715018a6146104355780638129fc1c146104495780638456cb591461045d5780638da5cb5b1461047157806394e2c9e314610485578063a1cca841146104a3578063a22cb465146104c2578063a28eec87146104e1578063b20b607b14610500578063b36c9db51461051f578063dc5180e61461053e578063de475bf91461055d578063e6635f5d14610571578063e985e9c514610590578063f242432a146105af578063f2fde38b146105ce578063f376ebbb146105ed578063f5298aca1461060b578063f80ecba31461062a575b5f80fd5b3480156101cd575f80fd5b506101e16101dc3660046137be565b610656565b6040519081526020015b60405180910390f35b3480156101ff575f80fd5b5061021361020e3660046137fb565b6106f0565b60405190151581526020016101eb565b34801561022e575f80fd5b5061024261023d366004613816565b61075a565b6040516101eb919061385b565b34801561025a575f80fd5b5061026e61026936600461386d565b61081f565b005b34801561027b575f80fd5b506101e161028a366004613a3d565b61084a565b34801561029a575f80fd5b5061026e6102a9366004613b1e565b61090e565b3480156102b9575f80fd5b5061026e6102c836600461386d565b610962565b3480156102d8575f80fd5b5061026e610a29565b3480156102ec575f80fd5b506102f5610ad0565b6040516101eb9190613bc0565b34801561030d575f80fd5b5061026e610ade565b348015610321575f80fd5b5061026e61033036600461386d565b610af8565b348015610340575f80fd5b5061026e61034f36600461386d565b610b09565b34801561035f575f80fd5b5061037361036e366004613bd4565b610b34565b6040516101eb9190613c6d565b61026e61038e366004613c7f565b610c53565b34801561039e575f80fd5b506101e1610d0c565b3480156103b2575f80fd5b506102f5610db9565b3480156103c6575f80fd5b5060975460ff16610213565b3480156103dd575f80fd5b5061026e610dc2565b3480156103f1575f80fd5b50610405610400366004613816565b610e36565b6040516101eb959493929190613cbf565b348015610421575f80fd5b50610213610430366004613d18565b611000565b348015610440575f80fd5b5061026e61101e565b348015610454575f80fd5b5061026e61102f565b348015610468575f80fd5b5061026e6110f8565b34801561047c575f80fd5b506102f5611110565b348015610490575f80fd5b50610130546001600160a01b03166102f5565b3480156104ae575f80fd5b506101e16104bd366004613d86565b61111f565b3480156104cd575f80fd5b5061026e6104dc366004613dce565b6111c0565b3480156104ec575f80fd5b506101e16104fb366004613e07565b6111d3565b34801561050b575f80fd5b5061037361051a366004613eac565b61125a565b34801561052a575f80fd5b50610213610539366004613fba565b611462565b348015610549575f80fd5b50610213610558366004613fba565b611537565b348015610568575f80fd5b506102426115ee565b34801561057c575f80fd5b5061021361058b3660046137be565b611611565b34801561059b575f80fd5b506102136105aa366004613ffb565b6116fe565b3480156105ba575f80fd5b5061026e6105c936600461402c565b611736565b3480156105d9575f80fd5b5061026e6105e836600461386d565b611783565b3480156105f8575f80fd5b50610131546001600160a01b03166102f5565b348015610616575f80fd5b5061021361062536600461408b565b6117f9565b348015610635575f80fd5b506106496106443660046140bb565b61180d565b6040516101eb9190614132565b5f6001600160a01b0383166106c55760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b505f81815261012d602090815260408083206001600160a01b03861684529091529020545b92915050565b5f6001600160e01b03198216636cdb3d1360e11b148061072057506001600160e01b031982166303a24d0760e21b145b8061073b5750635799979f60e11b6001600160e01b03198316145b806106ea57506301ffc9a760e01b6001600160e01b03198316146106ea565b5f81815261012f6020526040812060040154606091906001600160a01b03161561079e575f83815261012f60205260409020600401546001600160a01b03166107ac565b610130546001600160a01b03165b6040516303a24d0760e21b8152600481018590529091506001600160a01b03821690630e89341c906024015f60405180830381865afa1580156107f1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108189190810190614175565b9392505050565b610827611931565b61013080546001600160a01b0319166001600160a01b0392909216919091179055565b5f610853611990565b5f805b87518110156108b0575f888281518110610872576108726141f4565b602002602001015190505f811161089b5760405162461bcd60e51b81526004016106bc90614208565b6108a58184614261565b925050600101610856565b506108b961376d565b81815260208082018790526040808301899052606083018790526001600160a01b0386166080840152805191820190525f808252906108ff908c908c908c9086906119d6565b9b9a5050505050505050505050565b610916611990565b6001600160a01b038516331480610932575061093285336116fe565b61094e5760405162461bcd60e51b81526004016106bc90614274565b61095b8585858585611cce565b5050505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109aa5760405162461bcd60e51b81526004016106bc906142c2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109dc611e58565b6001600160a01b031614610a025760405162461bcd60e51b81526004016106bc906142fb565b610a0b81611e77565b604080515f80825260208201909252610a2691839190611e7f565b50565b5f54600390610100900460ff16158015610a4957505f5460ff8083169116105b610a655760405162461bcd60e51b81526004016106bc90614334565b5f805461ffff191660ff8316176101001781556040517f0c42722a91eb9b96ce65a38fc22054e4d2ab7ab642a9c0f92da35c99d965a7489190a15f805461ff001916905560405160ff821681525f80516020614f06833981519152906020015b60405180910390a150565b5f610ad9611fee565b905090565b610ae6611931565b610aee612002565b610af661204b565b565b610b00612097565b610a2681612114565b610b11611931565b61013180546001600160a01b0319166001600160a01b0392909216919091179055565b60608151835114610b995760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016106bc565b5f83516001600160401b03811115610bb357610bb3613886565b604051908082528060200260200182016040528015610bdc578160200160208202803683370190505b5090505f5b8451811015610c4b57610c26858281518110610bff57610bff6141f4565b6020026020010151858381518110610c1957610c196141f4565b6020026020010151610656565b828281518110610c3857610c386141f4565b6020908102919091010152600101610be1565b509392505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610c9b5760405162461bcd60e51b81526004016106bc906142c2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610ccd611e58565b6001600160a01b031614610cf35760405162461bcd60e51b81526004016106bc906142fb565b610cfc82611e77565b610d0882826001611e7f565b5050565b5f306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610da65760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b60648201526084016106bc565b505f80516020614ec68339815191525b90565b5f610ad9611e58565b5f54600290610100900460ff16158015610de257505f5460ff8083169116105b610dfe5760405162461bcd60e51b81526004016106bc90614334565b5f805461ffff191660ff83169081176101001761ff0019169091556040519081525f80516020614f0683398151915290602001610ac5565b61012f6020525f908152604090208054600182018054919291610e5890614382565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8490614382565b8015610ecf5780601f10610ea657610100808354040283529160200191610ecf565b820191905f5260205f20905b815481529060010190602001808311610eb257829003601f168201915b505050505090806002018054610ee490614382565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1090614382565b8015610f5b5780601f10610f3257610100808354040283529160200191610f5b565b820191905f5260205f20905b815481529060010190602001808311610f3e57829003601f168201915b505050505090806003018054610f7090614382565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9c90614382565b8015610fe75780601f10610fbe57610100808354040283529160200191610fe7565b820191905f5260205f20905b815481529060010190602001808311610fca57829003601f168201915b505050600490930154919250506001600160a01b031685565b5f611009611990565b611014848484612168565b5060019392505050565b611026611931565b610af65f612335565b5f54610100900460ff161580801561104d57505f54600160ff909116105b8061106d575061105c30612386565b15801561106d57505f5460ff166001145b6110895760405162461bcd60e51b81526004016106bc90614334565b5f805460ff1916600117905580156110aa575f805461ff0019166101001790555b6110b2612395565b6110ba6123bb565b6110c26123f1565b6110ca61241f565b8015610a26575f805461ff0019169055604051600181525f80516020614f0683398151915290602001610ac5565b611100611931565b611108611990565b610af661244d565b6065546001600160a01b031690565b5f611128611990565b5f61113d856001600160a01b0316601461248a565b90505f6111494661261f565b611152306126ae565b8361115c8861261f565b876040516020016111719594939291906143cb565b60405160208183030381529060405290505f816040516020016111949190614405565b60408051808303601f1901815291905280516020909101206001600160401b0316979650505050505050565b6111c8611990565b610d083383836126c4565b5f5f80516020614f4d8339815191528203611201576111f1836127ac565b6111fa90614410565b90506106ea565b5f80516020614ee6833981519152820361121e576111f18361286f565b60405162461bcd60e51b8152602060048201526011602482015270556e6b6e6f776e207472616974206b657960781b60448201526064016106bc565b6060611264611990565b5f805b87518110156112c1575f888281518110611283576112836141f4565b602002602001015190505f81116112ac5760405162461bcd60e51b81526004016106bc90614208565b6112b68184614261565b925050600101611267565b5087515f816001600160401b038111156112dd576112dd613886565b60405190808252806020026020018201604052801561131657816020015b61130361376d565b8152602001906001900390816112fb5790505b5090505f5b828110156114465783828281518110611336576113366141f4565b60200260200101515f018181525050878181518110611357576113576141f4565b6020026020010151828281518110611371576113716141f4565b602002602001015160200181905250888181518110611392576113926141f4565b60200260200101518282815181106113ac576113ac6141f4565b6020026020010151604001819052508681815181106113cd576113cd6141f4565b60200260200101518282815181106113e7576113e76141f4565b602002602001015160600181905250858181518110611408576114086141f4565b6020026020010151828281518110611422576114226141f4565b60209081029190910101516001600160a01b0390911660809091015260010161131b565b506108ff8b8b8b8460405180602001604052805f8152506128f5565b5f61146b611990565b611478335b836046612dbe565b6114945760405162461bcd60e51b81526004016106bc90614433565b5f82815261012f602052604090206001016114af84826144a6565b507f6b491e3cbe1a3d27a215d960a465834cf22a7e3e87ffe8be5724ab67f72583fb82846040516114e1929190614561565b60405180910390a15f80516020614ee68339815191525f80516020614f6d8339815191528361150f8561286f565b61151890614410565b604051611526929190614579565b60405180910390a250600192915050565b5f611540611990565b61154c33836032612dbe565b6115905760405162461bcd60e51b81526020600482015260156024820152744f6e6c79203e203530252063616e2075706461746560581b60448201526064016106bc565b5f82815261012f602052604090206003016115ab84826144a6565b507fb56c2e2e610c525cd60429993be20aab298f5bc84e28ad1a0b8eb2c2ca85592082846040516115dd929190614561565b60405180910390a150600192915050565b606060405180610260016040528061022f8152602001614c9761022f9139905090565b5f61161a611990565b61162333611470565b61163f5760405162461bcd60e51b81526004016106bc90614433565b5f82815261012f60205260409081902060040180546001600160a01b0386166001600160a01b0319909116179055517f56137a68f73d3785a7a236d27a378cb92851e1b1d68317de555fc4fde9c17add906116d09084908690918252606060208301819052600990830152683b30b634b230ba37b960b91b60808301526001600160a01b0316604082015260a00190565b60405180910390a15f80516020614f4d8339815191525f80516020614f6d8339815191528361150f856127ac565b5f611707611990565b506001600160a01b039182165f90815261012e6020908152604080832093909416825291909152205460ff1690565b61173e611990565b6001600160a01b03851633148061175a575061175a85336116fe565b6117765760405162461bcd60e51b81526004016106bc90614274565b61095b8585858585612e2c565b61178b611931565b6001600160a01b0381166117f05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106bc565b610a2681612335565b5f611802611990565b611014848484612f40565b60605f826001600160401b0381111561182857611828613886565b604051908082528060200260200182016040528015611851578160200160208202803683370190505b5090505f5b83811015611928575f858583818110611871576118716141f4565b9050602002013590505f80516020614f4d83398151915281036118c457611897876127ac565b6118a090614410565b8383815181106118b2576118b26141f4565b60200260200101818152505050611920565b5f80516020614ee683398151915281036118e1576118978761286f565b6118ea8261261f565b6040516020016118fa9190614587565b60408051601f198184030181529082905262461bcd60e51b82526106bc9160040161385b565b600101611856565b50949350505050565b3361193a611110565b6001600160a01b031614610af65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106bc565b60975460ff1615610af65760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106bc565b5f6119df611990565b5f83604001515111611a035760405162461bcd60e51b81526004016106bc906145b6565b5f8511611a225760405162461bcd60e51b81526004016106bc906145e6565b8251611a405760405162461bcd60e51b81526004016106bc9061461b565b8351865114611a615760405162461bcd60e51b81526004016106bc90614648565b60808301516001600160a01b0316611a8657610130546001600160a01b031660808401525b60018360200151511015611b005782608001516001600160a01b0316637bd312af6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611ad3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611afa9190810190614175565b60208401525b5f611b103387866020015161111f565b5f81815261012f602052604090205490915015611b3f5760405162461bcd60e51b81526004016106bc90614693565b5f5b8751811015611c44575f888281518110611b5d57611b5d6141f4565b602002602001015190505f6001600160a01b0316816001600160a01b031603611b985760405162461bcd60e51b81526004016106bc906146e7565b5f878381518110611bab57611bab6141f4565b6020908102919091018101515f86815261012d835260408082206001600160a01b0387168352909352918220805491935083929091611beb908490614261565b90915550611bff9050335f8487858b61307d565b6001600160a01b0382165f336001600160a01b03165f80516020614c378339815191528785604051611c32929190614579565b60405180910390a45050600101611b41565b505f81815261012f6020908152604090912085518155908501518591906001820190611c7090826144a6565b5060408201516002820190611c8590826144a6565b5060608201516003820190611c9a90826144a6565b5060809190910151600490910180546001600160a01b0319166001600160a01b039092169190911790559695505050505050565b611cd6611990565b8151835114611cf75760405162461bcd60e51b81526004016106bc90614728565b6001600160a01b038416611d1d5760405162461bcd60e51b81526004016106bc90614770565b335f5b8451811015611dfd575f858281518110611d3c57611d3c6141f4565b602002602001015190505f858381518110611d5957611d596141f4565b6020908102919091018101515f84815261012d835260408082206001600160a01b038e168352909352919091205490915081811015611daa5760405162461bcd60e51b81526004016106bc906147b5565b5f83815261012d602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611de9908490614261565b909155505060019093019250611d20915050565b50846001600160a01b0316866001600160a01b0316826001600160a01b03165f80516020614c178339815191528787604051611e3a9291906147ff565b60405180910390a4611e508187878787876131ef565b505050505050565b5f5f80516020614ec68339815191525b546001600160a01b0316919050565b610a26612097565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611eb757611eb2836132b8565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f11575060408051601f3d908101601f19168201909252611f0e9181019061482c565b60015b611f745760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016106bc565b5f80516020614ec68339815191528114611fe25760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016106bc565b50611eb2838383613354565b5f5f80516020614c57833981519152611e68565b60975460ff16610af65760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106bc565b612053612002565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405161208d9190613bc0565b60405180910390a1565b336120a0611fee565b6001600160a01b031614610af65760405162461bcd60e51b815260206004820152603560248201527f46616272696361555550535570677261646561626c653a2063616c6c6572206960448201527439903737ba103a343290383937bc3c9030b236b4b760591b60648201526084016106bc565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61213d611fee565b604080516001600160a01b03928316815291841660208301520160405180910390a1610a2681613378565b6001600160a01b03831661218e5760405162461bcd60e51b81526004016106bc90614843565b80518251146121af5760405162461bcd60e51b81526004016106bc90614728565b336001600160a01b03841681146121d85760405162461bcd60e51b81526004016106bc90614886565b5f5b83518110156122ce575f8482815181106121f6576121f66141f4565b602002602001015190505f848381518110612213576122136141f4565b6020908102919091018101515f84815261012d835260408082206001600160a01b038c16835284528082205486835261012f9094529020549092508282101561226e5760405162461bcd60e51b81526004016106bc906148d6565b8281101561228e5760405162461bcd60e51b81526004016106bc9061491a565b5f84815261012d602090815260408083206001600160a01b038d16845282528083209486900390945594815261012f9094529220910390556001016121da565b505f6001600160a01b0316846001600160a01b0316826001600160a01b03165f80516020614c17833981519152868660405161230b9291906147ff565b60405180910390a461232f81855f868660405180602001604052805f8152506131ef565b50505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b03163b151590565b5f54610100900460ff16610af65760405162461bcd60e51b81526004016106bc9061495d565b5f54610100900460ff166123e15760405162461bcd60e51b81526004016106bc9061495d565b6123e9612395565b610af6612395565b5f54610100900460ff166124175760405162461bcd60e51b81526004016106bc9061495d565b610af66133f1565b5f54610100900460ff166124455760405162461bcd60e51b81526004016106bc9061495d565b610af6613420565b612455611990565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120803390565b60605f6124988360026149a8565b6124a3906002614261565b6001600160401b038111156124ba576124ba613886565b6040519080825280601f01601f1916602001820160405280156124e4576020820181803683370190505b509050600360fc1b815f815181106124fe576124fe6141f4565b60200101906001600160f81b03191690815f1a905350600f60fb1b8160018151811061252c5761252c6141f4565b60200101906001600160f81b03191690815f1a9053505f61254e8460026149a8565b612559906001614261565b90505b60018111156125d0576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061258d5761258d6141f4565b1a60f81b8282815181106125a3576125a36141f4565b60200101906001600160f81b03191690815f1a90535060049490941c936125c9816149bf565b905061255c565b5083156108185760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016106bc565b60605f61262b83613452565b60010190505f816001600160401b0381111561264957612649613886565b6040519080825280601f01601f191660200182016040528015612673576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461267d57509392505050565b60606106ea6001600160a01b038316601461248a565b6126cc611990565b816001600160a01b0316836001600160a01b03160361273f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016106bc565b6001600160a01b038381165f81815261012e6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610131545f82815261012f6020526040808220600490810154915162cc244960e11b81526060946001600160a01b03908116936301984892936127f493919092169101613bc0565b5f60405180830381865afa15801561280e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128359190810190614175565b8051909150156128455792915050565b5050604080518082019091526006815265437573746f6d60d01b6020820152919050565b50919050565b5f81815261012f602052604090819020600480820154925163db93e05560e01b81526060936001600160a01b03169263db93e055926128b492600190920191016149e8565b5f60405180830381865afa1580156128ce573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106ea9190810190614175565b60606128ff611990565b83518651146129205760405162461bcd60e51b81526004016106bc90614648565b82518551146129835760405162461bcd60e51b815260206004820152602960248201527f73657373696f6e49647320616e642070726f70657274696573206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016106bc565b5f85516001600160401b0381111561299d5761299d613886565b6040519080825280602002602001820160405280156129c6578160200160208202803683370190505b5090505f5b8651811015612db3575f8582815181106129e7576129e76141f4565b6020026020010151604001515111612a115760405162461bcd60e51b81526004016106bc906145b6565b5f878281518110612a2457612a246141f4565b602002602001015111612a495760405162461bcd60e51b81526004016106bc906145e6565b5f858281518110612a5c57612a5c6141f4565b60200260200101515f015111612a845760405162461bcd60e51b81526004016106bc9061461b565b5f612ac633898481518110612a9b57612a9b6141f4565b6020026020010151888581518110612ab557612ab56141f4565b60200260200101516020015161111f565b90505f5b8951811015612c46575f8a8281518110612ae657612ae66141f4565b602002602001015190505f6001600160a01b0316816001600160a01b031603612b215760405162461bcd60e51b81526004016106bc906146e7565b5f898381518110612b3457612b346141f4565b6020908102919091018101515f86815261012d835260408082206001600160a01b0387168352909352918220805491935083929091612b74908490614261565b909155505085515f906001600160401b03811115612b9457612b94613886565b604051908082528060200260200182016040528015612bbd578160200160208202803683370190505b5090505f5b8751811015612bf15782828281518110612bde57612bde6141f4565b6020908102919091010152600101612bc2565b50612c00335f858a858e6131ef565b6001600160a01b0383165f336001600160a01b03165f80516020614c178339815191528a85604051612c339291906147ff565b60405180910390a4505050600101612aca565b505f81815261012f602052604090205415612c735760405162461bcd60e51b81526004016106bc90614693565b5f6001600160a01b0316868381518110612c8f57612c8f6141f4565b6020026020010151608001516001600160a01b031603612cf2576101305486516001600160a01b0390911690879084908110612ccd57612ccd6141f4565b6020026020010151608001906001600160a01b031690816001600160a01b0316815250505b80838381518110612d0557612d056141f4565b602002602001018181525050858281518110612d2357612d236141f4565b6020908102919091018101515f83815261012f83526040902081518155918101519091906001820190612d5690826144a6565b5060408201516002820190612d6b90826144a6565b5060608201516003820190612d8090826144a6565b5060809190910151600490910180546001600160a01b0319166001600160a01b03909216919091179055506001016129cb565b509695505050505050565b5f82815261012d602090815260408083206001600160a01b0387168452909152812054808203612df1575f915050610818565b5f84815261012f602052604081205490819003612e12575f92505050610818565b5f612e1f83606484613527565b9094109695505050505050565b612e34611990565b6001600160a01b038416612e5a5760405162461bcd60e51b81526004016106bc90614770565b5f83815261012d602090815260408083206001600160a01b0389168452909152902054339083811015612e9f5760405162461bcd60e51b81526004016106bc906147b5565b5f85815261012d602090815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290612ede908490614261565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03165f80516020614c378339815191528888604051612f21929190614579565b60405180910390a4612f3782888888888861307d565b50505050505050565b6001600160a01b038316612f665760405162461bcd60e51b81526004016106bc90614843565b336001600160a01b0384168114612f8f5760405162461bcd60e51b81526004016106bc90614886565b5f83815261012d602090815260408083206001600160a01b038816845282528083205486845261012f9092529091205483821015612fdf5760405162461bcd60e51b81526004016106bc906148d6565b83811015612fff5760405162461bcd60e51b81526004016106bc9061491a565b5f85815261012d602090815260408083206001600160a01b03808b16808652918452828520898803905589855261012f9093528184208886039055905190918616905f80516020614c378339815191529061305d908a908a90614579565b60405180910390a4611e5083875f888860405180602001604052805f8152505b613085611990565b613097846001600160a01b0316612386565b15611e505760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906130d09089908990889088908890600401614a72565b6020604051808303815f875af192505050801561310a575060408051601f3d908101601f1916820190925261310791810190614aab565b60015b6131bf57613116614ac6565b806308c379a00361314f575061312a614ade565b806131355750613151565b8060405162461bcd60e51b81526004016106bc919061385b565b505b60405162461bcd60e51b815260206004820152603f60248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f52656365697665725570677261646561626c6520696d706c656d656e7465720060648201526084016106bc565b6001600160e01b0319811663f23a6e6160e01b14612f375760405162461bcd60e51b81526004016106bc90614b66565b6131f7611990565b613209846001600160a01b0316612386565b15611e505760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906132429089908990889088908890600401614bb9565b6020604051808303815f875af192505050801561327c575060408051601f3d908101601f1916820190925261327991810190614aab565b60015b61328857613116614ac6565b6001600160e01b0319811663bc197c8160e01b14612f375760405162461bcd60e51b81526004016106bc90614b66565b6132c181612386565b6133235760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016106bc565b805f80516020614ec68339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b61335d8361360c565b5f825111806133695750805b15611eb25761232f838361364b565b6001600160a01b0381166133dd5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016106bc565b805f80516020614c57833981519152613333565b5f54610100900460ff166134175760405162461bcd60e51b81526004016106bc9061495d565b610af633612335565b5f54610100900460ff166134465760405162461bcd60e51b81526004016106bc9061495d565b6097805460ff19169055565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106134905772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6904ee2d6d415b85acef8160201b83106134ba576904ee2d6d415b85acef8160201b830492506020015b662386f26fc1000083106134d857662386f26fc10000830492506010015b6305f5e10083106134f0576305f5e100830492506008015b612710831061350457612710830492506004015b60648310613516576064830492506002015b600a83106106ea5760010192915050565b5f80805f19858709858702925082811083820303915050805f0361355e57838281613554576135546149d4565b0492505050610818565b8084116135a55760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016106bc565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b613615816132b8565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606108188383604051806060016040528060278152602001614f266027913960605f80856001600160a01b0316856040516136879190614405565b5f60405180830381855af49150503d805f81146136bf576040519150601f19603f3d011682016040523d82523d5f602084013e6136c4565b606091505b50915091506136d5868383876136df565b9695505050505050565b6060831561374b5782515f03613744576136f885612386565b6137445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106bc565b5081613755565b613755838361375d565b949350505050565b8151156131355781518083602001fd5b6040518060a001604052805f81526020016060815260200160608152602001606081526020015f6001600160a01b031681525090565b80356001600160a01b03811681146137b9575f80fd5b919050565b5f80604083850312156137cf575f80fd5b6137d8836137a3565b946020939093013593505050565b6001600160e01b031981168114610a26575f80fd5b5f6020828403121561380b575f80fd5b8135610818816137e6565b5f60208284031215613826575f80fd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610818602083018461382d565b5f6020828403121561387d575f80fd5b610818826137a3565b634e487b7160e01b5f52604160045260245ffd5b601f8201601f191681016001600160401b03811182821017156138bf576138bf613886565b6040525050565b5f6001600160401b038211156138de576138de613886565b5060051b60200190565b5f82601f8301126138f7575f80fd5b81356020613904826138c6565b604051613911828261389a565b80915083815260208101915060208460051b870101935086841115613934575f80fd5b602086015b84811015612db35761394a816137a3565b8352918301918301613939565b5f82601f830112613966575f80fd5b81356020613973826138c6565b604051613980828261389a565b80915083815260208101915060208460051b8701019350868411156139a3575f80fd5b602086015b84811015612db357803583529183019183016139a8565b5f6001600160401b038211156139d7576139d7613886565b50601f01601f191660200190565b5f82601f8301126139f4575f80fd5b81356139ff816139bf565b604051613a0c828261389a565b828152856020848701011115613a20575f80fd5b826020860160208301375f92810160200192909252509392505050565b5f805f805f805f60e0888a031215613a53575f80fd5b87356001600160401b0380821115613a69575f80fd5b613a758b838c016138e8565b985060208a0135975060408a0135915080821115613a91575f80fd5b613a9d8b838c01613957565b965060608a0135915080821115613ab2575f80fd5b613abe8b838c016139e5565b955060808a0135915080821115613ad3575f80fd5b613adf8b838c016139e5565b945060a08a0135915080821115613af4575f80fd5b50613b018a828b016139e5565b925050613b1060c089016137a3565b905092959891949750929550565b5f805f805f60a08688031215613b32575f80fd5b613b3b866137a3565b9450613b49602087016137a3565b935060408601356001600160401b0380821115613b64575f80fd5b613b7089838a01613957565b94506060880135915080821115613b85575f80fd5b613b9189838a01613957565b93506080880135915080821115613ba6575f80fd5b50613bb3888289016139e5565b9150509295509295909350565b6001600160a01b0391909116815260200190565b5f8060408385031215613be5575f80fd5b82356001600160401b0380821115613bfb575f80fd5b613c07868387016138e8565b93506020850135915080821115613c1c575f80fd5b50613c2985828601613957565b9150509250929050565b5f815180845260208085019450602084015f5b83811015613c6257815187529582019590820190600101613c46565b509495945050505050565b602081525f6108186020830184613c33565b5f8060408385031215613c90575f80fd5b613c99836137a3565b915060208301356001600160401b03811115613cb3575f80fd5b613c29858286016139e5565b85815260a060208201525f613cd760a083018761382d565b8281036040840152613ce9818761382d565b90508281036060840152613cfd818661382d565b91505060018060a01b03831660808301529695505050505050565b5f805f60608486031215613d2a575f80fd5b613d33846137a3565b925060208401356001600160401b0380821115613d4e575f80fd5b613d5a87838801613957565b93506040860135915080821115613d6f575f80fd5b50613d7c86828701613957565b9150509250925092565b5f805f60608486031215613d98575f80fd5b613da1846137a3565b92506020840135915060408401356001600160401b03811115613dc2575f80fd5b613d7c868287016139e5565b5f8060408385031215613ddf575f80fd5b613de8836137a3565b915060208301358015158114613dfc575f80fd5b809150509250929050565b5f8060408385031215613e18575f80fd5b50508035926020909101359150565b5f82601f830112613e36575f80fd5b81356020613e43826138c6565b604051613e50828261389a565b83815260059390931b8501820192828101915086841115613e6f575f80fd5b8286015b84811015612db35780356001600160401b03811115613e90575f80fd5b613e9e8986838b01016139e5565b845250918301918301613e73565b5f805f805f805f60e0888a031215613ec2575f80fd5b87356001600160401b0380821115613ed8575f80fd5b613ee48b838c016138e8565b985060208a0135915080821115613ef9575f80fd5b613f058b838c01613957565b975060408a0135915080821115613f1a575f80fd5b613f268b838c01613957565b965060608a0135915080821115613f3b575f80fd5b613f478b838c01613e27565b955060808a0135915080821115613f5c575f80fd5b613f688b838c01613e27565b945060a08a0135915080821115613f7d575f80fd5b613f898b838c01613e27565b935060c08a0135915080821115613f9e575f80fd5b50613fab8a828b016138e8565b91505092959891949750929550565b5f8060408385031215613fcb575f80fd5b82356001600160401b03811115613fe0575f80fd5b613fec858286016139e5565b95602094909401359450505050565b5f806040838503121561400c575f80fd5b614015836137a3565b9150614023602084016137a3565b90509250929050565b5f805f805f60a08688031215614040575f80fd5b614049866137a3565b9450614057602087016137a3565b9350604086013592506060860135915060808601356001600160401b0381111561407f575f80fd5b613bb3888289016139e5565b5f805f6060848603121561409d575f80fd5b6140a6846137a3565b95602085013595506040909401359392505050565b5f805f604084860312156140cd575f80fd5b8335925060208401356001600160401b03808211156140ea575f80fd5b818601915086601f8301126140fd575f80fd5b81358181111561410b575f80fd5b8760208260051b850101111561411f575f80fd5b6020830194508093505050509250925092565b602080825282518282018190525f9190848201906040850190845b818110156141695783518352928401929184019160010161414d565b50909695505050505050565b5f60208284031215614185575f80fd5b81516001600160401b0381111561419a575f80fd5b8201601f810184136141aa575f80fd5b80516141b5816139bf565b6040516141c2828261389a565b8281528660208486010111156141d6575f80fd5b8260208501602083015e5f9281016020019290925250949350505050565b634e487b7160e01b5f52603260045260245ffd5b60208082526025908201527f4561636820616d6f756e74206d7573742062652067726561746572207468616e604082015264207a65726f60d81b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ea576106ea61424d565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252602c908201525f80516020614c7783398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201525f80516020614c7783398151915260408201526b6163746976652070726f787960a01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600181811c9082168061439657607f821691505b60208210810361286957634e487b7160e01b5f52602260045260245ffd5b5f81518060208401855e5f93019283525090919050565b5f6143fa6143f46143ee6143e86143e2868c6143b4565b8a6143b4565b886143b4565b866143b4565b846143b4565b979650505050505050565b5f61081882846143b4565b80516020808301519190811015612869575f1960209190910360031b1b16919050565b6020808252601590820152744f6e6c79203e203730252063616e2075706461746560581b604082015260600190565b601f821115611eb257805f5260205f20601f840160051c810160208510156144875750805b601f840160051c820191505b8181101561095b575f8155600101614493565b81516001600160401b038111156144bf576144bf613886565b6144d3816144cd8454614382565b84614462565b602080601f831160018114614506575f84156144ef5750858301515b5f19600386901b1c1916600185901b178555611e50565b5f85815260208120601f198616915b8281101561453457888601518255948401946001909101908401614515565b508582101561455157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201525f613755604083018461382d565b918252602082015260400190565b7a02ab735b737bbb7103a3930b4ba1035b2bc9030ba1034b73232bc1602d1b81525f610818601b8301846143b4565b6020808252601690820152751119599a5b9a5d1a5bdb881a5cc81c995c5d5a5c995960521b604082015260600190565b6020808252601b908201527a15985b1a59081cd95cdcda5bdb9259081a5cc81c995c5d5a5c9959602a1b604082015260600190565b6020808252601390820152724d696e696d756d20737570706c79206973203160681b604082015260600190565b6020808252602b908201527f4e756d626572206f6620726563697069656e747320616e6420616d6f756e747360408201526a040daeae6e840dac2e8c6d60ab1b606082015260800190565b60208082526034908201527f53657373696f6e20494420616c72656164792065786973742c20706c6561736560408201527320757365206120646966666572656e74206f6e6560601b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081525f6148116040830185613c33565b82810360208401526148238185613c33565b95945050505050565b5f6020828403121561483c575f80fd5b5051919050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526030908201527f455243313135353a206f70657261746f722063616e206f6e6c79206275726e2060408201526f6f776e20746f6b656e20737570706c7960801b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526023908201527f455243313135353a206275726e20616d6f756e74206578636565647320737570604082015262706c7960e81b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b80820281158282048414176106ea576106ea61424d565b5f816149cd576149cd61424d565b505f190190565b634e487b7160e01b5f52601260045260245ffd5b5f60208083525f84546149fa81614382565b806020870152604060018084165f8114614a1b5760018114614a3757614a64565b60ff19851660408a0152604084151560051b8a01019550614a64565b895f5260205f205f5b85811015614a5b5781548b8201860152908301908801614a40565b8a016040019650505b509398975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190525f906143fa9083018461382d565b5f60208284031215614abb575f80fd5b8151610818816137e6565b5f60033d1115610db65760045f803e505f5160e01c90565b5f60443d1015614aeb5790565b6040516003193d81016004833e81513d6001600160401b038083116024840183101715614b1a57505050505090565b8285019150815181811115614b325750505050505090565b843d8701016020828501011115614b4c5750505050505090565b614b5b6020828601018761389a565b509095945050505050565b60208082526033908201527f455243313135353a204552433131353552656365697665725570677261646561604082015272626c652072656a656374656420746f6b656e7360681b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190525f90614be490830186613c33565b8281036060840152614bf68186613c33565b90508281036080840152614c0a818561382d565b9897505050505050505056fe4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fbc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610346756e6374696f6e206d7573742062652063616c6c6564207468726f75676820646174613a6170706c69636174696f6e2f6a736f6e3b636861727365743d7574662d383b6261736536342c65776f6749434a30636d467064484d694f6942374369416749434169646d46736157526864473979496a6f6765776f6749434167494341695a476c7a6347786865553568625755694f694169566d467361575268644739794969774b4943416749434167496d5268644746556558426c496a6f6765776f67494341674943416749434a306558426c496a6f67496e4e30636d6c755a794973436941674943416749434167496d3170626b786c626d6430614349364944454b49434167494341676653774b4943416749434167496e5a6862476c6b5958526c543235545957786c496a6f67496e4a6c63585670636d56466353494b494341674948307343694167494341696233426c636d46306157356e515764795a5756745a573530496a6f6765776f6749434167494341695a476c7a6347786865553568625755694f6941695433426c636d46306157356e4945466e636d566c6257567564434973436941674943416749434a6b5958526856486c775a5349364948734b49434167494341674943416964486c775a53493649434a7a64484a70626d63694c416f67494341674943416749434a746157354d5a57356e644767694f694178436941674943416749483073436941674943416749434a32595778705a4746305a553975553246735a53493649434a795a58463161584a6c5258456943694167494342394369416766517039360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf79c5b8f4e5d24b1dd265bfd81260bf56ebce81cabf0686c91876d7f666afb727f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65647f11e8a47c8f6f2761361211fdf25db4167076f4c74d7c390a15f4211bc8c2148386f3b08e49490d0c5a9d2c401c091f13b01a17d75ce4a2f0f8f923b410ff7da26469706673582212202f9df4bdf9c0045ae5cee986cdf23687f5dff5b0035456544c781b8405e9256264736f6c63430008190033
Deployed Bytecode
0x6080604052600436106101be575f3560e01c8062fdd58e146101c257806301ffc9a7146101f45780630e89341c146102235780631117a0981461024f57806312279613146102705780632eb2c2d61461028f5780633659cfe6146102ae57806338e454b1146102cd5780633e47158c146102e15780633f4ba83a1461030257806347c026611461031657806349773050146103355780634e1273f4146103545780634f1ef2861461038057806352d1902d146103935780635c60da1b146103a75780635c975abb146103bb5780635cd8a76b146103d25780636a982298146103e65780636b20c45414610416578063715018a6146104355780638129fc1c146104495780638456cb591461045d5780638da5cb5b1461047157806394e2c9e314610485578063a1cca841146104a3578063a22cb465146104c2578063a28eec87146104e1578063b20b607b14610500578063b36c9db51461051f578063dc5180e61461053e578063de475bf91461055d578063e6635f5d14610571578063e985e9c514610590578063f242432a146105af578063f2fde38b146105ce578063f376ebbb146105ed578063f5298aca1461060b578063f80ecba31461062a575b5f80fd5b3480156101cd575f80fd5b506101e16101dc3660046137be565b610656565b6040519081526020015b60405180910390f35b3480156101ff575f80fd5b5061021361020e3660046137fb565b6106f0565b60405190151581526020016101eb565b34801561022e575f80fd5b5061024261023d366004613816565b61075a565b6040516101eb919061385b565b34801561025a575f80fd5b5061026e61026936600461386d565b61081f565b005b34801561027b575f80fd5b506101e161028a366004613a3d565b61084a565b34801561029a575f80fd5b5061026e6102a9366004613b1e565b61090e565b3480156102b9575f80fd5b5061026e6102c836600461386d565b610962565b3480156102d8575f80fd5b5061026e610a29565b3480156102ec575f80fd5b506102f5610ad0565b6040516101eb9190613bc0565b34801561030d575f80fd5b5061026e610ade565b348015610321575f80fd5b5061026e61033036600461386d565b610af8565b348015610340575f80fd5b5061026e61034f36600461386d565b610b09565b34801561035f575f80fd5b5061037361036e366004613bd4565b610b34565b6040516101eb9190613c6d565b61026e61038e366004613c7f565b610c53565b34801561039e575f80fd5b506101e1610d0c565b3480156103b2575f80fd5b506102f5610db9565b3480156103c6575f80fd5b5060975460ff16610213565b3480156103dd575f80fd5b5061026e610dc2565b3480156103f1575f80fd5b50610405610400366004613816565b610e36565b6040516101eb959493929190613cbf565b348015610421575f80fd5b50610213610430366004613d18565b611000565b348015610440575f80fd5b5061026e61101e565b348015610454575f80fd5b5061026e61102f565b348015610468575f80fd5b5061026e6110f8565b34801561047c575f80fd5b506102f5611110565b348015610490575f80fd5b50610130546001600160a01b03166102f5565b3480156104ae575f80fd5b506101e16104bd366004613d86565b61111f565b3480156104cd575f80fd5b5061026e6104dc366004613dce565b6111c0565b3480156104ec575f80fd5b506101e16104fb366004613e07565b6111d3565b34801561050b575f80fd5b5061037361051a366004613eac565b61125a565b34801561052a575f80fd5b50610213610539366004613fba565b611462565b348015610549575f80fd5b50610213610558366004613fba565b611537565b348015610568575f80fd5b506102426115ee565b34801561057c575f80fd5b5061021361058b3660046137be565b611611565b34801561059b575f80fd5b506102136105aa366004613ffb565b6116fe565b3480156105ba575f80fd5b5061026e6105c936600461402c565b611736565b3480156105d9575f80fd5b5061026e6105e836600461386d565b611783565b3480156105f8575f80fd5b50610131546001600160a01b03166102f5565b348015610616575f80fd5b5061021361062536600461408b565b6117f9565b348015610635575f80fd5b506106496106443660046140bb565b61180d565b6040516101eb9190614132565b5f6001600160a01b0383166106c55760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b505f81815261012d602090815260408083206001600160a01b03861684529091529020545b92915050565b5f6001600160e01b03198216636cdb3d1360e11b148061072057506001600160e01b031982166303a24d0760e21b145b8061073b5750635799979f60e11b6001600160e01b03198316145b806106ea57506301ffc9a760e01b6001600160e01b03198316146106ea565b5f81815261012f6020526040812060040154606091906001600160a01b03161561079e575f83815261012f60205260409020600401546001600160a01b03166107ac565b610130546001600160a01b03165b6040516303a24d0760e21b8152600481018590529091506001600160a01b03821690630e89341c906024015f60405180830381865afa1580156107f1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108189190810190614175565b9392505050565b610827611931565b61013080546001600160a01b0319166001600160a01b0392909216919091179055565b5f610853611990565b5f805b87518110156108b0575f888281518110610872576108726141f4565b602002602001015190505f811161089b5760405162461bcd60e51b81526004016106bc90614208565b6108a58184614261565b925050600101610856565b506108b961376d565b81815260208082018790526040808301899052606083018790526001600160a01b0386166080840152805191820190525f808252906108ff908c908c908c9086906119d6565b9b9a5050505050505050505050565b610916611990565b6001600160a01b038516331480610932575061093285336116fe565b61094e5760405162461bcd60e51b81526004016106bc90614274565b61095b8585858585611cce565b5050505050565b6001600160a01b037f000000000000000000000000d1336777df7c9ca43842f91eecf74bd4be70c4771630036109aa5760405162461bcd60e51b81526004016106bc906142c2565b7f000000000000000000000000d1336777df7c9ca43842f91eecf74bd4be70c4776001600160a01b03166109dc611e58565b6001600160a01b031614610a025760405162461bcd60e51b81526004016106bc906142fb565b610a0b81611e77565b604080515f80825260208201909252610a2691839190611e7f565b50565b5f54600390610100900460ff16158015610a4957505f5460ff8083169116105b610a655760405162461bcd60e51b81526004016106bc90614334565b5f805461ffff191660ff8316176101001781556040517f0c42722a91eb9b96ce65a38fc22054e4d2ab7ab642a9c0f92da35c99d965a7489190a15f805461ff001916905560405160ff821681525f80516020614f06833981519152906020015b60405180910390a150565b5f610ad9611fee565b905090565b610ae6611931565b610aee612002565b610af661204b565b565b610b00612097565b610a2681612114565b610b11611931565b61013180546001600160a01b0319166001600160a01b0392909216919091179055565b60608151835114610b995760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016106bc565b5f83516001600160401b03811115610bb357610bb3613886565b604051908082528060200260200182016040528015610bdc578160200160208202803683370190505b5090505f5b8451811015610c4b57610c26858281518110610bff57610bff6141f4565b6020026020010151858381518110610c1957610c196141f4565b6020026020010151610656565b828281518110610c3857610c386141f4565b6020908102919091010152600101610be1565b509392505050565b6001600160a01b037f000000000000000000000000d1336777df7c9ca43842f91eecf74bd4be70c477163003610c9b5760405162461bcd60e51b81526004016106bc906142c2565b7f000000000000000000000000d1336777df7c9ca43842f91eecf74bd4be70c4776001600160a01b0316610ccd611e58565b6001600160a01b031614610cf35760405162461bcd60e51b81526004016106bc906142fb565b610cfc82611e77565b610d0882826001611e7f565b5050565b5f306001600160a01b037f000000000000000000000000d1336777df7c9ca43842f91eecf74bd4be70c4771614610da65760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b60648201526084016106bc565b505f80516020614ec68339815191525b90565b5f610ad9611e58565b5f54600290610100900460ff16158015610de257505f5460ff8083169116105b610dfe5760405162461bcd60e51b81526004016106bc90614334565b5f805461ffff191660ff83169081176101001761ff0019169091556040519081525f80516020614f0683398151915290602001610ac5565b61012f6020525f908152604090208054600182018054919291610e5890614382565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8490614382565b8015610ecf5780601f10610ea657610100808354040283529160200191610ecf565b820191905f5260205f20905b815481529060010190602001808311610eb257829003601f168201915b505050505090806002018054610ee490614382565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1090614382565b8015610f5b5780601f10610f3257610100808354040283529160200191610f5b565b820191905f5260205f20905b815481529060010190602001808311610f3e57829003601f168201915b505050505090806003018054610f7090614382565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9c90614382565b8015610fe75780601f10610fbe57610100808354040283529160200191610fe7565b820191905f5260205f20905b815481529060010190602001808311610fca57829003601f168201915b505050600490930154919250506001600160a01b031685565b5f611009611990565b611014848484612168565b5060019392505050565b611026611931565b610af65f612335565b5f54610100900460ff161580801561104d57505f54600160ff909116105b8061106d575061105c30612386565b15801561106d57505f5460ff166001145b6110895760405162461bcd60e51b81526004016106bc90614334565b5f805460ff1916600117905580156110aa575f805461ff0019166101001790555b6110b2612395565b6110ba6123bb565b6110c26123f1565b6110ca61241f565b8015610a26575f805461ff0019169055604051600181525f80516020614f0683398151915290602001610ac5565b611100611931565b611108611990565b610af661244d565b6065546001600160a01b031690565b5f611128611990565b5f61113d856001600160a01b0316601461248a565b90505f6111494661261f565b611152306126ae565b8361115c8861261f565b876040516020016111719594939291906143cb565b60405160208183030381529060405290505f816040516020016111949190614405565b60408051808303601f1901815291905280516020909101206001600160401b0316979650505050505050565b6111c8611990565b610d083383836126c4565b5f5f80516020614f4d8339815191528203611201576111f1836127ac565b6111fa90614410565b90506106ea565b5f80516020614ee6833981519152820361121e576111f18361286f565b60405162461bcd60e51b8152602060048201526011602482015270556e6b6e6f776e207472616974206b657960781b60448201526064016106bc565b6060611264611990565b5f805b87518110156112c1575f888281518110611283576112836141f4565b602002602001015190505f81116112ac5760405162461bcd60e51b81526004016106bc90614208565b6112b68184614261565b925050600101611267565b5087515f816001600160401b038111156112dd576112dd613886565b60405190808252806020026020018201604052801561131657816020015b61130361376d565b8152602001906001900390816112fb5790505b5090505f5b828110156114465783828281518110611336576113366141f4565b60200260200101515f018181525050878181518110611357576113576141f4565b6020026020010151828281518110611371576113716141f4565b602002602001015160200181905250888181518110611392576113926141f4565b60200260200101518282815181106113ac576113ac6141f4565b6020026020010151604001819052508681815181106113cd576113cd6141f4565b60200260200101518282815181106113e7576113e76141f4565b602002602001015160600181905250858181518110611408576114086141f4565b6020026020010151828281518110611422576114226141f4565b60209081029190910101516001600160a01b0390911660809091015260010161131b565b506108ff8b8b8b8460405180602001604052805f8152506128f5565b5f61146b611990565b611478335b836046612dbe565b6114945760405162461bcd60e51b81526004016106bc90614433565b5f82815261012f602052604090206001016114af84826144a6565b507f6b491e3cbe1a3d27a215d960a465834cf22a7e3e87ffe8be5724ab67f72583fb82846040516114e1929190614561565b60405180910390a15f80516020614ee68339815191525f80516020614f6d8339815191528361150f8561286f565b61151890614410565b604051611526929190614579565b60405180910390a250600192915050565b5f611540611990565b61154c33836032612dbe565b6115905760405162461bcd60e51b81526020600482015260156024820152744f6e6c79203e203530252063616e2075706461746560581b60448201526064016106bc565b5f82815261012f602052604090206003016115ab84826144a6565b507fb56c2e2e610c525cd60429993be20aab298f5bc84e28ad1a0b8eb2c2ca85592082846040516115dd929190614561565b60405180910390a150600192915050565b606060405180610260016040528061022f8152602001614c9761022f9139905090565b5f61161a611990565b61162333611470565b61163f5760405162461bcd60e51b81526004016106bc90614433565b5f82815261012f60205260409081902060040180546001600160a01b0386166001600160a01b0319909116179055517f56137a68f73d3785a7a236d27a378cb92851e1b1d68317de555fc4fde9c17add906116d09084908690918252606060208301819052600990830152683b30b634b230ba37b960b91b60808301526001600160a01b0316604082015260a00190565b60405180910390a15f80516020614f4d8339815191525f80516020614f6d8339815191528361150f856127ac565b5f611707611990565b506001600160a01b039182165f90815261012e6020908152604080832093909416825291909152205460ff1690565b61173e611990565b6001600160a01b03851633148061175a575061175a85336116fe565b6117765760405162461bcd60e51b81526004016106bc90614274565b61095b8585858585612e2c565b61178b611931565b6001600160a01b0381166117f05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106bc565b610a2681612335565b5f611802611990565b611014848484612f40565b60605f826001600160401b0381111561182857611828613886565b604051908082528060200260200182016040528015611851578160200160208202803683370190505b5090505f5b83811015611928575f858583818110611871576118716141f4565b9050602002013590505f80516020614f4d83398151915281036118c457611897876127ac565b6118a090614410565b8383815181106118b2576118b26141f4565b60200260200101818152505050611920565b5f80516020614ee683398151915281036118e1576118978761286f565b6118ea8261261f565b6040516020016118fa9190614587565b60408051601f198184030181529082905262461bcd60e51b82526106bc9160040161385b565b600101611856565b50949350505050565b3361193a611110565b6001600160a01b031614610af65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106bc565b60975460ff1615610af65760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106bc565b5f6119df611990565b5f83604001515111611a035760405162461bcd60e51b81526004016106bc906145b6565b5f8511611a225760405162461bcd60e51b81526004016106bc906145e6565b8251611a405760405162461bcd60e51b81526004016106bc9061461b565b8351865114611a615760405162461bcd60e51b81526004016106bc90614648565b60808301516001600160a01b0316611a8657610130546001600160a01b031660808401525b60018360200151511015611b005782608001516001600160a01b0316637bd312af6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611ad3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611afa9190810190614175565b60208401525b5f611b103387866020015161111f565b5f81815261012f602052604090205490915015611b3f5760405162461bcd60e51b81526004016106bc90614693565b5f5b8751811015611c44575f888281518110611b5d57611b5d6141f4565b602002602001015190505f6001600160a01b0316816001600160a01b031603611b985760405162461bcd60e51b81526004016106bc906146e7565b5f878381518110611bab57611bab6141f4565b6020908102919091018101515f86815261012d835260408082206001600160a01b0387168352909352918220805491935083929091611beb908490614261565b90915550611bff9050335f8487858b61307d565b6001600160a01b0382165f336001600160a01b03165f80516020614c378339815191528785604051611c32929190614579565b60405180910390a45050600101611b41565b505f81815261012f6020908152604090912085518155908501518591906001820190611c7090826144a6565b5060408201516002820190611c8590826144a6565b5060608201516003820190611c9a90826144a6565b5060809190910151600490910180546001600160a01b0319166001600160a01b039092169190911790559695505050505050565b611cd6611990565b8151835114611cf75760405162461bcd60e51b81526004016106bc90614728565b6001600160a01b038416611d1d5760405162461bcd60e51b81526004016106bc90614770565b335f5b8451811015611dfd575f858281518110611d3c57611d3c6141f4565b602002602001015190505f858381518110611d5957611d596141f4565b6020908102919091018101515f84815261012d835260408082206001600160a01b038e168352909352919091205490915081811015611daa5760405162461bcd60e51b81526004016106bc906147b5565b5f83815261012d602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611de9908490614261565b909155505060019093019250611d20915050565b50846001600160a01b0316866001600160a01b0316826001600160a01b03165f80516020614c178339815191528787604051611e3a9291906147ff565b60405180910390a4611e508187878787876131ef565b505050505050565b5f5f80516020614ec68339815191525b546001600160a01b0316919050565b610a26612097565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611eb757611eb2836132b8565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f11575060408051601f3d908101601f19168201909252611f0e9181019061482c565b60015b611f745760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016106bc565b5f80516020614ec68339815191528114611fe25760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016106bc565b50611eb2838383613354565b5f5f80516020614c57833981519152611e68565b60975460ff16610af65760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106bc565b612053612002565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405161208d9190613bc0565b60405180910390a1565b336120a0611fee565b6001600160a01b031614610af65760405162461bcd60e51b815260206004820152603560248201527f46616272696361555550535570677261646561626c653a2063616c6c6572206960448201527439903737ba103a343290383937bc3c9030b236b4b760591b60648201526084016106bc565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61213d611fee565b604080516001600160a01b03928316815291841660208301520160405180910390a1610a2681613378565b6001600160a01b03831661218e5760405162461bcd60e51b81526004016106bc90614843565b80518251146121af5760405162461bcd60e51b81526004016106bc90614728565b336001600160a01b03841681146121d85760405162461bcd60e51b81526004016106bc90614886565b5f5b83518110156122ce575f8482815181106121f6576121f66141f4565b602002602001015190505f848381518110612213576122136141f4565b6020908102919091018101515f84815261012d835260408082206001600160a01b038c16835284528082205486835261012f9094529020549092508282101561226e5760405162461bcd60e51b81526004016106bc906148d6565b8281101561228e5760405162461bcd60e51b81526004016106bc9061491a565b5f84815261012d602090815260408083206001600160a01b038d16845282528083209486900390945594815261012f9094529220910390556001016121da565b505f6001600160a01b0316846001600160a01b0316826001600160a01b03165f80516020614c17833981519152868660405161230b9291906147ff565b60405180910390a461232f81855f868660405180602001604052805f8152506131ef565b50505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b03163b151590565b5f54610100900460ff16610af65760405162461bcd60e51b81526004016106bc9061495d565b5f54610100900460ff166123e15760405162461bcd60e51b81526004016106bc9061495d565b6123e9612395565b610af6612395565b5f54610100900460ff166124175760405162461bcd60e51b81526004016106bc9061495d565b610af66133f1565b5f54610100900460ff166124455760405162461bcd60e51b81526004016106bc9061495d565b610af6613420565b612455611990565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120803390565b60605f6124988360026149a8565b6124a3906002614261565b6001600160401b038111156124ba576124ba613886565b6040519080825280601f01601f1916602001820160405280156124e4576020820181803683370190505b509050600360fc1b815f815181106124fe576124fe6141f4565b60200101906001600160f81b03191690815f1a905350600f60fb1b8160018151811061252c5761252c6141f4565b60200101906001600160f81b03191690815f1a9053505f61254e8460026149a8565b612559906001614261565b90505b60018111156125d0576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061258d5761258d6141f4565b1a60f81b8282815181106125a3576125a36141f4565b60200101906001600160f81b03191690815f1a90535060049490941c936125c9816149bf565b905061255c565b5083156108185760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016106bc565b60605f61262b83613452565b60010190505f816001600160401b0381111561264957612649613886565b6040519080825280601f01601f191660200182016040528015612673576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461267d57509392505050565b60606106ea6001600160a01b038316601461248a565b6126cc611990565b816001600160a01b0316836001600160a01b03160361273f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016106bc565b6001600160a01b038381165f81815261012e6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610131545f82815261012f6020526040808220600490810154915162cc244960e11b81526060946001600160a01b03908116936301984892936127f493919092169101613bc0565b5f60405180830381865afa15801561280e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128359190810190614175565b8051909150156128455792915050565b5050604080518082019091526006815265437573746f6d60d01b6020820152919050565b50919050565b5f81815261012f602052604090819020600480820154925163db93e05560e01b81526060936001600160a01b03169263db93e055926128b492600190920191016149e8565b5f60405180830381865afa1580156128ce573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106ea9190810190614175565b60606128ff611990565b83518651146129205760405162461bcd60e51b81526004016106bc90614648565b82518551146129835760405162461bcd60e51b815260206004820152602960248201527f73657373696f6e49647320616e642070726f70657274696573206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016106bc565b5f85516001600160401b0381111561299d5761299d613886565b6040519080825280602002602001820160405280156129c6578160200160208202803683370190505b5090505f5b8651811015612db3575f8582815181106129e7576129e76141f4565b6020026020010151604001515111612a115760405162461bcd60e51b81526004016106bc906145b6565b5f878281518110612a2457612a246141f4565b602002602001015111612a495760405162461bcd60e51b81526004016106bc906145e6565b5f858281518110612a5c57612a5c6141f4565b60200260200101515f015111612a845760405162461bcd60e51b81526004016106bc9061461b565b5f612ac633898481518110612a9b57612a9b6141f4565b6020026020010151888581518110612ab557612ab56141f4565b60200260200101516020015161111f565b90505f5b8951811015612c46575f8a8281518110612ae657612ae66141f4565b602002602001015190505f6001600160a01b0316816001600160a01b031603612b215760405162461bcd60e51b81526004016106bc906146e7565b5f898381518110612b3457612b346141f4565b6020908102919091018101515f86815261012d835260408082206001600160a01b0387168352909352918220805491935083929091612b74908490614261565b909155505085515f906001600160401b03811115612b9457612b94613886565b604051908082528060200260200182016040528015612bbd578160200160208202803683370190505b5090505f5b8751811015612bf15782828281518110612bde57612bde6141f4565b6020908102919091010152600101612bc2565b50612c00335f858a858e6131ef565b6001600160a01b0383165f336001600160a01b03165f80516020614c178339815191528a85604051612c339291906147ff565b60405180910390a4505050600101612aca565b505f81815261012f602052604090205415612c735760405162461bcd60e51b81526004016106bc90614693565b5f6001600160a01b0316868381518110612c8f57612c8f6141f4565b6020026020010151608001516001600160a01b031603612cf2576101305486516001600160a01b0390911690879084908110612ccd57612ccd6141f4565b6020026020010151608001906001600160a01b031690816001600160a01b0316815250505b80838381518110612d0557612d056141f4565b602002602001018181525050858281518110612d2357612d236141f4565b6020908102919091018101515f83815261012f83526040902081518155918101519091906001820190612d5690826144a6565b5060408201516002820190612d6b90826144a6565b5060608201516003820190612d8090826144a6565b5060809190910151600490910180546001600160a01b0319166001600160a01b03909216919091179055506001016129cb565b509695505050505050565b5f82815261012d602090815260408083206001600160a01b0387168452909152812054808203612df1575f915050610818565b5f84815261012f602052604081205490819003612e12575f92505050610818565b5f612e1f83606484613527565b9094109695505050505050565b612e34611990565b6001600160a01b038416612e5a5760405162461bcd60e51b81526004016106bc90614770565b5f83815261012d602090815260408083206001600160a01b0389168452909152902054339083811015612e9f5760405162461bcd60e51b81526004016106bc906147b5565b5f85815261012d602090815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290612ede908490614261565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03165f80516020614c378339815191528888604051612f21929190614579565b60405180910390a4612f3782888888888861307d565b50505050505050565b6001600160a01b038316612f665760405162461bcd60e51b81526004016106bc90614843565b336001600160a01b0384168114612f8f5760405162461bcd60e51b81526004016106bc90614886565b5f83815261012d602090815260408083206001600160a01b038816845282528083205486845261012f9092529091205483821015612fdf5760405162461bcd60e51b81526004016106bc906148d6565b83811015612fff5760405162461bcd60e51b81526004016106bc9061491a565b5f85815261012d602090815260408083206001600160a01b03808b16808652918452828520898803905589855261012f9093528184208886039055905190918616905f80516020614c378339815191529061305d908a908a90614579565b60405180910390a4611e5083875f888860405180602001604052805f8152505b613085611990565b613097846001600160a01b0316612386565b15611e505760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906130d09089908990889088908890600401614a72565b6020604051808303815f875af192505050801561310a575060408051601f3d908101601f1916820190925261310791810190614aab565b60015b6131bf57613116614ac6565b806308c379a00361314f575061312a614ade565b806131355750613151565b8060405162461bcd60e51b81526004016106bc919061385b565b505b60405162461bcd60e51b815260206004820152603f60248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f52656365697665725570677261646561626c6520696d706c656d656e7465720060648201526084016106bc565b6001600160e01b0319811663f23a6e6160e01b14612f375760405162461bcd60e51b81526004016106bc90614b66565b6131f7611990565b613209846001600160a01b0316612386565b15611e505760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906132429089908990889088908890600401614bb9565b6020604051808303815f875af192505050801561327c575060408051601f3d908101601f1916820190925261327991810190614aab565b60015b61328857613116614ac6565b6001600160e01b0319811663bc197c8160e01b14612f375760405162461bcd60e51b81526004016106bc90614b66565b6132c181612386565b6133235760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016106bc565b805f80516020614ec68339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b61335d8361360c565b5f825111806133695750805b15611eb25761232f838361364b565b6001600160a01b0381166133dd5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016106bc565b805f80516020614c57833981519152613333565b5f54610100900460ff166134175760405162461bcd60e51b81526004016106bc9061495d565b610af633612335565b5f54610100900460ff166134465760405162461bcd60e51b81526004016106bc9061495d565b6097805460ff19169055565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106134905772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6904ee2d6d415b85acef8160201b83106134ba576904ee2d6d415b85acef8160201b830492506020015b662386f26fc1000083106134d857662386f26fc10000830492506010015b6305f5e10083106134f0576305f5e100830492506008015b612710831061350457612710830492506004015b60648310613516576064830492506002015b600a83106106ea5760010192915050565b5f80805f19858709858702925082811083820303915050805f0361355e57838281613554576135546149d4565b0492505050610818565b8084116135a55760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016106bc565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b613615816132b8565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606108188383604051806060016040528060278152602001614f266027913960605f80856001600160a01b0316856040516136879190614405565b5f60405180830381855af49150503d805f81146136bf576040519150601f19603f3d011682016040523d82523d5f602084013e6136c4565b606091505b50915091506136d5868383876136df565b9695505050505050565b6060831561374b5782515f03613744576136f885612386565b6137445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106bc565b5081613755565b613755838361375d565b949350505050565b8151156131355781518083602001fd5b6040518060a001604052805f81526020016060815260200160608152602001606081526020015f6001600160a01b031681525090565b80356001600160a01b03811681146137b9575f80fd5b919050565b5f80604083850312156137cf575f80fd5b6137d8836137a3565b946020939093013593505050565b6001600160e01b031981168114610a26575f80fd5b5f6020828403121561380b575f80fd5b8135610818816137e6565b5f60208284031215613826575f80fd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610818602083018461382d565b5f6020828403121561387d575f80fd5b610818826137a3565b634e487b7160e01b5f52604160045260245ffd5b601f8201601f191681016001600160401b03811182821017156138bf576138bf613886565b6040525050565b5f6001600160401b038211156138de576138de613886565b5060051b60200190565b5f82601f8301126138f7575f80fd5b81356020613904826138c6565b604051613911828261389a565b80915083815260208101915060208460051b870101935086841115613934575f80fd5b602086015b84811015612db35761394a816137a3565b8352918301918301613939565b5f82601f830112613966575f80fd5b81356020613973826138c6565b604051613980828261389a565b80915083815260208101915060208460051b8701019350868411156139a3575f80fd5b602086015b84811015612db357803583529183019183016139a8565b5f6001600160401b038211156139d7576139d7613886565b50601f01601f191660200190565b5f82601f8301126139f4575f80fd5b81356139ff816139bf565b604051613a0c828261389a565b828152856020848701011115613a20575f80fd5b826020860160208301375f92810160200192909252509392505050565b5f805f805f805f60e0888a031215613a53575f80fd5b87356001600160401b0380821115613a69575f80fd5b613a758b838c016138e8565b985060208a0135975060408a0135915080821115613a91575f80fd5b613a9d8b838c01613957565b965060608a0135915080821115613ab2575f80fd5b613abe8b838c016139e5565b955060808a0135915080821115613ad3575f80fd5b613adf8b838c016139e5565b945060a08a0135915080821115613af4575f80fd5b50613b018a828b016139e5565b925050613b1060c089016137a3565b905092959891949750929550565b5f805f805f60a08688031215613b32575f80fd5b613b3b866137a3565b9450613b49602087016137a3565b935060408601356001600160401b0380821115613b64575f80fd5b613b7089838a01613957565b94506060880135915080821115613b85575f80fd5b613b9189838a01613957565b93506080880135915080821115613ba6575f80fd5b50613bb3888289016139e5565b9150509295509295909350565b6001600160a01b0391909116815260200190565b5f8060408385031215613be5575f80fd5b82356001600160401b0380821115613bfb575f80fd5b613c07868387016138e8565b93506020850135915080821115613c1c575f80fd5b50613c2985828601613957565b9150509250929050565b5f815180845260208085019450602084015f5b83811015613c6257815187529582019590820190600101613c46565b509495945050505050565b602081525f6108186020830184613c33565b5f8060408385031215613c90575f80fd5b613c99836137a3565b915060208301356001600160401b03811115613cb3575f80fd5b613c29858286016139e5565b85815260a060208201525f613cd760a083018761382d565b8281036040840152613ce9818761382d565b90508281036060840152613cfd818661382d565b91505060018060a01b03831660808301529695505050505050565b5f805f60608486031215613d2a575f80fd5b613d33846137a3565b925060208401356001600160401b0380821115613d4e575f80fd5b613d5a87838801613957565b93506040860135915080821115613d6f575f80fd5b50613d7c86828701613957565b9150509250925092565b5f805f60608486031215613d98575f80fd5b613da1846137a3565b92506020840135915060408401356001600160401b03811115613dc2575f80fd5b613d7c868287016139e5565b5f8060408385031215613ddf575f80fd5b613de8836137a3565b915060208301358015158114613dfc575f80fd5b809150509250929050565b5f8060408385031215613e18575f80fd5b50508035926020909101359150565b5f82601f830112613e36575f80fd5b81356020613e43826138c6565b604051613e50828261389a565b83815260059390931b8501820192828101915086841115613e6f575f80fd5b8286015b84811015612db35780356001600160401b03811115613e90575f80fd5b613e9e8986838b01016139e5565b845250918301918301613e73565b5f805f805f805f60e0888a031215613ec2575f80fd5b87356001600160401b0380821115613ed8575f80fd5b613ee48b838c016138e8565b985060208a0135915080821115613ef9575f80fd5b613f058b838c01613957565b975060408a0135915080821115613f1a575f80fd5b613f268b838c01613957565b965060608a0135915080821115613f3b575f80fd5b613f478b838c01613e27565b955060808a0135915080821115613f5c575f80fd5b613f688b838c01613e27565b945060a08a0135915080821115613f7d575f80fd5b613f898b838c01613e27565b935060c08a0135915080821115613f9e575f80fd5b50613fab8a828b016138e8565b91505092959891949750929550565b5f8060408385031215613fcb575f80fd5b82356001600160401b03811115613fe0575f80fd5b613fec858286016139e5565b95602094909401359450505050565b5f806040838503121561400c575f80fd5b614015836137a3565b9150614023602084016137a3565b90509250929050565b5f805f805f60a08688031215614040575f80fd5b614049866137a3565b9450614057602087016137a3565b9350604086013592506060860135915060808601356001600160401b0381111561407f575f80fd5b613bb3888289016139e5565b5f805f6060848603121561409d575f80fd5b6140a6846137a3565b95602085013595506040909401359392505050565b5f805f604084860312156140cd575f80fd5b8335925060208401356001600160401b03808211156140ea575f80fd5b818601915086601f8301126140fd575f80fd5b81358181111561410b575f80fd5b8760208260051b850101111561411f575f80fd5b6020830194508093505050509250925092565b602080825282518282018190525f9190848201906040850190845b818110156141695783518352928401929184019160010161414d565b50909695505050505050565b5f60208284031215614185575f80fd5b81516001600160401b0381111561419a575f80fd5b8201601f810184136141aa575f80fd5b80516141b5816139bf565b6040516141c2828261389a565b8281528660208486010111156141d6575f80fd5b8260208501602083015e5f9281016020019290925250949350505050565b634e487b7160e01b5f52603260045260245ffd5b60208082526025908201527f4561636820616d6f756e74206d7573742062652067726561746572207468616e604082015264207a65726f60d81b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ea576106ea61424d565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252602c908201525f80516020614c7783398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201525f80516020614c7783398151915260408201526b6163746976652070726f787960a01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600181811c9082168061439657607f821691505b60208210810361286957634e487b7160e01b5f52602260045260245ffd5b5f81518060208401855e5f93019283525090919050565b5f6143fa6143f46143ee6143e86143e2868c6143b4565b8a6143b4565b886143b4565b866143b4565b846143b4565b979650505050505050565b5f61081882846143b4565b80516020808301519190811015612869575f1960209190910360031b1b16919050565b6020808252601590820152744f6e6c79203e203730252063616e2075706461746560581b604082015260600190565b601f821115611eb257805f5260205f20601f840160051c810160208510156144875750805b601f840160051c820191505b8181101561095b575f8155600101614493565b81516001600160401b038111156144bf576144bf613886565b6144d3816144cd8454614382565b84614462565b602080601f831160018114614506575f84156144ef5750858301515b5f19600386901b1c1916600185901b178555611e50565b5f85815260208120601f198616915b8281101561453457888601518255948401946001909101908401614515565b508582101561455157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201525f613755604083018461382d565b918252602082015260400190565b7a02ab735b737bbb7103a3930b4ba1035b2bc9030ba1034b73232bc1602d1b81525f610818601b8301846143b4565b6020808252601690820152751119599a5b9a5d1a5bdb881a5cc81c995c5d5a5c995960521b604082015260600190565b6020808252601b908201527a15985b1a59081cd95cdcda5bdb9259081a5cc81c995c5d5a5c9959602a1b604082015260600190565b6020808252601390820152724d696e696d756d20737570706c79206973203160681b604082015260600190565b6020808252602b908201527f4e756d626572206f6620726563697069656e747320616e6420616d6f756e747360408201526a040daeae6e840dac2e8c6d60ab1b606082015260800190565b60208082526034908201527f53657373696f6e20494420616c72656164792065786973742c20706c6561736560408201527320757365206120646966666572656e74206f6e6560601b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081525f6148116040830185613c33565b82810360208401526148238185613c33565b95945050505050565b5f6020828403121561483c575f80fd5b5051919050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526030908201527f455243313135353a206f70657261746f722063616e206f6e6c79206275726e2060408201526f6f776e20746f6b656e20737570706c7960801b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526023908201527f455243313135353a206275726e20616d6f756e74206578636565647320737570604082015262706c7960e81b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b80820281158282048414176106ea576106ea61424d565b5f816149cd576149cd61424d565b505f190190565b634e487b7160e01b5f52601260045260245ffd5b5f60208083525f84546149fa81614382565b806020870152604060018084165f8114614a1b5760018114614a3757614a64565b60ff19851660408a0152604084151560051b8a01019550614a64565b895f5260205f205f5b85811015614a5b5781548b8201860152908301908801614a40565b8a016040019650505b509398975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190525f906143fa9083018461382d565b5f60208284031215614abb575f80fd5b8151610818816137e6565b5f60033d1115610db65760045f803e505f5160e01c90565b5f60443d1015614aeb5790565b6040516003193d81016004833e81513d6001600160401b038083116024840183101715614b1a57505050505090565b8285019150815181811115614b325750505050505090565b843d8701016020828501011115614b4c5750505050505090565b614b5b6020828601018761389a565b509095945050505050565b60208082526033908201527f455243313135353a204552433131353552656365697665725570677261646561604082015272626c652072656a656374656420746f6b656e7360681b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190525f90614be490830186613c33565b8281036060840152614bf68186613c33565b90508281036080840152614c0a818561382d565b9897505050505050505056fe4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fbc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610346756e6374696f6e206d7573742062652063616c6c6564207468726f75676820646174613a6170706c69636174696f6e2f6a736f6e3b636861727365743d7574662d383b6261736536342c65776f6749434a30636d467064484d694f6942374369416749434169646d46736157526864473979496a6f6765776f6749434167494341695a476c7a6347786865553568625755694f694169566d467361575268644739794969774b4943416749434167496d5268644746556558426c496a6f6765776f67494341674943416749434a306558426c496a6f67496e4e30636d6c755a794973436941674943416749434167496d3170626b786c626d6430614349364944454b49434167494341676653774b4943416749434167496e5a6862476c6b5958526c543235545957786c496a6f67496e4a6c63585670636d56466353494b494341674948307343694167494341696233426c636d46306157356e515764795a5756745a573530496a6f6765776f6749434167494341695a476c7a6347786865553568625755694f6941695433426c636d46306157356e4945466e636d566c6257567564434973436941674943416749434a6b5958526856486c775a5349364948734b49434167494341674943416964486c775a53493649434a7a64484a70626d63694c416f67494341674943416749434a746157354d5a57356e644767694f694178436941674943416749483073436941674943416749434a32595778705a4746305a553975553246735a53493649434a795a58463161584a6c5258456943694167494342394369416766517039360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf79c5b8f4e5d24b1dd265bfd81260bf56ebce81cabf0686c91876d7f666afb727f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65647f11e8a47c8f6f2761361211fdf25db4167076f4c74d7c390a15f4211bc8c2148386f3b08e49490d0c5a9d2c401c091f13b01a17d75ce4a2f0f8f923b410ff7da26469706673582212202f9df4bdf9c0045ae5cee986cdf23687f5dff5b0035456544c781b8405e9256264736f6c63430008190033
Deployed Bytecode Sourcemap
100059:26204:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109237:230;;;;;;;;;;-1:-1:-1;109237:230:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;109237:230:0;;;;;;;;101852:435;;;;;;;;;;-1:-1:-1;101852:435:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;101852:435:0;1019:187:1;105129:272:0;;;;;;;;;;-1:-1:-1;105129:272:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;102462:133::-;;;;;;;;;;-1:-1:-1;102462:133:0;;;;;:::i;:::-;;:::i;:::-;;105526:914;;;;;;;;;;-1:-1:-1;105526:914:0;;;;;:::i;:::-;;:::i;111216:452::-;;;;;;;;;;-1:-1:-1;111216:452:0;;;;;:::i;:::-;;:::i;94912:198::-;;;;;;;;;;-1:-1:-1;94912:198:0;;;;;:::i;:::-;;:::i;100653:97::-;;;;;;;;;;;;;:::i;97909:115::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;102378:76::-;;;;;;;;;;;;;:::i;98098:220::-;;;;;;;;;;-1:-1:-1;98098:220:0;;;;;:::i;:::-;;:::i;102712:137::-;;;;;;;;;;-1:-1:-1;102712:137:0;;;;;:::i;:::-;;:::i;109633:518::-;;;;;;;;;;-1:-1:-1;109633:518:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;95441:223::-;;;;;;:::i;:::-;;:::i;94518:133::-;;;;;;;;;;;;;:::i;97308:102::-;;;;;;;;;;;;;:::i;23719:86::-;;;;;;;;;;-1:-1:-1;23790:7:0;;;;23719:86;;100530:115;;;;;;;;;;;;;:::i;101292:45::-;;;;;;;;;;-1:-1:-1;101292:45:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;107867:233::-;;;;;;;;;;-1:-1:-1;107867:233:0;;;;;:::i;:::-;;:::i;20521:103::-;;;;;;;;;;;;;:::i;100350:172::-;;;;;;;;;;;;;:::i;102295:75::-;;;;;;;;;;;;;:::i;19880:87::-;;;;;;;;;;;;;:::i;102603:101::-;;;;;;;;;;-1:-1:-1;102679:17:0;;-1:-1:-1;;;;;102679:17:0;102603:101;;108181:905;;;;;;;;;;-1:-1:-1;108181:905:0;;;;;:::i;:::-;;:::i;110224:169::-;;;;;;;;;;-1:-1:-1;110224:169:0;;;;;:::i;:::-;;:::i;103034:406::-;;;;;;;;;;-1:-1:-1;103034:406:0;;;;;:::i;:::-;;:::i;106520:1130::-;;;;;;;;;;-1:-1:-1;106520:1130:0;;;;;:::i;:::-;;:::i;111720:467::-;;;;;;;;;;-1:-1:-1;111720:467:0;;;;;:::i;:::-;;:::i;112239:324::-;;;;;;;;;;-1:-1:-1;112239:324:0;;;;;:::i;:::-;;:::i;104365:656::-;;;;;;;;;;;;;:::i;112615:402::-;;;;;;;;;;-1:-1:-1;112615:402:0;;;;;:::i;:::-;;:::i;110465:182::-;;;;;;;;;;-1:-1:-1;110465:182:0;;;;;:::i;:::-;;:::i;110719:420::-;;;;;;;;;;-1:-1:-1;110719:420:0;;;;;:::i;:::-;;:::i;20779:201::-;;;;;;;;;;-1:-1:-1;20779:201:0;;;;;:::i;:::-;;:::i;102857:103::-;;;;;;;;;;-1:-1:-1;102934:18:0;;-1:-1:-1;;;;;102934:18:0;102857:103;;107658:201;;;;;;;;;;-1:-1:-1;107658:201:0;;;;;:::i;:::-;;:::i;103515:766::-;;;;;;;;;;-1:-1:-1;103515:766:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;109237:230::-;109323:7;-1:-1:-1;;;;;109351:21:0;;109343:76;;;;-1:-1:-1;;;109343:76:0;;17555:2:1;109343:76:0;;;17537:21:1;17594:2;17574:18;;;17567:30;17633:34;17613:18;;;17606:62;-1:-1:-1;;;17684:18:1;;;17677:40;17734:19;;109343:76:0;;;;;;;;;-1:-1:-1;109437:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;109437:22:0;;;;;;;;;;109237:230;;;;;:::o;101852:435::-;101976:4;-1:-1:-1;;;;;;102013:52:0;;-1:-1:-1;;;102013:52:0;;:132;;-1:-1:-1;;;;;;;102082:63:0;;-1:-1:-1;;;102082:63:0;102013:132;:213;;;-1:-1:-1;;;;;;;;;;102201:25:0;;;102013:213;:266;;;-1:-1:-1;;;;;;;;;;35208:51:0;;;102243:36;35099:168;105129:272;105210:17;105230:13;;;:9;:13;;;;;:23;;;105184:13;;105210:17;-1:-1:-1;;;;;105230:23:0;:37;:109;;105316:13;;;;:9;:13;;;;;:23;;;-1:-1:-1;;;;;105316:23:0;105230:109;;;105283:17;;-1:-1:-1;;;;;105283:17:0;105230:109;105357:36;;-1:-1:-1;;;105357:36:0;;;;;597:25:1;;;105210:129:0;;-1:-1:-1;;;;;;105357:32:0;;;;;570:18:1;;105357:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;105357:36:0;;;;;;;;;;;;:::i;:::-;105350:43;105129:272;-1:-1:-1;;;105129:272:0:o;102462:133::-;19766:13;:11;:13::i;:::-;102548:17:::1;:39:::0;;-1:-1:-1;;;;;;102548:39:0::1;-1:-1:-1::0;;;;;102548:39:0;;;::::1;::::0;;;::::1;::::0;;102462:133::o;105526:914::-;105822:7;23324:19;:17;:19::i;:::-;105842:14:::1;105876:9:::0;105871:205:::1;105895:7;:14;105891:1;:18;105871:205;;;105931:14;105948:7;105956:1;105948:10;;;;;;;;:::i;:::-;;;;;;;105931:27;;105990:1;105981:6;:10;105973:60;;;;-1:-1:-1::0;;;105973:60:0::1;;;;;;;:::i;:::-;106048:16;106058:6:::0;106048:16;::::1;:::i;:::-;::::0;-1:-1:-1;;105911:3:0::1;;105871:205;;;;106086:24;;:::i;:::-;106121::::0;;;106156:27:::1;::::0;;::::1;:48:::0;;;106215:19:::1;::::0;;::::1;:32:::0;;;106258:22:::1;::::0;::::1;:38:::0;;;-1:-1:-1;;;;;106307:30:0;::::1;:18;::::0;::::1;:30:::0;106361:51;;;;::::1;::::0;;106121:15:::1;106361:51:::0;;;106121:15;106361:51:::1;::::0;106367:10;;106379:9;;106390:7;;106121:8;;106361:5:::1;:51::i;:::-;106348:64:::0;105526:914;-1:-1:-1;;;;;;;;;;;105526:914:0:o;111216:452::-;23324:19;:17;:19::i;:::-;-1:-1:-1;;;;;111463:20:0;::::1;17699:10:::0;111463:20:::1;::::0;:60:::1;;-1:-1:-1::0;111487:36:0::1;111504:4:::0;17699:10;110465:182;:::i;111487:36::-:1;111441:156;;;;-1:-1:-1::0;;;111441:156:0::1;;;;;;;:::i;:::-;111608:52;111631:4;111637:2;111641:3;111646:7;111655:4;111608:22;:52::i;:::-;111216:452:::0;;;;;:::o;94912:198::-;-1:-1:-1;;;;;93228:6:0;93211:23;93219:4;93211:23;93203:80;;;;-1:-1:-1;;;93203:80:0;;;;;;;:::i;:::-;93326:6;-1:-1:-1;;;;;93302:30:0;:20;:18;:20::i;:::-;-1:-1:-1;;;;;93302:30:0;;93294:87;;;;-1:-1:-1;;;93294:87:0;;;;;;;:::i;:::-;94994:36:::1;95012:17;94994;:36::i;:::-;95082:12;::::0;;95092:1:::1;95082:12:::0;;;::::1;::::0;::::1;::::0;;;95041:61:::1;::::0;95063:17;;95082:12;95041:21:::1;:61::i;:::-;94912:198:::0;:::o;100653:97::-;14807:13;;100698:1;;14807:13;;;;;14806:14;:40;;;;-1:-1:-1;14824:12:0;;:22;;;;:12;;:22;14806:40;14798:99;;;;-1:-1:-1;;;14798:99:0;;;;;;;:::i;:::-;14908:12;:22;;-1:-1:-1;;14941:20:0;14908:22;;;14941:20;14908:22;14941:20;;;100717:25:::1;::::0;::::1;::::0;14908:12;100717:25:::1;15000:5:::0;14984:21;;-1:-1:-1;;14984:21:0;;;15021:20;;21116:4:1;21104:17;;21086:36;;-1:-1:-1;;;;;;;;;;;15021:20:0;21074:2:1;21059:18;15021:20:0;;;;;;;;100653:97;:::o;97909:115::-;97952:7;97979:37;:35;:37::i;:::-;97972:44;;97909:115;:::o;102378:76::-;19766:13;:11;:13::i;:::-;23583:16:::1;:14;:16::i;:::-;102436:10:::2;:8;:10::i;:::-;102378:76::o:0;98098:220::-;97545:18;:16;:18::i;:::-;98256:54:::1;98295:14;98256:38;:54::i;102712:137::-:0;19766:13;:11;:13::i;:::-;102800:18:::1;:41:::0;;-1:-1:-1;;;;;;102800:41:0::1;-1:-1:-1::0;;;;;102800:41:0;;;::::1;::::0;;;::::1;::::0;;102712:137::o;109633:518::-;109789:16;109850:3;:10;109831:8;:15;:29;109823:83;;;;-1:-1:-1;;;109823:83:0;;21335:2:1;109823:83:0;;;21317:21:1;21374:2;21354:18;;;21347:30;21413:34;21393:18;;;21386:62;-1:-1:-1;;;21464:18:1;;;21457:39;21513:19;;109823:83:0;21133:405:1;109823:83:0;109917:30;109964:8;:15;-1:-1:-1;;;;;109950:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;109950:30:0;;109917:63;;109996:9;109991:122;110015:8;:15;110011:1;:19;109991:122;;;110071:30;110081:8;110090:1;110081:11;;;;;;;;:::i;:::-;;;;;;;110094:3;110098:1;110094:6;;;;;;;;:::i;:::-;;;;;;;110071:9;:30::i;:::-;110052:13;110066:1;110052:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;110032:3;;109991:122;;;-1:-1:-1;110130:13:0;109633:518;-1:-1:-1;;;109633:518:0:o;95441:223::-;-1:-1:-1;;;;;93228:6:0;93211:23;93219:4;93211:23;93203:80;;;;-1:-1:-1;;;93203:80:0;;;;;;;:::i;:::-;93326:6;-1:-1:-1;;;;;93302:30:0;:20;:18;:20::i;:::-;-1:-1:-1;;;;;93302:30:0;;93294:87;;;;-1:-1:-1;;;93294:87:0;;;;;;;:::i;:::-;95557:36:::1;95575:17;95557;:36::i;:::-;95604:52;95626:17;95645:4;95651;95604:21;:52::i;:::-;95441:223:::0;;:::o;94518:133::-;94596:7;93664:4;-1:-1:-1;;;;;93673:6:0;93656:23;;93648:92;;;;-1:-1:-1;;;93648:92:0;;21745:2:1;93648:92:0;;;21727:21:1;21784:2;21764:18;;;21757:30;21823:34;21803:18;;;21796:62;-1:-1:-1;;;21874:18:1;;;21867:54;21938:19;;93648:92:0;21543:420:1;93648:92:0;-1:-1:-1;;;;;;;;;;;;93751:1:0::1;94518:133:::0;:::o;97308:102::-;97355:7;97382:20;:18;:20::i;100530:115::-;14807:13;;100575:1;;14807:13;;;;;14806:14;:40;;;;-1:-1:-1;14824:12:0;;:22;;;;:12;;:22;14806:40;14798:99;;;;-1:-1:-1;;;14798:99:0;;;;;;;:::i;:::-;14908:12;:22;;-1:-1:-1;;14941:20:0;14908:22;;;14941:20;;;14908:22;14941:20;-1:-1:-1;;14984:21:0;;;;15021:20;;21086:36:1;;;-1:-1:-1;;;;;;;;;;;15021:20:0;21074:2:1;21059:18;15021:20:0;20944:184:1;101292:45:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;101292:45:0;;;;;;;-1:-1:-1;;;;;;;101292:45:0;;:::o;107867:233::-;108012:12;23324:19;:17;:19::i;:::-;108037:30:::1;108048:4;108054:3;108059:7;108037:10;:30::i;:::-;-1:-1:-1::0;108088:4:0::1;::::0;107867:233;-1:-1:-1;;;107867:233:0:o;20521:103::-;19766:13;:11;:13::i;:::-;20586:30:::1;20613:1;20586:18;:30::i;100350:172::-:0;13169:19;13192:13;;;;;;13191:14;;13239:34;;;;-1:-1:-1;13257:12:0;;13272:1;13257:12;;;;:16;13239:34;13238:108;;;;13280:44;13318:4;13280:29;:44::i;:::-;13279:45;:66;;;;-1:-1:-1;13328:12:0;;;;;:17;13279:66;13216:204;;;;-1:-1:-1;;;13216:204:0;;;;;;;:::i;:::-;13431:12;:16;;-1:-1:-1;;13431:16:0;13446:1;13431:16;;;13458:67;;;;13493:13;:20;;-1:-1:-1;;13493:20:0;;;;;13458:67;100402:15:::1;:13;:15::i;:::-;100428:31;:29;:31::i;:::-;100470:16;:14;:16::i;:::-;100497:17;:15;:17::i;:::-;13551:14:::0;13547:102;;;13598:5;13582:21;;-1:-1:-1;;13582:21:0;;;13623:14;;-1:-1:-1;21086:36:1;;-1:-1:-1;;;;;;;;;;;13623:14:0;21074:2:1;21059:18;13623:14:0;20944:184:1;102295:75:0;19766:13;:11;:13::i;:::-;23324:19:::1;:17;:19::i;:::-;102354:8:::2;:6;:8::i;19880:87::-:0;19953:6;;-1:-1:-1;;;;;19953:6:0;;19880:87::o;108181:905::-;108306:7;23324:19;:17;:19::i;:::-;108548:28:::1;108579:59;108623:8;-1:-1:-1::0;;;;;108610:23:0::1;108635:2;108579:30;:59::i;:::-;108548:90;;108649:22;108702:42;108730:13;108702:27;:42::i;:::-;108759:45;108798:4;108759:30;:45::i;:::-;108819:14;108848:38;108876:9;108848:27;:38::i;:::-;108901:18;108674:256;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;108649:281;;108941:13;108992:8;108975:26;;;;;;;;:::i;:::-;;::::0;;;;::::1;-1:-1:-1::0;;108975:26:0;;;;;;108965:37;;108975:26:::1;108965:37:::0;;::::1;::::0;-1:-1:-1;;;;;109062:16:0::1;::::0;108181:905;-1:-1:-1;;;;;;;108181:905:0:o;110224:169::-;23324:19;:17;:19::i;:::-;110333:52:::1;17699:10:::0;110366:8:::1;110376;110333:18;:52::i;103034:406::-:0;103115:7;-1:-1:-1;;;;;;;;;;;103139:8:0;:34;103135:116;;103211:26;103229:7;103211:17;:26::i;:::-;103197:42;;;:::i;:::-;103190:49;;;;103135:116;-1:-1:-1;;;;;;;;;;;103265:8:0;:43;103261:134;;103346:35;103373:7;103346:26;:35::i;103261:134::-;103405:27;;-1:-1:-1;;;103405:27:0;;23967:2:1;103405:27:0;;;23949:21:1;24006:2;23986:18;;;23979:30;-1:-1:-1;;;24025:18:1;;;24018:47;24082:18;;103405:27:0;23765:341:1;106520:1130:0;106850:20;23324:19;:17;:19::i;:::-;106883:14:::1;106917:9:::0;106912:205:::1;106936:7;:14;106932:1;:18;106912:205;;;106972:14;106989:7;106997:1;106989:10;;;;;;;;:::i;:::-;;;;;;;106972:27;;107031:1;107022:6;:10;107014:60;;;;-1:-1:-1::0;;;107014:60:0::1;;;;;;;:::i;:::-;107089:16;107099:6:::0;107089:16;::::1;:::i;:::-;::::0;-1:-1:-1;;106952:3:0::1;;106912:205;;;-1:-1:-1::0;107142:17:0;;107127:12:::1;107142:17:::0;-1:-1:-1;;;;;107201:20:0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;107170:51;;107237:9;107232:335;107256:4;107252:1;:8;107232:335;;;107305:6;107282:10;107293:1;107282:13;;;;;;;;:::i;:::-;;;;;;;:20;;:29;;;::::0;::::1;107361:19;107381:1;107361:22;;;;;;;;:::i;:::-;;;;;;;107326:10;107337:1;107326:13;;;;;;;;:::i;:::-;;;;;;;:32;;:57;;;;107425:11;107437:1;107425:14;;;;;;;;:::i;:::-;;;;;;;107398:10;107409:1;107398:13;;;;;;;;:::i;:::-;;;;;;;:24;;:41;;;;107484:14;107499:1;107484:17;;;;;;;;:::i;:::-;;;;;;;107454:10;107465:1;107454:13;;;;;;;;:::i;:::-;;;;;;;:27;;:47;;;;107542:10;107553:1;107542:13;;;;;;;;:::i;:::-;;;;;;;107516:10;107527:1;107516:13;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;107516:39:0;;::::1;:23;::::0;;::::1;:39:::0;107262:3:::1;;107232:335;;;;107583:59;107594:10;107606;107618:7;107627:10;107583:59;;;;;;;;;;;::::0;:10:::1;:59::i;111720:467::-:0;111830:4;23324:19;:17;:19::i;:::-;111855:35:::1;17699:10:::0;111869:12:::1;111883:2;111887;111855:13;:35::i;:::-;111847:69;;;;-1:-1:-1::0;;;111847:69:0::1;;;;;;;:::i;:::-;111927:13;::::0;;;:9:::1;:13;::::0;;;;:32:::1;;:53;111962:18:::0;111927:32;:53:::1;:::i;:::-;;111996:48;112021:2;112025:18;111996:48;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;112106:2:0::1;112124:30;112151:2;112124:26;:30::i;:::-;112110:46;;;:::i;:::-;112060:97;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;112175:4:0::1;111720:467:::0;;;;:::o;112239:324::-;112339:4;23324:19;:17;:19::i;:::-;112364:35:::1;17699:10:::0;112392:2:::1;112396;112364:13;:35::i;:::-;112356:69;;;::::0;-1:-1:-1;;;112356:69:0;;27393:2:1;112356:69:0::1;::::0;::::1;27375:21:1::0;27432:2;27412:18;;;27405:30;-1:-1:-1;;;27451:18:1;;;27444:51;27512:18;;112356:69:0::1;27191:345:1::0;112356:69:0::1;112436:13;::::0;;;:9:::1;:13;::::0;;;;:27:::1;;:43;112466:13:::0;112436:27;:43:::1;:::i;:::-;;112495:38;112515:2;112519:13;112495:38;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;112551:4:0::1;112239:324:::0;;;;:::o;104365:656::-;104419:13;104445:568;;;;;;;;;;;;;;;;;;;104365:656;:::o;112615:402::-;112701:4;23324:19;:17;:19::i;:::-;112726:35:::1;17699:10:::0;112740:12:::1;17619:98:::0;112726:35:::1;112718:69;;;;-1:-1:-1::0;;;112718:69:0::1;;;;;;;:::i;:::-;112798:13;::::0;;;:9:::1;:13;::::0;;;;;;:23:::1;;:35:::0;;-1:-1:-1;;;;;112798:35:0;::::1;-1:-1:-1::0;;;;;;112798:35:0;;::::1;;::::0;;112849:43;::::1;::::0;::::1;::::0;112808:2;;112824:9;;27781:25:1;;;27842:2;27837;27822:18;;27815:30;;;27881:1;27861:18;;;27854:29;-1:-1:-1;;;27914:3:1;27899:19;;27892:40;-1:-1:-1;;;;;28004:32:1;27999:2;27984:18;;27977:60;27964:3;27949:19;;27541:502;112849:43:0::1;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;112945:2:0::1;112963:21;112981:2;112963:17;:21::i;110465:182::-:0;110578:4;23324:19;:17;:19::i;:::-;-1:-1:-1;;;;;;110602:27:0;;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;:37;;;::::1;::::0;;;;;;;;::::1;;::::0;110465:182::o;110719:420::-;23324:19;:17;:19::i;:::-;-1:-1:-1;;;;;110941:20:0;::::1;17699:10:::0;110941:20:::1;::::0;:60:::1;;-1:-1:-1::0;110965:36:0::1;110982:4:::0;17699:10;110465:182;:::i;110965:36::-:1;110919:156;;;;-1:-1:-1::0;;;110919:156:0::1;;;;;;;:::i;:::-;111086:45;111104:4;111110:2;111114;111118:6;111126:4;111086:17;:45::i;20779:201::-:0;19766:13;:11;:13::i;:::-;-1:-1:-1;;;;;20868:22:0;::::1;20860:73;;;::::0;-1:-1:-1;;;20860:73:0;;28250:2:1;20860:73:0::1;::::0;::::1;28232:21:1::0;28289:2;28269:18;;;28262:30;28328:34;28308:18;;;28301:62;-1:-1:-1;;;28379:18:1;;;28372:36;28425:19;;20860:73:0::1;28048:402:1::0;20860:73:0::1;20944:28;20963:8;20944:18;:28::i;107658:201::-:0;107778:12;23324:19;:17;:19::i;:::-;107803:23:::1;107809:4;107815:2;107819:6;107803:5;:23::i;103515:766::-:0;103609:16;103638:23;103678:9;-1:-1:-1;;;;;103664:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;103664:31:0;;103638:57;;103711:9;103706:544;103727:20;;;103706:544;;;103768:16;103787:9;;103797:1;103787:12;;;;;;;:::i;:::-;;;;;;;103768:31;;-1:-1:-1;;;;;;;;;;;103816:8:0;:34;103812:150;;103895:26;103913:7;103895:17;:26::i;:::-;103881:42;;;:::i;:::-;103869:6;103876:1;103869:9;;;;;;;;:::i;:::-;;;;;;:54;;;;;103940:8;;;103812:150;-1:-1:-1;;;;;;;;;;;103978:8:0;:43;103974:168;;104066:35;104093:7;104066:26;:35::i;103974:168::-;104206:30;104234:1;104206:27;:30::i;:::-;104161:76;;;;;;;;:::i;:::-;;;;-1:-1:-1;;104161:76:0;;;;;;;;;;-1:-1:-1;;;104154:84:0;;;;;;;:::i;103706:544::-;103750:3;;103706:544;;;-1:-1:-1;104267:6:0;103515:766;-1:-1:-1;;;;103515:766:0:o;20045:132::-;17699:10;20109:7;:5;:7::i;:::-;-1:-1:-1;;;;;20109:23:0;;20101:68;;;;-1:-1:-1;;;20101:68:0;;29005:2:1;20101:68:0;;;28987:21:1;;;29024:18;;;29017:30;29083:34;29063:18;;;29056:62;29135:18;;20101:68:0;28803:356:1;23878:108:0;23790:7;;;;23948:9;23940:38;;;;-1:-1:-1;;;23940:38:0;;29366:2:1;23940:38:0;;;29348:21:1;29405:2;29385:18;;;29378:30;-1:-1:-1;;;29424:18:1;;;29417:46;29480:18;;23940:38:0;29164:340:1;117098:1695:0;117320:7;23324:19;:17;:19::i;:::-;117384:1:::1;117354:8;:19;;;117348:33;:37;117340:72;;;;-1:-1:-1::0;;;117340:72:0::1;;;;;;;:::i;:::-;117443:1;117431:9;:13;117423:53;;;;-1:-1:-1::0;;;117423:53:0::1;;;;;;;:::i;:::-;117495:15:::0;;117487:51:::1;;;;-1:-1:-1::0;;;117487:51:0::1;;;;;;;:::i;:::-;117578:7;:14;117557:10;:17;:35;117549:91;;;;-1:-1:-1::0;;;117549:91:0::1;;;;;;;:::i;:::-;117740:18;::::0;::::1;::::0;-1:-1:-1;;;;;117740:32:0::1;117736:149;;117856:17;::::0;-1:-1:-1;;;;;117856:17:0::1;117835:18;::::0;::::1;:38:::0;117736:149:::1;117943:1;117905:8;:27;;;117899:41;:45;117895:173;;;118009:8;:18;;;-1:-1:-1::0;;;;;117991:63:0::1;;:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;117991:65:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;117961:27;::::0;::::1;:95:::0;117895:173:::1;118078:10;118091:64;17699:10:::0;118116:9:::1;118127:8;:27;;;118091:10;:64::i;:::-;118174:13;::::0;;;:9:::1;:13;::::0;;;;:20;118078:77;;-1:-1:-1;118174:25:0;118166:90:::1;;;;-1:-1:-1::0;;;118166:90:0::1;;;;;;;:::i;:::-;118272:9;118267:431;118291:10;:17;118287:1;:21;118267:431;;;118330:10;118343;118354:1;118343:13;;;;;;;;:::i;:::-;;;;;;;118330:26;;118393:1;-1:-1:-1::0;;;;;118379:16:0::1;:2;-1:-1:-1::0;;;;;118379:16:0::1;::::0;118371:62:::1;;;;-1:-1:-1::0;;;118371:62:0::1;;;;;;;:::i;:::-;118448:14;118465:7;118473:1;118465:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;118490:13:::1;::::0;;;:9:::1;:13:::0;;;;;;-1:-1:-1;;;;;118490:17:0;::::1;::::0;;;;;;;;:27;;118465:10;;-1:-1:-1;118465:10:0;;118490:17;;:27:::1;::::0;118465:10;;118490:27:::1;:::i;:::-;::::0;;;-1:-1:-1;118532:78:0::1;::::0;-1:-1:-1;17699:10:0;118585:1:::1;118589:2;118593;118597:6;118605:4;118532:30;:78::i;:::-;-1:-1:-1::0;;;;;118630:56:0;::::1;118667:1;17699:10:::0;-1:-1:-1;;;;;118630:56:0::1;-1:-1:-1::0;;;;;;;;;;;118675:2:0::1;118679:6;118630:56;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;118310:3:0::1;;118267:431;;;-1:-1:-1::0;118741:13:0::1;::::0;;;:9:::1;:13;::::0;;;;;;;:24;;;;;;::::1;::::0;118757:8;;118741:13;:24:::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;118741:24:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;118741:24:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;118741:24:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;118741:24:0::1;-1:-1:-1::0;;;;;118741:24:0;;::::1;::::0;;;::::1;::::0;;118783:2;117098:1695;-1:-1:-1;;;;;;117098:1695:0:o;115668:1005::-;23324:19;:17;:19::i;:::-;115909:7:::1;:14;115895:3;:10;:28;115887:81;;;;-1:-1:-1::0;;;115887:81:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;115987:16:0;::::1;115979:66;;;;-1:-1:-1::0;;;115979:66:0::1;;;;;;;:::i;:::-;17699:10:::0;116056:16:::1;116098:419;116122:3;:10;116118:1;:14;116098:419;;;116154:10;116167:3;116171:1;116167:6;;;;;;;;:::i;:::-;;;;;;;116154:19;;116188:14;116205:7;116213:1;116205:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;116230:19:::1;116252:13:::0;;;:9:::1;:13:::0;;;;;;-1:-1:-1;;;;;116252:19:0;::::1;::::0;;;;;;;;;;116205:10;;-1:-1:-1;116294:21:0;;::::1;;116286:76;;;;-1:-1:-1::0;;;116286:76:0::1;;;;;;;:::i;:::-;116406:13;::::0;;;:9:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;116406:19:0;;::::1;::::0;;;;;;;116428:20;;::::1;116406:42:::0;;116478:17;;::::1;::::0;;;;:27;;116428:20;;116406:13;116478:27:::1;::::0;116428:20;;116478:27:::1;:::i;:::-;::::0;;;-1:-1:-1;;116134:3:0::1;::::0;;::::1;::::0;-1:-1:-1;116098:419:0::1;::::0;-1:-1:-1;;116098:419:0::1;;;116562:2;-1:-1:-1::0;;;;;116532:47:0::1;116556:4;-1:-1:-1::0;;;;;116532:47:0::1;116546:8;-1:-1:-1::0;;;;;116532:47:0::1;-1:-1:-1::0;;;;;;;;;;;116566:3:0::1;116571:7;116532:47;;;;;;;:::i;:::-;;;;;;;;116590:75;116626:8;116636:4;116642:2;116646:3;116651:7;116660:4;116590:35;:75::i;:::-;115876:797;115668:1005:::0;;;;;:::o;85784:153::-;85837:7;-1:-1:-1;;;;;;;;;;;85864:59:0;:65;-1:-1:-1;;;;;85864:65:0;;85784:153;-1:-1:-1;85784:153:0:o;97204:96::-;97274:18;:16;:18::i;87186:958::-;85128:66;87606:59;;;87602:535;;;87682:37;87701:17;87682:18;:37::i;:::-;87186:958;;;:::o;87602:535::-;87785:17;-1:-1:-1;;;;;87756:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;87756:63:0;;;;;;;;-1:-1:-1;;87756:63:0;;;;;;;;;;;;:::i;:::-;;;87752:306;;87986:56;;-1:-1:-1;;;87986:56:0;;34139:2:1;87986:56:0;;;34121:21:1;34178:2;34158:18;;;34151:30;34217:34;34197:18;;;34190:62;-1:-1:-1;;;34268:18:1;;;34261:44;34322:19;;87986:56:0;33937:410:1;87752:306:0;-1:-1:-1;;;;;;;;;;;87870:28:0;;87862:82;;;;-1:-1:-1;;;87862:82:0;;34554:2:1;87862:82:0;;;34536:21:1;34593:2;34573:18;;;34566:30;34632:34;34612:18;;;34605:62;-1:-1:-1;;;34683:18:1;;;34676:39;34732:19;;87862:82:0;34352:405:1;87862:82:0;87820:140;88072:53;88090:17;88109:4;88115:9;88072:17;:53::i;88524:135::-;88568:7;-1:-1:-1;;;;;;;;;;;88595:50:0;81652:195;24063:108;23790:7;;;;24122:41;;;;-1:-1:-1;;;24122:41:0;;34964:2:1;24122:41:0;;;34946:21:1;35003:2;34983:18;;;34976:30;-1:-1:-1;;;35022:18:1;;;35015:50;35082:18;;24122:41:0;34762:344:1;24574:120:0;23583:16;:14;:16::i;:::-;24633:7:::1;:15:::0;;-1:-1:-1;;24633:15:0::1;::::0;;24664:22:::1;17699:10:::0;24673:12:::1;24664:22;;;;;;:::i;:::-;;;;;;;;24574:120::o:0;97667:162::-;17699:10;97736:11;:9;:11::i;:::-;-1:-1:-1;;;;;97736:27:0;;97728:93;;;;-1:-1:-1;;;97728:93:0;;35313:2:1;97728:93:0;;;35295:21:1;35352:2;35332:18;;;35325:30;35391:34;35371:18;;;35364:62;-1:-1:-1;;;35442:18:1;;;35435:51;35503:19;;97728:93:0;35111:417:1;89079:138:0;89144:35;89157:11;:9;:11::i;:::-;89144:35;;;-1:-1:-1;;;;;35763:15:1;;;35745:34;;35815:15;;;35810:2;35795:18;;35788:43;35680:18;89144:35:0;;;;;;;89190:19;89200:8;89190:9;:19::i;122933:1150::-;-1:-1:-1;;;;;123051:18:0;;123043:66;;;;-1:-1:-1;;;123043:66:0;;;;;;;:::i;:::-;123142:7;:14;123128:3;:10;:28;123120:81;;;;-1:-1:-1;;;123120:81:0;;;;;;;:::i;:::-;17699:10;-1:-1:-1;;;;;123262:16:0;;;;123254:77;;;;-1:-1:-1;;;123254:77:0;;;;;;;:::i;:::-;123347:9;123342:571;123366:3;:10;123362:1;:14;123342:571;;;123398:10;123411:3;123415:1;123411:6;;;;;;;;:::i;:::-;;;;;;;123398:19;;123432:14;123449:7;123457:1;123449:10;;;;;;;;:::i;:::-;;;;;;;;;;;;123474:19;123496:13;;;:9;:13;;;;;;-1:-1:-1;;;;;123496:19:0;;;;;;;;;;123551:13;;;:9;:13;;;;;:20;123449:10;;-1:-1:-1;123594:21:0;;;;123586:70;;;;-1:-1:-1;;;123586:70:0;;;;;;;:::i;:::-;123693:6;123679:10;:20;;123671:68;;;;-1:-1:-1;;;123671:68:0;;;;;;;:::i;:::-;123783:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;123783:19:0;;;;;;;;;123805:20;;;;123783:42;;;123844:13;;;:9;:13;;;;;123867:19;;123844:42;;123378:3;;123342:571;;;;123966:1;-1:-1:-1;;;;;123928:55:0;123952:4;-1:-1:-1;;;;;123928:55:0;123942:8;-1:-1:-1;;;;;123928:55:0;-1:-1:-1;;;;;;;;;;;123970:3:0;123975:7;123928:55;;;;;;;:::i;:::-;;;;;;;;123994:81;124030:8;124040:4;124054:1;124058:3;124063:7;123994:81;;;;;;;;;;;;:35;:81::i;:::-;123032:1051;122933:1150;;;:::o;21140:191::-;21233:6;;;-1:-1:-1;;;;;21250:17:0;;;-1:-1:-1;;;;;;21250:17:0;;;;;;;21283:40;;21233:6;;;21250:17;21233:6;;21283:40;;21214:16;;21283:40;21203:128;21140:191;:::o;1553:326::-;-1:-1:-1;;;;;1848:19:0;;:23;;;1553:326::o;34893:59::-;15312:13;;;;;;;15304:69;;;;-1:-1:-1;;;15304:69:0;;;;;;;:::i;96894:137::-;15312:13;;;;;;;15304:69;;;;-1:-1:-1;;;15304:69:0;;;;;;;:::i;:::-;96972:16:::1;:14;:16::i;:::-;96999:24;:22;:24::i;19423:97::-:0;15312:13;;;;;;;15304:69;;;;-1:-1:-1;;;15304:69:0;;;;;;;:::i;:::-;19486:26:::1;:24;:26::i;22889:99::-:0;15312:13;;;;;;;15304:69;;;;-1:-1:-1;;;15304:69:0;;;;;;;:::i;:::-;22953:27:::1;:25;:27::i;24315:118::-:0;23324:19;:17;:19::i;:::-;24375:7:::1;:14:::0;;-1:-1:-1;;24375:14:0::1;24385:4;24375:14;::::0;;24405:20:::1;24412:12;17699:10:::0;;17619:98;76365:447;76440:13;76466:19;76498:10;76502:6;76498:1;:10;:::i;:::-;:14;;76511:1;76498:14;:::i;:::-;-1:-1:-1;;;;;76488:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76488:25:0;;76466:47;;-1:-1:-1;;;76524:6:0;76531:1;76524:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;76524:15:0;;;;;;;;;-1:-1:-1;;;76550:6:0;76557:1;76550:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;76550:15:0;;;;;;;;-1:-1:-1;76581:9:0;76593:10;76597:6;76593:1;:10;:::i;:::-;:14;;76606:1;76593:14;:::i;:::-;76581:26;;76576:131;76613:1;76609;:5;76576:131;;;-1:-1:-1;;;76657:5:0;76665:3;76657:11;76648:21;;;;;;;:::i;:::-;;;;76636:6;76643:1;76636:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;76636:33:0;;;;;;;;-1:-1:-1;76694:1:0;76684:11;;;;;76616:3;;;:::i;:::-;;;76576:131;;;-1:-1:-1;76725:10:0;;76717:55;;;;-1:-1:-1;;;76717:55:0;;38400:2:1;76717:55:0;;;38382:21:1;;;38419:18;;;38412:30;38478:34;38458:18;;;38451:62;38530:18;;76717:55:0;38198:356:1;74920:727:0;74976:13;75027:14;75044:28;75066:5;75044:21;:28::i;:::-;75075:1;75044:32;75027:49;;75091:20;75125:6;-1:-1:-1;;;;;75114:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75114:18:0;-1:-1:-1;75091:41:0;-1:-1:-1;75256:28:0;;;75272:2;75256:28;75313:288;-1:-1:-1;;75345:5:0;-1:-1:-1;;;75482:2:0;75471:14;;75466:30;75345:5;75453:44;75543:2;75534:11;;;-1:-1:-1;75564:21:0;75313:288;75564:21;-1:-1:-1;75622:6:0;74920:727;-1:-1:-1;;;74920:727:0:o;76969:151::-;77027:13;77060:52;-1:-1:-1;;;;;77072:22:0;;74811:2;77060:11;:52::i;124226:345::-;23324:19;:17;:19::i;:::-;124395:8:::1;-1:-1:-1::0;;;;;124386:17:0::1;:5;-1:-1:-1::0;;;;;124386:17:0::1;::::0;124378:71:::1;;;::::0;-1:-1:-1;;;124378:71:0;;38893:2:1;124378:71:0::1;::::0;::::1;38875:21:1::0;38932:2;38912:18;;;38905:30;38971:34;38951:18;;;38944:62;-1:-1:-1;;;39022:18:1;;;39015:39;39071:19;;124378:71:0::1;38691:405:1::0;124378:71:0::1;-1:-1:-1::0;;;;;124460:25:0;;::::1;;::::0;;;:18:::1;:25;::::0;;;;;;;:35;;::::1;::::0;;;;;;;;;;:46;;-1:-1:-1;;124460:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;124522:41;;1159::1;;;124522::0::1;::::0;1132:18:1;124522:41:0::1;;;;;;;124226:345:::0;;;:::o;113025:353::-;113174:18;;113118:27;113199:18;;;:9;:18;;;;;;:28;;;;;113148:80;;-1:-1:-1;;;113148:80:0;;113092:13;;-1:-1:-1;;;;;113174:18:0;;;;113148:50;;:80;;113199:28;;;;;113148:80;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;113148:80:0;;;;;;;;;;;;:::i;:::-;113243:27;;113118:110;;-1:-1:-1;113243:31:0;113239:132;;113298:13;113025:353;-1:-1:-1;;113025:353:0:o;113239:132::-;-1:-1:-1;;113344:15:0;;;;;;;;;;;;-1:-1:-1;;;113344:15:0;;;;;113025:353;-1:-1:-1;113025:353:0:o;113239:132::-;113107:271;113025:353;;;:::o;113386:240::-;113513:18;;;;:9;:18;;;;;;;:28;;;;;113495:123;;-1:-1:-1;;;113495:123:0;;113462:13;;-1:-1:-1;;;;;113513:28:0;;113495:84;;:123;;113513:28;113580:37;;;;113495:123;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;113495:123:0;;;;;;;;;;;;:::i;119196:2335::-;119440:16;23324:19;:17;:19::i;:::-;119498:7:::1;:14;119477:10;:17;:35;119469:91;;;;-1:-1:-1::0;;;119469:91:0::1;;;;;;;:::i;:::-;119600:10;:17;119579:10;:17;:38;119571:92;;;::::0;-1:-1:-1;;;119571:92:0;;40270:2:1;119571:92:0::1;::::0;::::1;40252:21:1::0;40309:2;40289:18;;;40282:30;40348:34;40328:18;;;40321:62;-1:-1:-1;;;40399:18:1;;;40392:39;40448:19;;119571:92:0::1;40068:405:1::0;119571:92:0::1;119832:20;119869:10;:17;-1:-1:-1::0;;;;;119855:32:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;119855:32:0::1;;119832:55;;119903:9;119898:1603;119922:10;:17;119918:1;:21;119898:1603;;;120010:1;119975:10;119986:1;119975:13;;;;;;;;:::i;:::-;;;;;;;:24;;;119969:38;:42;119961:77;;;;-1:-1:-1::0;;;119961:77:0::1;;;;;;;:::i;:::-;120077:1;120061:10;120072:1;120061:13;;;;;;;;:::i;:::-;;;;;;;:17;120053:57;;;;-1:-1:-1::0;;;120053:57:0::1;;;;;;;:::i;:::-;120156:1;120133:10;120144:1;120133:13;;;;;;;;:::i;:::-;;;;;;;:20;;;:24;120125:56;;;;-1:-1:-1::0;;;120125:56:0::1;;;;;;;:::i;:::-;120196:10;120209:73;17699:10:::0;120234::::1;120245:1;120234:13;;;;;;;;:::i;:::-;;;;;;;120249:10;120260:1;120249:13;;;;;;;;:::i;:::-;;;;;;;:32;;;120209:10;:73::i;:::-;120196:86;;120302:9;120297:707;120321:10;:17;120317:1;:21;120297:707;;;120364:10;120377;120388:1;120377:13;;;;;;;;:::i;:::-;;;;;;;120364:26;;120431:1;-1:-1:-1::0;;;;;120417:16:0::1;:2;-1:-1:-1::0;;;;;120417:16:0::1;::::0;120409:62:::1;;;;-1:-1:-1::0;;;120409:62:0::1;;;;;;;:::i;:::-;120490:14;120507:7;120515:1;120507:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;120536:13:::1;::::0;;;:9:::1;:13:::0;;;;;;-1:-1:-1;;;;;120536:17:0;::::1;::::0;;;;;;;;:27;;120507:10;;-1:-1:-1;120507:10:0;;120536:17;;:27:::1;::::0;120507:10;;120536:27:::1;:::i;:::-;::::0;;;-1:-1:-1;;120635:10:0;;120582:36:::1;::::0;-1:-1:-1;;;;;120621:25:0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;120621:25:0::1;;120582:64;;120670:9;120665:115;120689:3;:10;120685:1;:14;120665:115;;;120754:6;120729:19;120749:1;120729:22;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:31;120701:3:::1;;120665:115;;;-1:-1:-1::0;120798:97:0::1;17699:10:::0;120856:1:::1;120860:2;120864:3;120869:19;120890:4;120798:35;:97::i;:::-;-1:-1:-1::0;;;;;120919:69:0;::::1;120955:1;17699:10:::0;-1:-1:-1;;;;;120919:69:0::1;-1:-1:-1::0;;;;;;;;;;;120963:3:0::1;120968:19;120919:69;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;120340:3:0::1;;120297:707;;;-1:-1:-1::0;121026:13:0::1;::::0;;;:9:::1;:13;::::0;;;;:20;:25;121018:90:::1;;;;-1:-1:-1::0;;;121018:90:0::1;;;;;;;:::i;:::-;121251:1;-1:-1:-1::0;;;;;121216:37:0::1;:10;121227:1;121216:13;;;;;;;;:::i;:::-;;;;;;;:23;;;-1:-1:-1::0;;;;;121216:37:0::1;::::0;121212:171:::1;;121350:17;::::0;121324:13;;-1:-1:-1;;;;;121350:17:0;;::::1;::::0;121324:10;;121335:1;;121324:13;::::1;;;;;:::i;:::-;;;;;;;:23;;:43;-1:-1:-1::0;;;;;121324:43:0::1;;;-1:-1:-1::0;;;;;121324:43:0::1;;;::::0;::::1;121212:171;121406:2;121397:3;121401:1;121397:6;;;;;;;;:::i;:::-;;;;;;:11;;;::::0;::::1;121476:10;121487:1;121476:13;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;121460::::1;::::0;;;:9:::1;:13:::0;;;;;:29;;;;;;::::1;::::0;121476:13;;121460;:29:::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;121460:29:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;121460:29:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;121460:29:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;121460:29:0::1;-1:-1:-1::0;;;;;121460:29:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;119941:3:0::1;119898:1603;;;-1:-1:-1::0;121520:3:0;119196:2335;-1:-1:-1;;;;;;119196:2335:0:o;113681:448::-;113777:4;113811:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;113811:21:0;;;;;;;;;;113847:11;;;113843:56;;113882:5;113875:12;;;;;113843:56;113909:14;113926:13;;;:9;:13;;;;;:20;;113961:11;;;113957:56;;113996:5;113989:12;;;;;;113957:56;114023:15;114041:43;114064:6;114072:3;114077:6;114041:22;:43::i;:::-;-1:-1:-1;;;;113681:448:0;-1:-1:-1;;;;;;113681:448:0:o;114593:717::-;23324:19;:17;:19::i;:::-;-1:-1:-1;;;;;114795:16:0;::::1;114787:66;;;;-1:-1:-1::0;;;114787:66:0::1;;;;;;;:::i;:::-;114864:16;114928:13:::0;;;:9:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;114928:19:0;::::1;::::0;;;;;;;;17699:10;;114966:21;;::::1;;114958:76;;;;-1:-1:-1::0;;;114958:76:0::1;;;;;;;:::i;:::-;115070:13;::::0;;;:9:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;115070:19:0;;::::1;::::0;;;;;;;115092:20;;::::1;115070:42:::0;;115134:17;;::::1;::::0;;;;:27;;115092:20;;115070:13;115134:27:::1;::::0;115092:20;;115134:27:::1;:::i;:::-;;;;;;;;115208:2;-1:-1:-1::0;;;;;115177:46:0::1;115202:4;-1:-1:-1::0;;;;;115177:46:0::1;115192:8;-1:-1:-1::0;;;;;115177:46:0::1;-1:-1:-1::0;;;;;;;;;;;115212:2:0::1;115216:6;115177:46;;;;;;;:::i;:::-;;;;;;;;115234:68;115265:8;115275:4;115281:2;115285;115289:6;115297:4;115234:30;:68::i;:::-;114776:534;;114593:717:::0;;;;;:::o;121829:854::-;-1:-1:-1;;;;;121922:18:0;;121914:66;;;;-1:-1:-1;;;121914:66:0;;;;;;;:::i;:::-;17699:10;-1:-1:-1;;;;;122041:16:0;;;;122033:77;;;;-1:-1:-1;;;122033:77:0;;;;;;;:::i;:::-;122121:19;122143:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;122143:19:0;;;;;;;;;;122194:13;;;:9;:13;;;;;;:20;122233:21;;;;122225:70;;;;-1:-1:-1;;;122225:70:0;;;;;;;:::i;:::-;122328:6;122314:10;:20;;122306:68;;;;-1:-1:-1;;;122306:68:0;;;;;;;:::i;:::-;122410:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;122410:19:0;;;;;;;;;;;;122432:20;;;122410:42;;122467:13;;;:9;:13;;;;;;122490:19;;;122467:42;;122536:54;;122410:19;;122536:54;;;-1:-1:-1;;;;;;;;;;;122536:54:0;;;122420:2;;122446:6;;122536:54;:::i;:::-;;;;;;;;122601:74;122632:8;122642:4;122656:1;122660:2;122664:6;122601:74;;;;;;;;;;;;124579:802;23324:19;:17;:19::i;:::-;124808:15:::1;:2;-1:-1:-1::0;;;;;124808:13:0::1;;:15::i;:::-;124804:570;;;124844:83;::::0;-1:-1:-1;;;124844:83:0;;-1:-1:-1;;;;;124844:49:0;::::1;::::0;::::1;::::0;:83:::1;::::0;124894:8;;124904:4;;124910:2;;124914:6;;124922:4;;124844:83:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;124844:83:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;124844:83:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;124840:523;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;125225:6;125218:14;;-1:-1:-1::0;;;125218:14:0::1;;;;;;;;:::i;124840:523::-;;;125274:73;::::0;-1:-1:-1;;;125274:73:0;;42371:2:1;125274:73:0::1;::::0;::::1;42353:21:1::0;42410:2;42390:18;;;42383:30;42449:34;42429:18;;;42422:62;42520:33;42500:18;;;42493:61;42571:19;;125274:73:0::1;42169:427:1::0;124840:523:0::1;-1:-1:-1::0;;;;;;124977:66:0;::::1;-1:-1:-1::0;;;124977:66:0::1;124973:176;;125068:61;;-1:-1:-1::0;;;125068:61:0::1;;;;;;;:::i;125389:871::-:0;23324:19;:17;:19::i;:::-;125643:15:::1;:2;-1:-1:-1::0;;;;;125643:13:0::1;;:15::i;:::-;125639:614;;;125679:90;::::0;-1:-1:-1;;;125679:90:0;;-1:-1:-1;;;;;125679:54:0;::::1;::::0;::::1;::::0;:90:::1;::::0;125734:8;;125744:4;;125750:3;;125755:7;;125764:4;;125679:90:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;125679:90:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;125679:90:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;125675:567;;;;:::i;:::-;-1:-1:-1::0;;;;;;125851:71:0;::::1;-1:-1:-1::0;;;125851:71:0::1;125847:181;;125947:61;;-1:-1:-1::0;;;125947:61:0::1;;;;;;;:::i;86033:284::-:0;86115:48;86145:17;86115:29;:48::i;:::-;86107:106;;;;-1:-1:-1;;;86107:106:0;;44066:2:1;86107:106:0;;;44048:21:1;44105:2;44085:18;;;44078:30;44144:34;44124:18;;;44117:62;-1:-1:-1;;;44195:18:1;;;44188:43;44248:19;;86107:106:0;43864:409:1;86107:106:0;86292:17;-1:-1:-1;;;;;;;;;;;86224:59:0;:85;;-1:-1:-1;;;;;;86224:85:0;-1:-1:-1;;;;;86224:85:0;;;;;;;;;;-1:-1:-1;86033:284:0:o;86726:281::-;86835:29;86846:17;86835:10;:29::i;:::-;86893:1;86879:4;:11;:15;:28;;;;86898:9;86879:28;86875:125;;;86924:64;86964:17;86983:4;86924:39;:64::i;88746:215::-;-1:-1:-1;;;;;88810:22:0;;88802:73;;;;-1:-1:-1;;;88802:73:0;;44480:2:1;88802:73:0;;;44462:21:1;44519:2;44499:18;;;44492:30;44558:34;44538:18;;;44531:62;-1:-1:-1;;;44609:18:1;;;44602:36;44655:19;;88802:73:0;44278:402:1;88802:73:0;88945:8;-1:-1:-1;;;;;;;;;;;88886:50:0;81652:195;19528:113;15312:13;;;;;;;15304:69;;;;-1:-1:-1;;;15304:69:0;;;;;;;:::i;:::-;19601:32:::1;17699:10:::0;19601:18:::1;:32::i;22996:97::-:0;15312:13;;;;;;;15304:69;;;;-1:-1:-1;;;15304:69:0;;;;;;;:::i;:::-;23070:7:::1;:15:::0;;-1:-1:-1;;23070:15:0::1;::::0;;22996:97::o;70153:948::-;70206:7;;-1:-1:-1;;;70284:17:0;;70280:106;;-1:-1:-1;;;70322:17:0;;;-1:-1:-1;70368:2:0;70358:12;70280:106;-1:-1:-1;;;70404:5:0;:17;70400:106;;-1:-1:-1;;;70442:17:0;;;-1:-1:-1;70488:2:0;70478:12;70400:106;70533:8;70524:5;:17;70520:106;;70571:8;70562:17;;;-1:-1:-1;70608:2:0;70598:12;70520:106;70653:7;70644:5;:16;70640:103;;70690:7;70681:16;;;-1:-1:-1;70726:1:0;70716:11;70640:103;70770:7;70761:5;:16;70757:103;;70807:7;70798:16;;;-1:-1:-1;70843:1:0;70833:11;70757:103;70887:7;70878:5;:16;70874:103;;70924:7;70915:16;;;-1:-1:-1;70960:1:0;70950:11;70874:103;71004:7;70995:5;:16;70991:68;;71042:1;71032:11;71087:6;70153:948;-1:-1:-1;;70153:948:0:o;61484:4292::-;61566:14;;;-1:-1:-1;;62111:1:0;62108;62101:20;62155:1;62152;62148:9;62139:18;;62211:5;62207:2;62204:13;62196:5;62192:2;62188:14;62184:34;62175:43;;;62317:5;62326:1;62317:10;62313:373;;62659:11;62651:5;:19;;;;;:::i;:::-;;62644:26;;;;;;62313:373;62813:5;62799:11;:19;62791:53;;;;-1:-1:-1;;;62791:53:0;;44887:2:1;62791:53:0;;;44869:21:1;44926:2;44906:18;;;44899:30;-1:-1:-1;;;44945:18:1;;;44938:51;45006:18;;62791:53:0;44685:345:1;62791:53:0;63107:17;63245:11;63242:1;63239;63232:25;64652:1;63804;63789:12;;:16;;63774:32;;63912:22;;;;64633:1;:15;;64632:21;;64889;;;64885:25;;64874:36;64959:21;;;64955:25;;64944:36;65030:21;;;65026:25;;65015:36;65101:21;;;65097:25;;65086:36;65172:21;;;65168:25;;65157:36;65244:21;;;65240:25;;;65229:36;;;63759:12;64163;;;64159:23;;;64155:31;;;63362:20;;;63351:32;;;64279:12;;;;63410:21;;64013:16;;;;64270:21;;;;65714:15;;;-1:-1:-1;;;;61484:4292:0:o;86430:155::-;86497:37;86516:17;86497:18;:37::i;:::-;86550:27;;-1:-1:-1;;;;;86550:27:0;;;;;;;;86430:155;:::o;6945:200::-;7028:12;7060:77;7081:6;7089:4;7060:77;;;;;;;;;;;;;;;;;7484:12;7510;7524:23;7551:6;-1:-1:-1;;;;;7551:19:0;7571:4;7551:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7509:67;;;;7594:69;7621:6;7629:7;7638:10;7650:12;7594:26;:69::i;:::-;7587:76;7339:332;-1:-1:-1;;;;;;7339:332:0:o;7967:644::-;8152:12;8181:7;8177:427;;;8209:10;:17;8230:1;8209:22;8205:290;;8427:18;8438:6;8427:10;:18::i;:::-;8419:60;;;;-1:-1:-1;;;8419:60:0;;45432:2:1;8419:60:0;;;45414:21:1;45471:2;45451:18;;;45444:30;45510:31;45490:18;;;45483:59;45559:18;;8419:60:0;45230:353:1;8419:60:0;-1:-1:-1;8516:10:0;8509:17;;8177:427;8559:33;8567:10;8579:12;8559:7;:33::i;:::-;7967:644;;;;;;:::o;9153:552::-;9314:17;;:21;9310:388;;9546:10;9540:17;9603:15;9590:10;9586:2;9582:19;9575:44;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:180::-;1270:6;1323:2;1311:9;1302:7;1298:23;1294:32;1291:52;;;1339:1;1336;1329:12;1291:52;-1:-1:-1;1362:23:1;;1211:180;-1:-1:-1;1211:180:1:o;1396:300::-;1449:3;1487:5;1481:12;1514:6;1509:3;1502:19;1570:6;1563:4;1556:5;1552:16;1545:4;1540:3;1536:14;1530:47;1622:1;1615:4;1606:6;1601:3;1597:16;1593:27;1586:38;1685:4;1678:2;1674:7;1669:2;1661:6;1657:15;1653:29;1648:3;1644:39;1640:50;1633:57;;;1396:300;;;;:::o;1701:231::-;1850:2;1839:9;1832:21;1813:4;1870:56;1922:2;1911:9;1907:18;1899:6;1870:56;:::i;1937:186::-;1996:6;2049:2;2037:9;2028:7;2024:23;2020:32;2017:52;;;2065:1;2062;2055:12;2017:52;2088:29;2107:9;2088:29;:::i;2128:127::-;2189:10;2184:3;2180:20;2177:1;2170:31;2220:4;2217:1;2210:15;2244:4;2241:1;2234:15;2260:249;2370:2;2351:13;;-1:-1:-1;;2347:27:1;2335:40;;-1:-1:-1;;;;;2390:34:1;;2426:22;;;2387:62;2384:88;;;2452:18;;:::i;:::-;2488:2;2481:22;-1:-1:-1;;2260:249:1:o;2514:183::-;2574:4;-1:-1:-1;;;;;2596:30:1;;2593:56;;;2629:18;;:::i;:::-;-1:-1:-1;2674:1:1;2670:14;2686:4;2666:25;;2514:183::o;2702:736::-;2756:5;2809:3;2802:4;2794:6;2790:17;2786:27;2776:55;;2827:1;2824;2817:12;2776:55;2863:6;2850:20;2889:4;2912:43;2952:2;2912:43;:::i;:::-;2984:2;2978:9;2996:31;3024:2;3016:6;2996:31;:::i;:::-;3047:6;3036:17;;3077:2;3069:6;3062:18;3108:4;3100:6;3096:17;3089:24;;3165:4;3159:2;3156:1;3152:10;3144:6;3140:23;3136:34;3122:48;;3193:3;3185:6;3182:15;3179:35;;;3210:1;3207;3200:12;3179:35;3246:4;3238:6;3234:17;3260:148;3276:6;3271:3;3268:15;3260:148;;;3342:23;3361:3;3342:23;:::i;:::-;3330:36;;3386:12;;;;3293;;3260:148;;3443:730;3497:5;3550:3;3543:4;3535:6;3531:17;3527:27;3517:55;;3568:1;3565;3558:12;3517:55;3604:6;3591:20;3630:4;3653:43;3693:2;3653:43;:::i;:::-;3725:2;3719:9;3737:31;3765:2;3757:6;3737:31;:::i;:::-;3788:6;3777:17;;3818:2;3810:6;3803:18;3849:4;3841:6;3837:17;3830:24;;3906:4;3900:2;3897:1;3893:10;3885:6;3881:23;3877:34;3863:48;;3934:3;3926:6;3923:15;3920:35;;;3951:1;3948;3941:12;3920:35;3987:4;3979:6;3975:17;4001:142;4017:6;4012:3;4009:15;4001:142;;;4083:17;;4071:30;;4121:12;;;;4034;;4001:142;;4178:187;4227:4;-1:-1:-1;;;;;4249:30:1;;4246:56;;;4282:18;;:::i;:::-;-1:-1:-1;4348:2:1;4327:15;-1:-1:-1;;4323:29:1;4354:4;4319:40;;4178:187::o;4370:510::-;4413:5;4466:3;4459:4;4451:6;4447:17;4443:27;4433:55;;4484:1;4481;4474:12;4433:55;4520:6;4507:20;4546:32;4575:2;4546:32;:::i;:::-;4607:2;4601:9;4619:31;4647:2;4639:6;4619:31;:::i;:::-;4674:2;4666:6;4659:18;4720:3;4713:4;4708:2;4700:6;4696:15;4692:26;4689:35;4686:55;;;4737:1;4734;4727:12;4686:55;4801:2;4794:4;4786:6;4782:17;4775:4;4767:6;4763:17;4750:54;4848:1;4824:15;;;4841:4;4820:26;4813:37;;;;-1:-1:-1;4828:6:1;4370:510;-1:-1:-1;;;4370:510:1:o;4885:1341::-;5078:6;5086;5094;5102;5110;5118;5126;5179:3;5167:9;5158:7;5154:23;5150:33;5147:53;;;5196:1;5193;5186:12;5147:53;5223:23;;-1:-1:-1;;;;;5295:14:1;;;5292:34;;;5322:1;5319;5312:12;5292:34;5345:61;5398:7;5389:6;5378:9;5374:22;5345:61;:::i;:::-;5335:71;;5453:2;5442:9;5438:18;5425:32;5415:42;;5510:2;5499:9;5495:18;5482:32;5466:48;;5539:2;5529:8;5526:16;5523:36;;;5555:1;5552;5545:12;5523:36;5578:63;5633:7;5622:8;5611:9;5607:24;5578:63;:::i;:::-;5568:73;;5694:2;5683:9;5679:18;5666:32;5650:48;;5723:2;5713:8;5710:16;5707:36;;;5739:1;5736;5729:12;5707:36;5762:52;5806:7;5795:8;5784:9;5780:24;5762:52;:::i;:::-;5752:62;;5867:3;5856:9;5852:19;5839:33;5823:49;;5897:2;5887:8;5884:16;5881:36;;;5913:1;5910;5903:12;5881:36;5936:52;5980:7;5969:8;5958:9;5954:24;5936:52;:::i;:::-;5926:62;;6041:3;6030:9;6026:19;6013:33;5997:49;;6071:2;6061:8;6058:16;6055:36;;;6087:1;6084;6077:12;6055:36;;6110:52;6154:7;6143:8;6132:9;6128:24;6110:52;:::i;:::-;6100:62;;;6181:39;6215:3;6204:9;6200:19;6181:39;:::i;:::-;6171:49;;4885:1341;;;;;;;;;;:::o;6231:944::-;6385:6;6393;6401;6409;6417;6470:3;6458:9;6449:7;6445:23;6441:33;6438:53;;;6487:1;6484;6477:12;6438:53;6510:29;6529:9;6510:29;:::i;:::-;6500:39;;6558:38;6592:2;6581:9;6577:18;6558:38;:::i;:::-;6548:48;-1:-1:-1;6647:2:1;6632:18;;6619:32;-1:-1:-1;;;;;6700:14:1;;;6697:34;;;6727:1;6724;6717:12;6697:34;6750:61;6803:7;6794:6;6783:9;6779:22;6750:61;:::i;:::-;6740:71;;6864:2;6853:9;6849:18;6836:32;6820:48;;6893:2;6883:8;6880:16;6877:36;;;6909:1;6906;6899:12;6877:36;6932:63;6987:7;6976:8;6965:9;6961:24;6932:63;:::i;:::-;6922:73;;7048:3;7037:9;7033:19;7020:33;7004:49;;7078:2;7068:8;7065:16;7062:36;;;7094:1;7091;7084:12;7062:36;;7117:52;7161:7;7150:8;7139:9;7135:24;7117:52;:::i;:::-;7107:62;;;6231:944;;;;;;;;:::o;7180:203::-;-1:-1:-1;;;;;7344:32:1;;;;7326:51;;7314:2;7299:18;;7180:203::o;7388:595::-;7506:6;7514;7567:2;7555:9;7546:7;7542:23;7538:32;7535:52;;;7583:1;7580;7573:12;7535:52;7610:23;;-1:-1:-1;;;;;7682:14:1;;;7679:34;;;7709:1;7706;7699:12;7679:34;7732:61;7785:7;7776:6;7765:9;7761:22;7732:61;:::i;:::-;7722:71;;7846:2;7835:9;7831:18;7818:32;7802:48;;7875:2;7865:8;7862:16;7859:36;;;7891:1;7888;7881:12;7859:36;;7914:63;7969:7;7958:8;7947:9;7943:24;7914:63;:::i;:::-;7904:73;;;7388:595;;;;;:::o;7988:439::-;8041:3;8079:5;8073:12;8106:6;8101:3;8094:19;8132:4;8161;8156:3;8152:14;8145:21;;8200:4;8193:5;8189:16;8223:1;8233:169;8247:6;8244:1;8241:13;8233:169;;;8308:13;;8296:26;;8342:12;;;;8377:15;;;;8269:1;8262:9;8233:169;;;-1:-1:-1;8418:3:1;;7988:439;-1:-1:-1;;;;;7988:439:1:o;8432:261::-;8611:2;8600:9;8593:21;8574:4;8631:56;8683:2;8672:9;8668:18;8660:6;8631:56;:::i;8698:395::-;8775:6;8783;8836:2;8824:9;8815:7;8811:23;8807:32;8804:52;;;8852:1;8849;8842:12;8804:52;8875:29;8894:9;8875:29;:::i;:::-;8865:39;-1:-1:-1;8955:2:1;8940:18;;8927:32;-1:-1:-1;;;;;8971:30:1;;8968:50;;;9014:1;9011;9004:12;8968:50;9037;9079:7;9070:6;9059:9;9055:22;9037:50;:::i;9280:750::-;9581:6;9570:9;9563:25;9624:3;9619:2;9608:9;9604:18;9597:31;9544:4;9651:57;9703:3;9692:9;9688:19;9680:6;9651:57;:::i;:::-;9756:9;9748:6;9744:22;9739:2;9728:9;9724:18;9717:50;9790:44;9827:6;9819;9790:44;:::i;:::-;9776:58;;9882:9;9874:6;9870:22;9865:2;9854:9;9850:18;9843:50;9910:44;9947:6;9939;9910:44;:::i;:::-;9902:52;;;10020:1;10016;10011:3;10007:11;10003:19;9995:6;9991:32;9985:3;9974:9;9970:19;9963:61;9280:750;;;;;;;;:::o;10035:669::-;10162:6;10170;10178;10231:2;10219:9;10210:7;10206:23;10202:32;10199:52;;;10247:1;10244;10237:12;10199:52;10270:29;10289:9;10270:29;:::i;:::-;10260:39;-1:-1:-1;10350:2:1;10335:18;;10322:32;-1:-1:-1;;;;;10403:14:1;;;10400:34;;;10430:1;10427;10420:12;10400:34;10453:61;10506:7;10497:6;10486:9;10482:22;10453:61;:::i;:::-;10443:71;;10567:2;10556:9;10552:18;10539:32;10523:48;;10596:2;10586:8;10583:16;10580:36;;;10612:1;10609;10602:12;10580:36;;10635:63;10690:7;10679:8;10668:9;10664:24;10635:63;:::i;:::-;10625:73;;;10035:669;;;;;:::o;10709:464::-;10796:6;10804;10812;10865:2;10853:9;10844:7;10840:23;10836:32;10833:52;;;10881:1;10878;10871:12;10833:52;10904:29;10923:9;10904:29;:::i;:::-;10894:39;-1:-1:-1;10980:2:1;10965:18;;10952:32;;-1:-1:-1;11035:2:1;11020:18;;11007:32;-1:-1:-1;;;;;11051:30:1;;11048:50;;;11094:1;11091;11084:12;11048:50;11117;11159:7;11150:6;11139:9;11135:22;11117:50;:::i;11178:347::-;11243:6;11251;11304:2;11292:9;11283:7;11279:23;11275:32;11272:52;;;11320:1;11317;11310:12;11272:52;11343:29;11362:9;11343:29;:::i;:::-;11333:39;;11422:2;11411:9;11407:18;11394:32;11469:5;11462:13;11455:21;11448:5;11445:32;11435:60;;11491:1;11488;11481:12;11435:60;11514:5;11504:15;;;11178:347;;;;;:::o;11530:248::-;11598:6;11606;11659:2;11647:9;11638:7;11634:23;11630:32;11627:52;;;11675:1;11672;11665:12;11627:52;-1:-1:-1;;11698:23:1;;;11768:2;11753:18;;;11740:32;;-1:-1:-1;11530:248:1:o;11783:880::-;11836:5;11889:3;11882:4;11874:6;11870:17;11866:27;11856:55;;11907:1;11904;11897:12;11856:55;11943:6;11930:20;11969:4;11992:43;12032:2;11992:43;:::i;:::-;12064:2;12058:9;12076:31;12104:2;12096:6;12076:31;:::i;:::-;12142:18;;;12234:1;12230:10;;;;12218:23;;12214:32;;;12176:15;;;;-1:-1:-1;12258:15:1;;;12255:35;;;12286:1;12283;12276:12;12255:35;12322:2;12314:6;12310:15;12334:299;12350:6;12345:3;12342:15;12334:299;;;12423:17;;-1:-1:-1;;;;;12456:35:1;;12453:55;;;12504:1;12501;12494:12;12453:55;12533:57;12586:3;12581:2;12567:11;12559:6;12555:24;12551:33;12533:57;:::i;:::-;12521:70;;-1:-1:-1;12611:12:1;;;;12367;;12334:299;;12668:1756;12986:6;12994;13002;13010;13018;13026;13034;13087:3;13075:9;13066:7;13062:23;13058:33;13055:53;;;13104:1;13101;13094:12;13055:53;13131:23;;-1:-1:-1;;;;;13203:14:1;;;13200:34;;;13230:1;13227;13220:12;13200:34;13253:61;13306:7;13297:6;13286:9;13282:22;13253:61;:::i;:::-;13243:71;;13367:2;13356:9;13352:18;13339:32;13323:48;;13396:2;13386:8;13383:16;13380:36;;;13412:1;13409;13402:12;13380:36;13435:63;13490:7;13479:8;13468:9;13464:24;13435:63;:::i;:::-;13425:73;;13551:2;13540:9;13536:18;13523:32;13507:48;;13580:2;13570:8;13567:16;13564:36;;;13596:1;13593;13586:12;13564:36;13619:63;13674:7;13663:8;13652:9;13648:24;13619:63;:::i;:::-;13609:73;;13735:2;13724:9;13720:18;13707:32;13691:48;;13764:2;13754:8;13751:16;13748:36;;;13780:1;13777;13770:12;13748:36;13803:62;13857:7;13846:8;13835:9;13831:24;13803:62;:::i;:::-;13793:72;;13918:3;13907:9;13903:19;13890:33;13874:49;;13948:2;13938:8;13935:16;13932:36;;;13964:1;13961;13954:12;13932:36;13987:62;14041:7;14030:8;14019:9;14015:24;13987:62;:::i;:::-;13977:72;;14102:3;14091:9;14087:19;14074:33;14058:49;;14132:2;14122:8;14119:16;14116:36;;;14148:1;14145;14138:12;14116:36;14171:62;14225:7;14214:8;14203:9;14199:24;14171:62;:::i;:::-;14161:72;;14286:3;14275:9;14271:19;14258:33;14242:49;;14316:2;14306:8;14303:16;14300:36;;;14332:1;14329;14322:12;14300:36;;14355:63;14410:7;14399:8;14388:9;14384:24;14355:63;:::i;:::-;14345:73;;;12668:1756;;;;;;;;;;:::o;14429:390::-;14507:6;14515;14568:2;14556:9;14547:7;14543:23;14539:32;14536:52;;;14584:1;14581;14574:12;14536:52;14611:23;;-1:-1:-1;;;;;14646:30:1;;14643:50;;;14689:1;14686;14679:12;14643:50;14712;14754:7;14745:6;14734:9;14730:22;14712:50;:::i;:::-;14702:60;14809:2;14794:18;;;;14781:32;;-1:-1:-1;;;;14429:390:1:o;14824:260::-;14892:6;14900;14953:2;14941:9;14932:7;14928:23;14924:32;14921:52;;;14969:1;14966;14959:12;14921:52;14992:29;15011:9;14992:29;:::i;:::-;14982:39;;15040:38;15074:2;15063:9;15059:18;15040:38;:::i;:::-;15030:48;;14824:260;;;;;:::o;15089:607::-;15193:6;15201;15209;15217;15225;15278:3;15266:9;15257:7;15253:23;15249:33;15246:53;;;15295:1;15292;15285:12;15246:53;15318:29;15337:9;15318:29;:::i;:::-;15308:39;;15366:38;15400:2;15389:9;15385:18;15366:38;:::i;:::-;15356:48;-1:-1:-1;15451:2:1;15436:18;;15423:32;;-1:-1:-1;15502:2:1;15487:18;;15474:32;;-1:-1:-1;15557:3:1;15542:19;;15529:33;-1:-1:-1;;;;;15574:30:1;;15571:50;;;15617:1;15614;15607:12;15571:50;15640;15682:7;15673:6;15662:9;15658:22;15640:50;:::i;15701:322::-;15778:6;15786;15794;15847:2;15835:9;15826:7;15822:23;15818:32;15815:52;;;15863:1;15860;15853:12;15815:52;15886:29;15905:9;15886:29;:::i;:::-;15876:39;15962:2;15947:18;;15934:32;;-1:-1:-1;16013:2:1;15998:18;;;15985:32;;15701:322;-1:-1:-1;;;15701:322:1:o;16028:683::-;16123:6;16131;16139;16192:2;16180:9;16171:7;16167:23;16163:32;16160:52;;;16208:1;16205;16198:12;16160:52;16231:23;;;-1:-1:-1;16305:2:1;16290:18;;16277:32;-1:-1:-1;;;;;16358:14:1;;;16355:34;;;16385:1;16382;16375:12;16355:34;16423:6;16412:9;16408:22;16398:32;;16468:7;16461:4;16457:2;16453:13;16449:27;16439:55;;16490:1;16487;16480:12;16439:55;16530:2;16517:16;16556:2;16548:6;16545:14;16542:34;;;16572:1;16569;16562:12;16542:34;16625:7;16620:2;16610:6;16607:1;16603:14;16599:2;16595:23;16591:32;16588:45;16585:65;;;16646:1;16643;16636:12;16585:65;16677:2;16673;16669:11;16659:21;;16699:6;16689:16;;;;;16028:683;;;;;:::o;16716:632::-;16887:2;16939:21;;;17009:13;;16912:18;;;17031:22;;;16858:4;;16887:2;17110:15;;;;17084:2;17069:18;;;16858:4;17153:169;17167:6;17164:1;17161:13;17153:169;;;17228:13;;17216:26;;17297:15;;;;17262:12;;;;17189:1;17182:9;17153:169;;;-1:-1:-1;17339:3:1;;16716:632;-1:-1:-1;;;;;;16716:632:1:o;17764:719::-;17844:6;17897:2;17885:9;17876:7;17872:23;17868:32;17865:52;;;17913:1;17910;17903:12;17865:52;17940:16;;-1:-1:-1;;;;;17968:30:1;;17965:50;;;18011:1;18008;18001:12;17965:50;18034:22;;18087:4;18079:13;;18075:27;-1:-1:-1;18065:55:1;;18116:1;18113;18106:12;18065:55;18145:2;18139:9;18167:32;18196:2;18167:32;:::i;:::-;18228:2;18222:9;18240:31;18268:2;18260:6;18240:31;:::i;:::-;18295:2;18287:6;18280:18;18335:7;18330:2;18325;18321;18317:11;18313:20;18310:33;18307:53;;;18356:1;18353;18346:12;18307:53;18405:2;18400;18396;18392:11;18387:2;18379:6;18375:15;18369:39;18450:1;18428:15;;;18445:2;18424:24;18417:35;;;;-1:-1:-1;18432:6:1;17764:719;-1:-1:-1;;;;17764:719:1:o;18488:127::-;18549:10;18544:3;18540:20;18537:1;18530:31;18580:4;18577:1;18570:15;18604:4;18601:1;18594:15;18620:401;18822:2;18804:21;;;18861:2;18841:18;;;18834:30;18900:34;18895:2;18880:18;;18873:62;-1:-1:-1;;;18966:2:1;18951:18;;18944:35;19011:3;18996:19;;18620:401::o;19026:127::-;19087:10;19082:3;19078:20;19075:1;19068:31;19118:4;19115:1;19108:15;19142:4;19139:1;19132:15;19158:125;19223:9;;;19244:10;;;19241:36;;;19257:18;;:::i;19288:410::-;19490:2;19472:21;;;19529:2;19509:18;;;19502:30;19568:34;19563:2;19548:18;;19541:62;-1:-1:-1;;;19634:2:1;19619:18;;19612:44;19688:3;19673:19;;19288:410::o;19703:408::-;19905:2;19887:21;;;19944:2;19924:18;;;19917:30;-1:-1:-1;;;;;;;;;;;19978:2:1;19963:18;;19956:62;-1:-1:-1;;;20049:2:1;20034:18;;20027:42;20101:3;20086:19;;19703:408::o;20116:::-;20318:2;20300:21;;;20357:2;20337:18;;;20330:30;-1:-1:-1;;;;;;;;;;;20391:2:1;20376:18;;20369:62;-1:-1:-1;;;20462:2:1;20447:18;;20440:42;20514:3;20499:19;;20116:408::o;20529:410::-;20731:2;20713:21;;;20770:2;20750:18;;;20743:30;20809:34;20804:2;20789:18;;20782:62;-1:-1:-1;;;20875:2:1;20860:18;;20853:44;20929:3;20914:19;;20529:410::o;21968:380::-;22047:1;22043:12;;;;22090;;;22111:61;;22165:4;22157:6;22153:17;22143:27;;22111:61;22218:2;22210:6;22207:14;22187:18;22184:38;22181:161;;22264:10;22259:3;22255:20;22252:1;22245:31;22299:4;22296:1;22289:15;22327:4;22324:1;22317:15;22552:212;22594:3;22632:5;22626:12;22676:6;22669:4;22662:5;22658:16;22653:3;22647:36;22738:1;22702:16;;22727:13;;;-1:-1:-1;22702:16:1;;22552:212;-1:-1:-1;22552:212:1:o;22769:492::-;23092:3;23117:138;23143:111;23169:84;23195:57;23221:30;23247:3;23239:6;23221:30;:::i;:::-;23213:6;23195:57;:::i;:::-;23187:6;23169:84;:::i;:::-;23161:6;23143:111;:::i;:::-;23135:6;23117:138;:::i;:::-;23110:145;22769:492;-1:-1:-1;;;;;;;22769:492:1:o;23266:192::-;23397:3;23422:30;23448:3;23440:6;23422:30;:::i;23463:297::-;23581:12;;23628:4;23617:16;;;23611:23;;23581:12;23646:16;;23643:111;;;-1:-1:-1;;23720:4:1;23716:17;;;;23713:1;23709:25;23705:38;23694:50;;23463:297;-1:-1:-1;23463:297:1:o;24111:345::-;24313:2;24295:21;;;24352:2;24332:18;;;24325:30;-1:-1:-1;;;24386:2:1;24371:18;;24364:51;24447:2;24432:18;;24111:345::o;24587:518::-;24689:2;24684:3;24681:11;24678:421;;;24725:5;24722:1;24715:16;24769:4;24766:1;24756:18;24839:2;24827:10;24823:19;24820:1;24816:27;24810:4;24806:38;24875:4;24863:10;24860:20;24857:47;;;-1:-1:-1;24898:4:1;24857:47;24953:2;24948:3;24944:12;24941:1;24937:20;24931:4;24927:31;24917:41;;25008:81;25026:2;25019:5;25016:13;25008:81;;;25085:1;25071:16;;25052:1;25041:13;25008:81;;25281:1345;25401:10;;-1:-1:-1;;;;;25423:30:1;;25420:56;;;25456:18;;:::i;:::-;25485:97;25575:6;25535:38;25567:4;25561:11;25535:38;:::i;:::-;25529:4;25485:97;:::i;:::-;25637:4;;25694:2;25683:14;;25711:1;25706:663;;;;26413:1;26430:6;26427:89;;;-1:-1:-1;26482:19:1;;;26476:26;26427:89;-1:-1:-1;;25238:1:1;25234:11;;;25230:24;25226:29;25216:40;25262:1;25258:11;;;25213:57;26529:81;;25676:944;;25706:663;24534:1;24527:14;;;24571:4;24558:18;;-1:-1:-1;;25742:20:1;;;25860:236;25874:7;25871:1;25868:14;25860:236;;;25963:19;;;25957:26;25942:42;;26055:27;;;;26023:1;26011:14;;;;25890:19;;25860:236;;;25864:3;26124:6;26115:7;26112:19;26109:201;;;26185:19;;;26179:26;-1:-1:-1;;26268:1:1;26264:14;;;26280:3;26260:24;26256:37;26252:42;26237:58;26222:74;;26109:201;-1:-1:-1;;;;;26356:1:1;26340:14;;;26336:22;26323:36;;-1:-1:-1;25281:1345:1:o;26631:302::-;26808:6;26797:9;26790:25;26851:2;26846;26835:9;26831:18;26824:30;26771:4;26871:56;26923:2;26912:9;26908:18;26900:6;26871:56;:::i;26938:248::-;27112:25;;;27168:2;27153:18;;27146:34;27100:2;27085:18;;26938:248::o;28455:343::-;-1:-1:-1;;;28702:3:1;28695:42;28677:3;28753:39;28788:2;28783:3;28779:12;28771:6;28753:39;:::i;29509:346::-;29711:2;29693:21;;;29750:2;29730:18;;;29723:30;-1:-1:-1;;;29784:2:1;29769:18;;29762:52;29846:2;29831:18;;29509:346::o;29860:351::-;30062:2;30044:21;;;30101:2;30081:18;;;30074:30;-1:-1:-1;;;30135:2:1;30120:18;;30113:57;30202:2;30187:18;;29860:351::o;30216:343::-;30418:2;30400:21;;;30457:2;30437:18;;;30430:30;-1:-1:-1;;;30491:2:1;30476:18;;30469:49;30550:2;30535:18;;30216:343::o;30564:407::-;30766:2;30748:21;;;30805:2;30785:18;;;30778:30;30844:34;30839:2;30824:18;;30817:62;-1:-1:-1;;;30910:2:1;30895:18;;30888:41;30961:3;30946:19;;30564:407::o;30976:416::-;31178:2;31160:21;;;31217:2;31197:18;;;31190:30;31256:34;31251:2;31236:18;;31229:62;-1:-1:-1;;;31322:2:1;31307:18;;31300:50;31382:3;31367:19;;30976:416::o;31397:397::-;31599:2;31581:21;;;31638:2;31618:18;;;31611:30;31677:34;31672:2;31657:18;;31650:62;-1:-1:-1;;;31743:2:1;31728:18;;31721:31;31784:3;31769:19;;31397:397::o;32052:404::-;32254:2;32236:21;;;32293:2;32273:18;;;32266:30;32332:34;32327:2;32312:18;;32305:62;-1:-1:-1;;;32398:2:1;32383:18;;32376:38;32446:3;32431:19;;32052:404::o;32461:401::-;32663:2;32645:21;;;32702:2;32682:18;;;32675:30;32741:34;32736:2;32721:18;;32714:62;-1:-1:-1;;;32807:2:1;32792:18;;32785:35;32852:3;32837:19;;32461:401::o;32867:406::-;33069:2;33051:21;;;33108:2;33088:18;;;33081:30;33147:34;33142:2;33127:18;;33120:62;-1:-1:-1;;;33213:2:1;33198:18;;33191:40;33263:3;33248:19;;32867:406::o;33278:465::-;33535:2;33524:9;33517:21;33498:4;33561:56;33613:2;33602:9;33598:18;33590:6;33561:56;:::i;:::-;33665:9;33657:6;33653:22;33648:2;33637:9;33633:18;33626:50;33693:44;33730:6;33722;33693:44;:::i;:::-;33685:52;33278:465;-1:-1:-1;;;;;33278:465:1:o;33748:184::-;33818:6;33871:2;33859:9;33850:7;33846:23;33842:32;33839:52;;;33887:1;33884;33877:12;33839:52;-1:-1:-1;33910:16:1;;33748:184;-1:-1:-1;33748:184:1:o;35842:399::-;36044:2;36026:21;;;36083:2;36063:18;;;36056:30;36122:34;36117:2;36102:18;;36095:62;-1:-1:-1;;;36188:2:1;36173:18;;36166:33;36231:3;36216:19;;35842:399::o;36246:412::-;36448:2;36430:21;;;36487:2;36467:18;;;36460:30;36526:34;36521:2;36506:18;;36499:62;-1:-1:-1;;;36592:2:1;36577:18;;36570:46;36648:3;36633:19;;36246:412::o;36663:400::-;36865:2;36847:21;;;36904:2;36884:18;;;36877:30;36943:34;36938:2;36923:18;;36916:62;-1:-1:-1;;;37009:2:1;36994:18;;36987:34;37053:3;37038:19;;36663:400::o;37068:399::-;37270:2;37252:21;;;37309:2;37289:18;;;37282:30;37348:34;37343:2;37328:18;;37321:62;-1:-1:-1;;;37414:2:1;37399:18;;37392:33;37457:3;37442:19;;37068:399::o;37472:407::-;37674:2;37656:21;;;37713:2;37693:18;;;37686:30;37752:34;37747:2;37732:18;;37725:62;-1:-1:-1;;;37818:2:1;37803:18;;37796:41;37869:3;37854:19;;37472:407::o;37884:168::-;37957:9;;;37988;;38005:15;;;37999:22;;37985:37;37975:71;;38026:18;;:::i;38057:136::-;38096:3;38124:5;38114:39;;38133:18;;:::i;:::-;-1:-1:-1;;;38169:18:1;;38057:136::o;38559:127::-;38620:10;38615:3;38611:20;38608:1;38601:31;38651:4;38648:1;38641:15;38675:4;38672:1;38665:15;39101:962;39210:4;39239:2;39268;39257:9;39250:21;39291:1;39324:6;39318:13;39354:36;39380:9;39354:36;:::i;:::-;39426:6;39421:2;39410:9;39406:18;39399:34;39452:2;39473:1;39505;39494:9;39490:17;39521:1;39516:158;;;;39688:1;39683:354;;;;39483:554;;39516:158;39583:3;39579:8;39568:9;39564:24;39559:2;39548:9;39544:18;39537:52;39661:2;39649:6;39642:14;39635:22;39632:1;39628:30;39617:9;39613:46;39609:55;39602:62;;39516:158;;39683:354;39714:6;39711:1;39704:17;39762:2;39759:1;39749:16;39787:1;39801:180;39815:6;39812:1;39809:13;39801:180;;;39908:14;;39884:17;;;39880:26;;39873:50;39951:16;;;;39830:10;;39801:180;;;40005:17;;40024:2;40001:26;;-1:-1:-1;;39483:554:1;-1:-1:-1;40054:3:1;;39101:962;-1:-1:-1;;;;;;;;39101:962:1:o;40478:572::-;-1:-1:-1;;;;;40775:15:1;;;40757:34;;40827:15;;40822:2;40807:18;;40800:43;40874:2;40859:18;;40852:34;;;40917:2;40902:18;;40895:34;;;40737:3;40960;40945:19;;40938:32;;;40700:4;;40987:57;;41024:19;;41016:6;40987:57;:::i;41055:249::-;41124:6;41177:2;41165:9;41156:7;41152:23;41148:32;41145:52;;;41193:1;41190;41183:12;41145:52;41225:9;41219:16;41244:30;41268:5;41244:30;:::i;41309:179::-;41344:3;41386:1;41368:16;41365:23;41362:120;;;41432:1;41429;41426;41411:23;-1:-1:-1;41469:1:1;41463:8;41458:3;41454:18;41309:179;:::o;41493:671::-;41532:3;41574:4;41556:16;41553:26;41550:39;;;41493:671;:::o;41550:39::-;41616:2;41610:9;-1:-1:-1;;41681:16:1;41677:25;;41674:1;41610:9;41653:50;41726:11;;41756:16;-1:-1:-1;;;;;41824:14:1;;;41855:4;41843:17;;41840:25;-1:-1:-1;41821:45:1;41818:58;;;41869:5;;;;;41493:671;:::o;41818:58::-;41906:6;41900:4;41896:17;41885:28;;41942:3;41936:10;41969:2;41961:6;41958:14;41955:27;;;41975:5;;;;;;41493:671;:::o;41955:27::-;42059:2;42040:16;42034:4;42030:27;42026:36;42019:4;42010:6;42005:3;42001:16;41997:27;41994:69;41991:82;;;42066:5;;;;;;41493:671;:::o;41991:82::-;42082:57;42133:4;42124:6;42116;42112:19;42108:30;42102:4;42082:57;:::i;:::-;-1:-1:-1;42155:3:1;;41493:671;-1:-1:-1;;;;;41493:671:1:o;42601:415::-;42803:2;42785:21;;;42842:2;42822:18;;;42815:30;42881:34;42876:2;42861:18;;42854:62;-1:-1:-1;;;42947:2:1;42932:18;;42925:49;43006:3;42991:19;;42601:415::o;43021:838::-;-1:-1:-1;;;;;43418:15:1;;;43400:34;;43470:15;;43465:2;43450:18;;43443:43;43380:3;43517:2;43502:18;;43495:31;;;43343:4;;43549:57;;43586:19;;43578:6;43549:57;:::i;:::-;43654:9;43646:6;43642:22;43637:2;43626:9;43622:18;43615:50;43688:44;43725:6;43717;43688:44;:::i;:::-;43674:58;;43781:9;43773:6;43769:22;43763:3;43752:9;43748:19;43741:51;43809:44;43846:6;43838;43809:44;:::i;:::-;43801:52;43021:838;-1:-1:-1;;;;;;;;43021:838:1:o
Swarm Source
ipfs://2f9df4bdf9c0045ae5cee986cdf23687f5dff5b0035456544c781b8405e92562
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.