ERC-721
Overview
Max Total Supply
1,024 oraand
Holders
301
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 oraandLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ORAAND
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-22 */ /********************************************************************************************************** ___ ___ ___ ___ ___ _____ / /\ / /\ / /\ / /\ /__/\ / /::\ / /::\ / /::\ / /::\ / /::\ \ \:\ / /:/\:\ / /:/\:\ / /:/\:\ / /:/\:\ / /:/\:\ \ \:\ / /:/ \:\ / /:/ \:\ / /:/~/:/ / /:/~/::\ / /:/~/::\ _____\__\:\ /__/:/ \__\:| /__/:/ \__\:\ /__/:/ /:/___ /__/:/ /:/\:\ /__/:/ /:/\:\ /__/::::::::\ \ \:\ / /:/ \ \:\ / /:/ \ \:\/:::::/ \ \:\/:/__\/ \ \:\/:/__\/ \ \:\~~\~~\/ \ \:\ /:/ \ \:\ /:/ \ \::/~~~~ \ \::/ \ \::/ \ \:\ \ \:\/:/ \ \:\/:/ \ \:\ \ \:\ \ \:\ \ \:\ \ \::/ \ \::/ \ \:\ \ \:\ \ \:\ \ \:\ \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ To obtain a Base64 encoded version of a Token's PRG you can call the function: function getTokenPRGBase64(uint256 tokenId, bool pal, uint8 filterResonanceRouting, uint8 filterModeVolume) where: tokenId - the id of the token pal - true for a pal version, false for ntsc filterResonanceRouting - 0 for default, otherwise a byte value in the format the SID register $d417 expects: bit 0: set to 1 to filter voice 1 bit 1: set to 1 to filter voice 2 bit 2: set to 1 to filter voice 3 bit 3: set to 1 to filter external voice (not used) bits 4-7: filter resonance (0-15) filterModeVolume - 0 for default, otherwise a byte value in the format the SID register $d418 expects: bits 0-3: volume (0-15) bit 4: set to 1 to enable the low pass filter bit 5: set to 1 to enable the band pass filter bit 6: set to 1 to enable the high pass filter bit 7: set to 1 to disable voice 3 The filters in some older model C64s may produce excessive distortion. If you intend to run the PRG on one of these models, a value of 240 for filterResonanceRouting may produce a better output than the default value. **********************************************************************************************************/ // File: @openzeppelin/[email protected]/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_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) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev 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); } } // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/[email protected]/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/[email protected]/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @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, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: oraand.sol pragma solidity ^0.8.4; interface IOraandURI { function tokenURI(IOraandPRGToken tokenContract, uint256 tokenId) external view returns (string memory); } interface IOraandPRGToken { function getTokenPRGBase64(uint256 tokenId, bool patchedVersion) external view returns (string memory); function getTokenPRG(uint256 tokenId, bool pal, uint8 filterResonanceRouting, uint8 filterModeVolume) external view returns (bytes memory); function getTokenPatchedPRG(uint256 tokenId, bool pal, uint8 filterResonanceRouting, uint8 filterModeVolume) external view returns (bytes memory); function getTokenAttributes(uint256 tokenId) external view returns (string memory); function getTokenParams(uint256 tokenId) external view returns (uint64); function getTokenModes(uint256 tokenId) external view returns (uint8); function getTokenPatchUnlocked(uint256 tokenId) external view returns (bool); } // ORAAND contract contract ORAAND is ERC721, ERC721Enumerable, Ownable, IOraandPRGToken { using Strings for uint256; string constant tokenName = "oraand"; string constant tokenSymbol = "oraand"; string private description = "2048 byte on chain PRG for the Commodore 64"; uint256 constant MAX_NUMBER_TOKENS = 1024; uint256 public mintPrice = .0256e18; uint256 constant DAY_SECONDS = 24 * 60 * 60; string private imageBaseURI = "https://nopsta.com/oraand/i/"; string private animationBaseURI = "https://nopsta.com/oraand/v/"; string private externalBaseURI = "https://nopsta.com/oraand/"; bytes constant basePRGData = hex"01080b0800009e323036320000000078a9358501a97f8d0ddc8d0dddad0ddcad0ddda92c8dfaffa90a8dfbffa9018d1ad0a9188d11d0a9ff8dfeffa9098dffffa2fd8e12d0a9009d00309dfc309df93195019dff1fa9089dffd79dfcd89df9d99deadabdbe0c9d0f20bdf60c9d2723cad0d3a93c855ba9e88d18d0a0b4a9038560a9008556b9f20b8848293f9d0070e86829c005564a4a8556c660d0e89d0070e898d0d920c70fa2208e30348666a2488665a7b88d003418bd003469089d0134bd303469009d3134e8e02ed0eaa438be0070bd003485618567bd30348562a9238568be2270bd00348563bd30348564a007b16749ff3163116191658810f3a908a26520f309e638a538c922d0c0a900856c20e20aa203a9ec8dff59a9008d3f5abdcf0a8d3f0a8d500a8d580abdd50a8d440abdd60a8d560abdd40a8596bdd30a8597bdda0a8598bdde0a85998656a22b869ba2fe869da000a201a599202d0ae8e009d0f8a6978696a219869ba202869da207202d0acad0faa656ca1099a9008d20d08d21d0a91f8588a9f4858758af00dcc52ff03b852f2904d002e6578a2908d002c6578a2901d008a558c908f002e6588a2902d006a558f002c6588a2910d00fe66ca56cc9043004a900856c20e20aa66cf01abdec0b8deb09bdef0b8dec09a56ddda80c3007a900856d20b50a20f20a4c8d0918750095009002f601a69e60488a489848a9ff8d19d0204a0de66da55ef014a55b855d4904855bad18d049108d18d0a900855e68a868aa684040869c186596484818a59b659d859b859a68990050481869ffc01d1006e49cd002a9ff99005168481869f8990052681865984818b9ff59659a99005ab93f5a690099405aa902859a68c8cad0c568a69c60ada70cf0030a9002492d8da70c60a9308551a9008550a9408537a000b1508556a007b350a556915086568810f5a908a25020f309c637d0e260c66e3002d004a908856e6018a5586901c909d002a900855860004080c00108fff80108fff90907f7f8084737a9088558a964856da900856e20470d60a55ef002ea60a55b8551a204a000988550915088d0fbe651cad0f1a5572903aabdcf0a8d610b8d770b8d840ba558d003e65e608536a9008554a9308555a93e8530a55b8531a56ef004c536d003205b0b38a530e9288530b002c631a940a25420f309c636d0dfe65e60a200eaeaeabc0050b154f07a18bd005a65308550bd405a65318551bc0051b154c0ffd002a9008533bc0052b15485328660a000b350bd4470e000f00ac909d006a633f002a9019150c8b350bd6f70e000f00ac90fd006a632f002a9019150a028b150f006a903a633d002a9029150c8a9049150a050b350bd9a709150c8b350bdc5709150a660e8e040f0034c5d0b6000070ec1b68b0a0a0aa11fa0088808a1209f5ddc9f5fdfe2a11e5e5ee0de08880808881f48dd9c48c82a8787595a98ea999959a99b9a5897564747470747d9589b1a5987075796150752d2a79414536828a853e75212d25212925352114f13145111515206d14f0f062666a3a625e48e0ece0ece8ea4664d25e44d8d0ccc0ecd0c0a89ce0cc5490a85c55cdf5d5695535550c704428b088584020dc80544c10786030107870645850548480888080787070747c70646860645850545457500280a05000a0a0560500a145028141ea05050220000328000e000f800fe008000e000f800fe000103070f1f3f7fff00000000000000000000000000000000ff003f000f000300fffefcf8f0e0c0800103070f1f3f7fff80c0e0f0f8fcfeffff7f3f1f0f070301fffefcf8f0e0c0802d435a7c5285a95a5a85b4f7a30a52b45a85b4f7a30a52b402030405070603040406080a0e0d07080406080a0e0d07084c7a0fa528d00aa52ba28520f3094c680d38a585e52b8585b007c686100320bd0fc629d00dc62ad009a5284901852820b40fc6241004a94f8524a202a524d007d60fd00320670ebcea0b18b970007509997000b97100750c997100b574c951f03cb5b9d01a18b972007db00c997200900eb973006900290fd002f6b9997300b5b9f01a38b97200fdb00c997200b00eb97300e900290fd002d6b9997300d612d015b506f011b9740049019974004ab5069002b5039512b515f032d615d02eb51ef005d6184c100ef618b51818862d351b7521aab97400c981f00cbd170d997000bd2f0d997100a62db5259515ca30034c830da218b5709d00d4ca10f860100804010707070fa0a0a00a140000000808020032001e0014b4321111418161dddebfbd440ea46cd0010a950fb9b70c852b207d0a39480e0903951b207d0a39470e79530e29079521207d0a2901951ea903855fb9ac0c9525c001d004a9288526c908d002065fa55f95039512207d0ad95b0ea900b002a9029506f612a9019515a941bcea0b997400a46ce002d01a207d0ad9bb0ca900b00e207d0ac920b004a9158582207d0a850e207d0ad9570eb008a9518574a9018573b9b30c859fe000d02d20bd0fc003d0268609207d0ac932b01d290385098625207d0ac932a981b002a9158574861ba55f8503a9028506207d0ad9590eb006a9008523851d98d035bcea0ba911997400e002d00b207d0a2903a8b95f0e8582a92895039512a9789506f612207d0a2907a8b94c0e9525207d0a2901850a60a9018524a214a9009503e0031029bcea0ba56cd010bd650e997500bd620e090d997600d00ba911997500bd620e997600967320670ef60fca10cca9648529a901852a60a59f8586a9008528f0eda9308551a207a03fe007f004b14ef00c207d0addf70fb004a90191508810e9a551854f18a550854e694085509002e651ca10d3603c648cdc"; uint constant FILTERRESONANCEROUTINGPOSITION = 0x18a; uint constant FILTERMODEVOLUMEPOSITION = 0x186; // prg data 1 uint constant PRGDATA1SEGMENTLENGTH = 56; uint constant PRGDATA1POSITION = 0x7c8; bytes constant prgData1 = hex"a9308551a207a03feea70c207d0addf20fb004a90191508810eea551854f869ea940a25020f309ca10dc60080e141e3250648c0000000000207d0a293f692ec9549008a2088eab0c8eaf0c85a0a9308551a207a03f207d0ac5a0b004a90191508810f2869ea940a25020f309ca10e460a9a085a0207d0a2907855f29fdd002e65fa9308551a207a03f207d0ac5a0b004a90191503898e55fa810ee869ea940a25020f309ca10e060"; // prg data 2 uint constant PRGDATA2SEGMENTLENGTH = 239; uint constant PRGDATA2POSITION = 0x711; bytes constant prgData2 = hex"207d0a297fc90ab002690a85a0a9308551a9008550a207a03f207d0ac5a0b004a90191508810f2869ea940a25020f309ca10e4a907859ca003a207bd00309d3830ca10f7a9084820ef0f6838ad4f0fe9088d4f0f8810e2a92020ef0f18ad4f0f69608d4f0f9003ee500fc69c10c9a940859ca003a204b900309d0030e88810f618ad870f69088d870f9003ee880f18ad8a0f69088d8a0f9003ee8b0fc69cd0d2207d0a9031a204a0308451c8844fa9008550a9c0854ea03fb150914e8810f9869ea940a25020f30938a54ee940854eb002c64fcad0e0a9088dab0c8daf0c60186d4c0f8d4c0f9003ee4d0f60000000207d0a290785b4207d0a2907690e859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aa207d0aa59c2903a8b9dc0f855f20e00fc69cd0c9a907859ca003a207bd00309d3830ca10f7a9084820cf0f6838ad650fe9088d650f8810e2a92020cf0f18ad650f69608d650f9003ee660fc69c10c9a940859ca003a204b900309d0030e88810f618ad9d0f69088d9d0f9003ee9e0f18ada00f69088da00f9003eea10fc69cd0d2a9088dab0c8daf0c60186d620f8d620f9003ee630f6000010840a000a9019150869ea55fa25020f309ca10f060000000000000000000000000207d0a290785b4207d0a2907690e859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aa207d0aa59c2903a8b9dc0f855f20e00fc69cd0c9a907859ca003a207bd00309d3830ca10f7a9084820cf0f6838ad650fe9088d650f8810e2a92020cf0f18ad650f69608d650f9003ee660fc69c10c9a940859ca003a204b900309d0030e88810f618ad9d0f69088d9d0f9003ee9e0f18ada00f69088da00f9003eea10fc69cd0d2a9088dab0c8daf0c60186d620f8d620f9003ee630f60000105bda000a9019150869ea55fa25020f309ca10f060000000000000000000000000207d0a290f69028de00fa90f85b4207d0a29076906859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aaa59c2901a8b9e00f855f20e40fc69cd0cca907859ca003a207bd00309d3830ca10f7a9084820d30f6838ad690fe9088d690f8810e2a92020d30f18ad690f69608d690f9003ee6a0fc69c10c9a940859ca003a204b900309d0030e88810f618ada10f69088da10f9003eea20f18ada40f69088da40f9003eea50fc69cd0d2a9088dab0c8daf0c60186d660f8d660f9003ee670f6000010840a000a9019150869eade00fa25020f309ca10ef6000000000000000"; // prg data 3 uint constant PRGDATA3LENGTH = 457; uint constant PRGDATA3POSITION = 0x548; bytes constant prgData3 = hex"4c740ea46cc624c6a9d00aa98085a9a52849018528a528d00aa5aca28520f3094c750d38a585e5ac8585b002c68618a57f65bc857fc4cff004a524d02da5a739620ed026207d0ad9bb0ca900b003207d0a85bca524d013207d0ac964290885cfb9540eb003b9580e85ada20286a818a5a73d650e6524d005207d0a95b5bcea0bb97400c951f039b5b9d01a18b972007db00c997200900eb973006900290fd002f6b9997300b5b9f01a38b97200fdb00c997200b00eb97300e900290fd002d6b9997300a524d01db51829071875b5f618aabd0060997000bd0061997100a6a8b5ad997400a524d5a1d008b9740029fe997400ca30034cb30da524d006a5aa8524e6a7a218b5709d00d4ca10f8601141414115514151899cdd8689d9031f0f1f3f7f6e8c6e0208080c0c04080a0fa200207d0a291fc91810f7a8b9170dc5b3f0ef85b39d0060b92f0d9d0061cad0e1a214a900950385a7e0031053207d0a9518a94195ada46cb9ac0c85aabcea0b9673a910997500bd5f0e997600a56cd018a9ff85aaa91195ada9f0997500bd5c0e997600bd680ed015c901d005bd6b0ed00cc902d005bd6e0ed003bd710e95a1ca10a0a901852485a98528a46ca9788585b9b30c8586b9b70c85ac60"; // prg data 4 uint constant PRGDATA4LENGTH = 457; uint constant PRGDATA4POSITION = 0x548; bytes constant prgData4 = hex"4c7b0ea200d00ffe00d8fe00d9fe00dafe00dbcad0f1a46cc003d004a915d00e6674e6bda5bd29036900aabd6f0e8574c624c6a9d007a98085a920010fa5aca28520f30918a57f65bc857fc000f004a524d016a5a7395d0ed00f207d0ad9bb0ca900b003207d0a85bc207d0ac964b94f0eb003b9530e85ada20286a818a5a73d600e6524d005207d0a95b5bcea0b38b97000e906997000b00fb97100e900997100b005a90099710018b972007db00c997200b973006900997300a524d023a46cb51839770ebcea0b1875b5f618aabd0060997000bd0061997100a6a8b5ad997400a524d5a1d005a920997400ca108ba524d006a5aa8524e6a7a901857aa218b5709d00d4ca10f8604141414115514151ed98fae698fa031f0f1f3f7f648c6e010303070704080a0f5020508000070a0807000307a200207d0a291fc91810f7a8b9170dc5b3f0ef85b39d0060b92f0d9d0061cad0e1a214a900950385a7e003104e207d0a9518a94195ada46cb9730e85aabcea0b9673a910997500bd5a0e997600a56cd013a90a85aaa94195adbd570e997600bd630ed015c901d005bd660ed00cc902d005bd690ed003bd6c0e95a1ca10a5a901852485a98528a46cb9b30c8586b9b70c85ac60a930"; // prg data 5 uint constant PRGDATA5POSITION = 0x518; uint constant PRGDATA5SEGMENTLENGTH = 24; bytes constant prgData5 = hex"1727394b5f748aa1bad4f00e2d4e7196bee8144374a9e11c5a9ce22d7ccf2885e852c137b439c55af79e4f0ad1a3826e68718ab3ee3c9e15a24604dcd0e21467dd793c29448d08b8a1c528cdbaf17853871a10710c1c2d3f52667b92aac3defa18385a7ea4ccf7245486bcf53171b5fc4898ee48a90d79ea62e26af89030dc90521af2d4c4c4d4f02060b820a434e4a88888a8e040c070404868c850101050c08080e08090d090a0"; // prg data 6 uint constant PRGDATA6POSITION = 0x530; bytes constant prgData6 = hex"0101010101010101010101020202020202020303030303040404040505050606060707080809090a0a0b0c0d0d0e0f10111213141517181a1b1d1f20222427292b2e3134373a3e4145494e52575c62686e757c83010101010101010101010101020202020202020303030303040404040505050606070707080809090a0b0b0c0d0e0e0f10111213151617191a1c1d1f212325272a2c2f3235383b3f43474b4f54595e646a70777e"; // prg data 7 uint constant PRGDATA7POSITION = 0x56; bytes constant prgData7 = hex"000b0b0402060d010a0c0b06060e000f000f0f010b0d01000607000f000b0e06"; // prg data 8 uint constant PRGDATA8POSITION = 0x17e; bytes constant prgData8 = hex"010f000101010506020b0c0e0e060f0b0f0b0004010002070302030b010f060e"; // prg data 9 uint constant PRGDATA9POSITION = 0x287; bytes constant prgData9 = hex"1d2b2d4d5f63656971878da9c3cfe7f5"; // prg data 10 uint constant PRGDATA10SEGMENTLENGTH = 3; uint constant PRGDATA10POSITION = 0x4b1; bytes constant prgData10 = hex"08000014000a14005014281478785050505060500a020408"; // increment prob // length 16 uint constant PRGDATA11SEGMENTLENGTH = 4; uint constant PRGDATA11POSITION = 0x4bc; // prg data 11 bytes constant prgData11 = hex"320000141400001e0a00001420000020"; // prg data 12 uint constant PRGDATA12SEGMENTLENGTH = 4; uint constant PRGDATA12POSITION = 0x4b8; bytes constant prgData12 = hex"1ea05050325050a0"; // prg data 13 uint constant PRGDATA13SEGMENTLENGTH = 56; uint constant PRGDATA13POSITION = 0x4c0; bytes constant prgData13 = hex"8000e000f800fe008000e000f800fe000102070a1f2a7faa00000000000000000000000000000000ff003f000f000300ffaafca8f0a0c08080c0a0908884828180c0a0908884828101030509112141810102040810204080804020100804020181412111090503018182848890a0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103070f1f3f7fff00000000000000000000000000000000ff7f3f1f0f070301fffefcf8f0e0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103050911214181010204081020408080402010080402017f3f1f0f07030100010204081020408020104864524944422010486452494442040812264a922242000001020408102000008040201008044222120a06020000424448506040000080402090c8e4723980402090c8e472390102040913274e9c010204081020408080402010080402019c4e2713090402013972e4c8902040808040209048a452298040209048a452290102040912254a9401020408102040808040201008040201944a2512090402012952a4489020408080c0e0b0988c868380c0e0b0988c86830103070d193161c101020408102040808040201008040201c16131190d07030183868c98b0e0c08080c0e0b0d8acd6ab80c0e0b0d8acd6ab0103070d1b356bd501020408102040808040201008040201d56b351b0d070301abd6acd8b0e0c08080c0a0908884c2a180402010088442210102050b162d5bb70102040810204080804020100804020190482412090402016fdebc78f0e0c08080c0a09098a4c28180c0a09098a4c28101030509192543810102040810204080804020100804020181412111090503018182848890a0c08080c0a09088a492a980402010082412290103070f1d3b75eb01020408102040808040201008040201944a241208040201d7aedcb8f0e0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103070f1f3f7fff01020408102040808040201008040201ff7f3f1f0f070301fffefcf8f0e0c0808000200088002200800020008800220000000200080022000000000000000000000000000000000088002200080002008800200080000000804020904824924980402090482492490102050b162d5bb60102040810204080804020100804020192492412090402016ddab468d0a0408000c000f000fc00ff00c000f000fc00ff0103050e173b5dee00000000000000000000000000000000007f001f0007000177badce870a0c0808000a000a800aa008000a000a800aa000102070a1f2a7faa00000000000000000000000000000000aa002a000a000200ffaafca8f0a0c08080c0a0d0a8d4aad58040a050a854aa550103070f1f3f7fff01020408102040808040201008040201aa552a150a050201fffefcf8f0e0c08080c0a09088c4a29180402010884422110103070f1e3d7bf7010204081020408080402010080402018844221108040201efdebc78f0e0c0808040209048a452298040209048a452290102050b162d5bb601020408102040808040201008040201944a2512090402016ddab468d0a04080804020100804020180402010080402010102040810204080010204081020408080402010080402018040201008040201010204081020408080402090c864b2d980402090c864b2d90102040913264d9b01020408102040808040201008040201ec763b1d0e070301376edcb870e0c0808000e000f800fe008000e000f800fe00010007001f007f0000000000000000000000000000000000ff003f000f000300ff00fc00f000c0008040a050a854aa558040a050a854aa55000102050a152a5500000000000000000000000000000000aa552a150a050201aa54a850a04080008040201088442211804020108844221101020408112244880102040810204080804020100804020188442211080402011122448810204080000080002000880000008000200088000101040613194c660000000000000000000000000000000022000800020000003398cc603080c000000080402010884400008040201088440101040613194c660000000000000000000000000000000022110804020100003398cc603080c0008000a000a800aa008000a000a800aa00000002000a002a0000000000000000000000000000000000aa002a000a000200aa00a800a000800080c0a0908884828180402010080402010103070f1f3f7fff010204081020408080402010080402018040201008040201fefcf8f0e0c08000008000a000a800aa008000a000a800aa0102050a152a55aa00000000000000000000000000000000002a000a0002000055aa54a850a040808040a050a854aa558040a050a854aa550103070f1f3f7fff01020408102040808040201008040201aa552a150a050201fffefcf8f0e0c080"; // prg data 14 bytes constant prgData14 = hex"0c13181f22181618181f242b2e242224181f242b2e2422240c13181c211f1518181f24282d2b2124181f24282d2b21240c13181b221f1618181f24272e2b2224181f24272e2b22240c13181c231f1718181f24282f2b2324181f24282f2b23240c13181c231f1718181f24282f2b2324302b24283b3723300c13181c221f1618181f24282e2b2224302b24283a3722300c12181b221e1618181e24272e2a2224302a24273a3622300c12181b211e1518181e24272d2a2124302a243339362130"; // prg data 15 uint constant PRGDATA15LENGTH = 4; uint constant PRGDATA15POSITION = 0x4a9; bytes constant prgData15 = hex"00300C06"; // prg data 16 uint constant PRGDATA16POSITION = 0x4ad; bytes constant prgData16 = hex"000C0C06"; // prg data 17 uint constant PRGDATA17POSITION = 0x64d; bytes constant prgData17 = hex"c0c0c00c18"; // patch data 1 uint constant PATCHDATA1LENGTH = 13; uint constant PATCHDATA1POSITION = 0x2c2; bytes constant patchData1 = hex"18ad18d06902290e09e08d18d0"; // patch data 2 uint constant PATCHDATA2LENGTH = 6; uint constant PATCHDATA2POSITION = 0x2b7; bytes constant patchData2 = hex"a9e88d18d060"; // patch data 3 uint constant PATCHDATA3LENGTH = 8; uint constant PATCHDATA3POSITION = 0x2a0; bytes constant patchData3 = hex"207d0a29019150ea"; // patch data 4 uint constant PATCHDATA4LENGTH = 13; uint constant PATCHDATA4POSITION = 0x28c; bytes constant patchData4 = hex"207d0a8d0020207d0a8d042060"; // patch data 5 uint constant PATCHDATA5LENGTH = 6; uint constant PATCHDATA5POSITION1 = 0x2f3; uint constant PATCHDATA5POSITION2 = 0x33a; bytes constant patchData5 = hex"ee21d0ee20d0"; // TokenData has the values specific to each token struct TokenData { uint64 params; uint8 modes; uint8 defaultMode; bool patchUnlocked; uint256 lastTransfer; } // mapping of tokenIds to the token's data mapping(uint256 => TokenData) tokenData; // the number of tokens minted uint256 _tokenIdCounter; IOraandURI public tokenURIContract; constructor() ERC721(tokenName, tokenSymbol) { } // ----------------------------- mint ----------------------------- // function mintToken() public payable returns (uint256) { require (_tokenIdCounter < MAX_NUMBER_TOKENS, "Mint over"); require (balanceOf(msg.sender) < 16, "Limit 16"); require (msg.value >= mintPrice, "Mint price"); uint256 tokenId = _tokenIdCounter; unchecked { _tokenIdCounter = _tokenIdCounter + 1; } _safeMint(msg.sender, tokenId); tokenData[tokenId].params = uint64(bytes8(keccak256(abi.encodePacked(block.timestamp, msg.sender, tokenId.toString())))); tokenData[tokenId].lastTransfer = block.timestamp; return tokenId; } // ---------------------- token information ----------------------- // function tokenURI(uint256 tokenId) override public view returns (string memory) { checkTokenId(tokenId); if (address(tokenURIContract) != address(0)) { return tokenURIContract.tokenURI(IOraandPRGToken(this), tokenId); } string memory tokenIdString = Strings.toString(tokenId); string memory json = base64Encode(bytes(string(abi.encodePacked( '{"name":"oraand ', tokenIdString, '","description":"', description, '",', getTokenURIs(tokenIdString), ',"attributes":', getTokenAttributes(tokenId), ',"prg":"data:application/x-c64-program;base64,', getTokenPRGBase64(tokenId, false), '"}' )))); return string(abi.encodePacked('data:application/json;base64,', json)); } function getTokenURIs(string memory tokenIdString) internal view returns (string memory) { string memory uriString = string(abi.encodePacked( '"image":"', imageBaseURI, tokenIdString, '.png","animation_url":"', animationBaseURI, tokenIdString, '","external_url":"', externalBaseURI, tokenIdString, '"' )); return uriString; } function getTokenAttributes(uint256 tokenId) override(IOraandPRGToken) public view returns (string memory) { checkTokenId(tokenId); uint8 param = uint8((tokenData[tokenId].params >> 8) & 0x1f); string memory patch = "No"; if(tokenData[tokenId].patchUnlocked) { patch = "Yes"; } return string( abi.encodePacked('[{"trait_type":"Type","value":"', Strings.toString(tokenData[tokenId].params & 7 ) ,'"},{"trait_type":"FG","value":"', Strings.toString(uint8(prgData7[param])) ,'"},{"trait_type":"BG","value":"', Strings.toString(uint8(prgData8[param])) ,'"}, {"trait_type":"Charset","value":"', Strings.toString((tokenData[tokenId].params >> 32) & 0x1f) ,'"},{"trait_type":"Modes","value":"', Strings.toString(tokenData[tokenId].modes), '"}, {"trait_type":"Patch","value":"',patch, '"}]' )); } function getTokenSecondsSinceLastTransfer(uint256 tokenId) external view returns (uint256) { checkTokenId(tokenId); return block.timestamp - tokenData[tokenId].lastTransfer; } function getTokenParams(uint256 tokenId) override(IOraandPRGToken) external view returns (uint64) { checkTokenId(tokenId); return tokenData[tokenId].params; } function getTokenModes(uint256 tokenId) override(IOraandPRGToken) external view returns (uint8) { checkTokenId(tokenId); return tokenData[tokenId].modes; } function getTokenPatchUnlocked(uint256 tokenId) override(IOraandPRGToken) external view returns (bool) { checkTokenId(tokenId); return tokenData[tokenId].patchUnlocked; } function getTokenPRGBase64(uint256 tokenId, bool patchedVersion) override(IOraandPRGToken) public view returns (string memory) { checkTokenId(tokenId); if (patchedVersion) { return getTokenPatchedPRGBase64(tokenId, true, 0, 0); } else { return getTokenPRGBase64(tokenId, true, 0, 0); } } function getTokenPRGBase64(uint256 tokenId, bool pal, uint8 filterResonanceRouting, uint8 filterModeVolume) public view returns (string memory) { return base64Encode(getTokenPRG(tokenId, pal, filterResonanceRouting, filterModeVolume)); } function getTokenPRG(uint256 tokenId, bool pal, uint8 filterResonanceRouting, uint8 filterModeVolume) override(IOraandPRGToken) public view returns (bytes memory) { checkTokenId(tokenId); bytes memory tokenPRG = basePRGData; unchecked { uint i; uint offset = 0; uint param = uint(tokenData[tokenId].params & 0x7); if (param > 0 && param < 4) { offset = uint((param - 1) * 56); for (i = 0; i < PRGDATA1SEGMENTLENGTH; i++) { tokenPRG[PRGDATA1POSITION + i] = prgData1[i + offset]; } } else if (param > 3) { offset = uint((param - 4) * 239); for (i = 0; i < PRGDATA2SEGMENTLENGTH; i++) { tokenPRG[PRGDATA2POSITION + i] = prgData2[i + offset]; } } if (param > 3) { for (i = 0; i < PRGDATA3LENGTH; i++) { tokenPRG[PRGDATA3POSITION + i] = prgData3[i]; } tokenPRG[0xa5] = bytes1(0x10); tokenPRG[0xa6] = bytes1(0x0f); } else { if ((tokenData[tokenId].params >> 3) & 0x1 > 0) { tokenPRG[0x651] = hex"0a"; } } if (filterResonanceRouting != 0) { tokenPRG[FILTERRESONANCEROUTINGPOSITION] = bytes1(filterResonanceRouting); } if (filterModeVolume != 0) { tokenPRG[FILTERMODEVOLUMEPOSITION] = bytes1(filterModeVolume); } offset = uint((tokenData[tokenId].params >> 16) & 0x7) * 24; uint noteOffset = uint((tokenData[tokenId].params >> 24) & 0xf); if (!pal) { noteOffset += 84; for (i = 0; i < PRGDATA15LENGTH; i++) { tokenPRG[PRGDATA15POSITION + i] = prgData15[i]; tokenPRG[PRGDATA16POSITION + i] = prgData16[i]; } if (param < 4) { for (i = 0; i < 4; i++) { tokenPRG[PRGDATA17POSITION + i] = prgData17[i]; } if ((tokenData[tokenId].params >> 3) & 0x1 > 0) { tokenPRG[0x651] = hex"0c"; } else { tokenPRG[0x651] = hex"18"; } tokenPRG[0x696] = hex"04"; tokenPRG[0x57f] = hex"5f"; tokenPRG[0x6ae] = hex"30"; tokenPRG[0x75d] = hex"30"; tokenPRG[0x763] = hex"90"; } } for (i = 0; i < PRGDATA5SEGMENTLENGTH; i++) { param = uint(uint8(prgData14[i + offset])) + noteOffset; tokenPRG[PRGDATA5POSITION + i] = prgData5[param]; tokenPRG[PRGDATA6POSITION + i] = prgData6[param]; } param = uint((tokenData[tokenId].params >> 8) & 0x1f); tokenPRG[PRGDATA8POSITION] = prgData8[param]; tokenPRG[PRGDATA7POSITION] = prgData7[param]; offset = uint((tokenData[tokenId].params >> 32) & 0x1f) * 56; if (offset < 1736) { for (i = 0; i < PRGDATA13SEGMENTLENGTH; i++) { tokenPRG[PRGDATA13POSITION + i] = prgData13[offset + i]; } } param = uint((tokenData[tokenId].params >> 40) & 0xff); tokenPRG[0xca7 - 0x7ff] = bytes1(uint8(param)); param = uint((tokenData[tokenId].params >> 48) & 0xf ); tokenPRG[PRGDATA9POSITION] = prgData9[param]; param = uint(((tokenData[tokenId].params >> 56) & 0x7) * 3); for (i = 0; i < PRGDATA10SEGMENTLENGTH; i++) { tokenPRG[PRGDATA10POSITION + i] = prgData10[i + param]; } param = uint(((tokenData[tokenId].params >> 59) & 0x3) * 4); for (i = 0; i < PRGDATA11SEGMENTLENGTH; i++) { tokenPRG[PRGDATA11POSITION + i] = prgData11[i + param]; } param = uint(((tokenData[tokenId].params >> 61) & 0x1) * 4); for (i = 0; i < PRGDATA12SEGMENTLENGTH; i++) { tokenPRG[PRGDATA12POSITION + i] = prgData12[i + param]; } tokenPRG[0x1c6] = bytes1(tokenData[tokenId].modes + 1); if (tokenData[tokenId].defaultMode != 0) { tokenPRG[0x10e] = bytes1(tokenData[tokenId].defaultMode); } } return tokenPRG; } // Returns the patched PRG as base64 encoded data, requires patch to be unlocked function getTokenPatchedPRGBase64(uint256 tokenId, bool pal, uint8 filterResonanceRouting, uint8 filterModeVolume) public view returns (string memory) { return base64Encode(getTokenPatchedPRG(tokenId, pal, filterResonanceRouting, filterModeVolume)); } // Returns the patched PRG as bytes, requires patch to be unlocked function getTokenPatchedPRG(uint256 tokenId, bool pal, uint8 filterResonanceRouting, uint8 filterModeVolume) override(IOraandPRGToken) public view returns (bytes memory) { checkTokenId( tokenId ); require (tokenData[tokenId].patchUnlocked, "Locked"); bytes memory tokenPRG = getTokenPRG(tokenId, pal, filterResonanceRouting, filterModeVolume); uint256 i = 0; unchecked { // apply patches for (i = 0; i < PRGDATA4LENGTH; i++) { tokenPRG[PRGDATA4POSITION + i] = prgData4[i]; } if (uint8((tokenData[tokenId].params >> 1) & 3) == 3) { tokenPRG[0x6ce] = hex"0f"; } if (!pal) { tokenPRG[0x6ce] = hex"0c"; tokenPRG[0x66d] = hex"0a"; tokenPRG[0x675] = hex"08"; tokenPRG[0x676] = hex"0c"; tokenPRG[0x677] = hex"0a"; } uint param = uint((tokenData[tokenId].params >> 2) & 7); if (param > 3) { tokenPRG[0x35e] = 0xee; tokenPRG[0x360] = 0xd0; if (param == 4) { tokenPRG[0x54d] = 0xd0; param = uint((tokenData[tokenId].params >> 7) & 0x2); tokenPRG[0x35f] = bytes1(0x16 + uint8(param)); } else if (param == 5) { tokenPRG[0x35f] = 0x21; } else if (param == 6) { tokenPRG[0x360] = 0x20; tokenPRG[0x35f] = 0x00; } else { tokenPRG[0x35f] = 0x16; } } else if (param == 3) { tokenPRG[0x330] = 0xa5; tokenPRG[0x331] = 0x70; // or other sid shado } else if (param == 2) { tokenPRG[0x347] = bytes1(uint8(tokenData[tokenId].params & 0xff)); } else if(param == 1) { if (uint((tokenData[tokenId].params) >> 6 & 1) == 0) { for (i = 0; i < PATCHDATA5LENGTH; i++) { tokenPRG[PATCHDATA5POSITION1 + i] = patchData5[i]; } } else { for (i = 0; i < PATCHDATA5LENGTH; i++) { tokenPRG[PATCHDATA5POSITION2 + i] = patchData5[i]; } } } else { tokenPRG[0x2ff] = 0xa4; tokenPRG[0x300] = 0x81; } if (((tokenData[tokenId].params >> 8) & 0xff) > 190) { tokenPRG[0x55] = 0x8a; tokenPRG[0x56] = 0xea; } if (((tokenData[tokenId].params >> 14) & 0xff) > 60) { for (i = 0; i < PATCHDATA1LENGTH; i++) { tokenPRG[PATCHDATA1POSITION + i] = patchData1[i]; } for(i = 0; i < PATCHDATA2LENGTH; i++) { tokenPRG[PATCHDATA2POSITION + i] = patchData2[i]; } } else { tokenPRG[0x304] = 0xea; tokenPRG[0x305] = 0xea; } if (((tokenData[tokenId].params >> 22) & 0xff) > 127) { for(i = 0; i < 8; i++) { tokenPRG[PATCHDATA3POSITION + i] = patchData3[i]; } } else { for(i = 0; i < 13; i++) { tokenPRG[PATCHDATA4POSITION + i] = patchData4[i]; } } } return tokenPRG; } // ------------------------ check criteria ------------------------ // // Check tokenId is less than the total number of tokens function checkTokenId(uint256 tokenId) public view { require (tokenId < _tokenIdCounter, "Invalid id"); } // Check tokenId is valid and sender is the owner of the token function checkIsTokenOwner(address sender, uint256 tokenId) public view { checkTokenId(tokenId); require (ERC721.ownerOf(tokenId) == sender, "Not owner"); } // Check tokenId is valid and the token has been held for the time requirement function checkHoldTime(address sender, uint256 tokenId, uint256 timeRequirement) public view { checkIsTokenOwner(sender, tokenId); string memory message = string(abi.encodePacked("Req time ", timeRequirement.toString())); require ((block.timestamp - tokenData[tokenId].lastTransfer) >= timeRequirement, message); } // Check if modes can be unlocked function checkCanUnlockModes(address sender, uint256 tokenId, uint8 modes) public view { require (modes < 4, "Invalid"); uint256[4] memory timeReq = [0, 8 * DAY_SECONDS, 16 * DAY_SECONDS, 32 * DAY_SECONDS]; uint256 timeRequirement = timeReq[modes]; checkHoldTime(sender, tokenId, timeRequirement); } // Check if meet requirements to unlock the patch (held for 64 days) function checkCanUnlockPatch(address sender, uint256 tokenId) public view { uint256 timeRequirement = 64 * DAY_SECONDS; checkHoldTime(sender, tokenId, timeRequirement); } // ------------------------ token modify ------------------------- // // Set the maximum mode for the token function unlockModes(uint256 tokenId, uint8 modes) external { checkCanUnlockModes(msg.sender, tokenId, modes); tokenData[tokenId].modes = modes; } // Set the default mode for the token function setDefaultMode(uint256 tokenId, uint8 defaultMode) external { checkIsTokenOwner(msg.sender, tokenId); require (defaultMode <= tokenData[tokenId].modes, "Locked"); tokenData[tokenId].defaultMode = defaultMode; } // Unlock the patch function unlockPatch(uint256 tokenId) external { checkCanUnlockPatch(msg.sender, tokenId); tokenData[tokenId].patchUnlocked = true; } // --------------- ERC721, ERC721Enumerable overrides --------------// function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface( interfaceId ); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); if (tokenId < _tokenIdCounter) { tokenData[tokenId].lastTransfer = block.timestamp; } } // ------------------------ contract owner ------------------------ // function setMintPrice(uint256 price) external Ownable.onlyOwner { mintPrice = price; } function withdraw(uint256 amount) external Ownable.onlyOwner { require (amount <= address(this).balance, "Amt"); payable(msg.sender).transfer(amount); } function setImageBaseURI(string memory baseURI) //, string memory extension ) external Ownable.onlyOwner { imageBaseURI = baseURI; } function setAnimationBaseURI(string memory baseURI) //, string memory extension ) external Ownable.onlyOwner { animationBaseURI = baseURI; } function setExternalBaseURI(string memory baseURI) external Ownable.onlyOwner { externalBaseURI = baseURI; } function setDescription(string memory desc) external Ownable.onlyOwner { description = desc; } function setTokenURIContract(IOraandURI uriContract) external onlyOwner { tokenURIContract = uriContract; } // ---------------------------- base64 ---------------------------- // // From OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) - MIT Licence // @dev Base64 Encoding/Decoding Table string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; //@dev Converts a `bytes` to its Bytes64 `string` representation. function base64Encode(bytes memory data) internal pure returns (string memory) { // Inspired by Brecht Devos (Brechtpd) implementation - MIT licence // https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); /// @solidity memory-safe-assembly assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"modes","type":"uint8"}],"name":"checkCanUnlockModes","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"checkCanUnlockPatch","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"timeRequirement","type":"uint256"}],"name":"checkHoldTime","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"checkIsTokenOwner","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"checkTokenId","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenAttributes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenModes","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"pal","type":"bool"},{"internalType":"uint8","name":"filterResonanceRouting","type":"uint8"},{"internalType":"uint8","name":"filterModeVolume","type":"uint8"}],"name":"getTokenPRG","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"patchedVersion","type":"bool"}],"name":"getTokenPRGBase64","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"pal","type":"bool"},{"internalType":"uint8","name":"filterResonanceRouting","type":"uint8"},{"internalType":"uint8","name":"filterModeVolume","type":"uint8"}],"name":"getTokenPRGBase64","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenParams","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenPatchUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"pal","type":"bool"},{"internalType":"uint8","name":"filterResonanceRouting","type":"uint8"},{"internalType":"uint8","name":"filterModeVolume","type":"uint8"}],"name":"getTokenPatchedPRG","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"pal","type":"bool"},{"internalType":"uint8","name":"filterResonanceRouting","type":"uint8"},{"internalType":"uint8","name":"filterModeVolume","type":"uint8"}],"name":"getTokenPatchedPRGBase64","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenSecondsSinceLastTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setAnimationBaseURI","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"defaultMode","type":"uint8"}],"name":"setDefaultMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"desc","type":"string"}],"name":"setDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setExternalBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setImageBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOraandURI","name":"uriContract","type":"address"}],"name":"setTokenURIContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURIContract","outputs":[{"internalType":"contract IOraandURI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"modes","type":"uint8"}],"name":"unlockModes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unlockPatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e0604052602b6080818152906200620260a03980516200002991600b91602090910190620001e8565b50665af3107a400000600c5560408051808201909152601c8082527f68747470733a2f2f6e6f707374612e636f6d2f6f7261616e642f692f0000000060209092019182526200007b91600d91620001e8565b5060408051808201909152601c8082527f68747470733a2f2f6e6f707374612e636f6d2f6f7261616e642f762f000000006020909201918252620000c291600e91620001e8565b5060408051808201909152601a8082527f68747470733a2f2f6e6f707374612e636f6d2f6f7261616e642f00000000000060209092019182526200010991600f91620001e8565b503480156200011757600080fd5b506040805180820182526006808252651bdc98585b9960d21b6020808401828152855180870190965292855284015281519192916200015991600091620001e8565b5080516200016f906001906020840190620001e8565b5050506200018c620001866200019260201b60201c565b62000196565b620002cb565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001f6906200028e565b90600052602060002090601f0160209004810192826200021a576000855562000265565b82601f106200023557805160ff191683800117855562000265565b8280016001018555821562000265579182015b828111156200026557825182559160200191906001019062000248565b506200027392915062000277565b5090565b5b8082111562000273576000815560010162000278565b600181811c90821680620002a357607f821691505b60208210811415620002c557634e487b7160e01b600052602260045260246000fd5b50919050565b615f2780620002db6000396000f3fe6080604052600436106102885760003560e01c80636cfa24cc1161015a578063b88d4fde116100c1578063e985e9c51161007a578063e985e9c5146107ce578063f0f49ef514610817578063f2fde38b14610837578063f4a0a52814610857578063f8654e8214610877578063fd7cbad61461089757600080fd5b8063b88d4fde1461070e578063bdcf2f0e1461072e578063c87b56dd1461074e578063d18434151461076e578063d71a7a301461078e578063e34cb05d146107ae57600080fd5b80638da5cb5b116101135780638da5cb5b1461065b57806390c3f38f1461067957806395d89b4114610699578063a22cb465146106ae578063a2c6e888146106ce578063aa28d67d146106ee57600080fd5b80636cfa24cc146105a65780636f790d2c146105c657806370a08231146105e6578063715018a6146106065780637ec1d1b11461061b57806382fc31471461063b57600080fd5b80633f109376116101fe5780636352211e116101b75780636352211e146104c557806367da849d146104e55780636817c76c14610505578063698f87be1461051b5780636a37d7d31461053b5780636be636691461056d57600080fd5b80633f1093761461040557806340bb4abb1461042557806342842e0e1461044557806342bbf40a146104655780634f6ccce7146104855780636071862d146104a557600080fd5b80631f4f5a23116102505780631f4f5a231461035d5780632004ffd91461037d57806321af8ed91461038557806323b872dd146103a55780632e1a7d4d146103c55780632f745c59146103e557600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c57806318160ddd1461033e575b600080fd5b34801561029957600080fd5b506102ad6102a8366004613c4c565b6108b7565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d76108c8565b6040516102b99190614346565b3480156102f057600080fd5b506103046102ff366004613d3d565b61095a565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c610337366004613bad565b610981565b005b34801561034a57600080fd5b506008545b6040519081526020016102b9565b34801561036957600080fd5b506102d7610378366004613d3d565b610a9c565b61034f610c3a565b34801561039157600080fd5b5061033c6103a0366004613dc6565b610d78565b3480156103b157600080fd5b5061033c6103c0366004613ab7565b610e0a565b3480156103d157600080fd5b5061033c6103e0366004613d3d565b610e3b565b3480156103f157600080fd5b5061034f610400366004613bad565b610eaa565b34801561041157600080fd5b5061034f610420366004613d3d565b610f40565b34801561043157600080fd5b506102d7610440366004613d79565b610f67565b34801561045157600080fd5b5061033c610460366004613ab7565b61188d565b34801561047157600080fd5b5061033c610480366004613bad565b6118a8565b34801561049157600080fd5b5061034f6104a0366004613d3d565b611906565b3480156104b157600080fd5b506102ad6104c0366004613d3d565b611999565b3480156104d157600080fd5b506103046104e0366004613d3d565b6119c1565b3480156104f157600080fd5b506102d7610500366004613d79565b611a21565b34801561051157600080fd5b5061034f600c5481565b34801561052757600080fd5b50601254610304906001600160a01b031681565b34801561054757600080fd5b5061055b610556366004613d3d565b611a40565b60405160ff90911681526020016102b9565b34801561057957600080fd5b5061058d610588366004613d3d565b611a68565b60405167ffffffffffffffff90911681526020016102b9565b3480156105b257600080fd5b5061033c6105c1366004613c86565b611a90565b3480156105d257600080fd5b5061033c6105e1366004613d3d565b611aab565b3480156105f257600080fd5b5061034f610601366004613a5a565b611aec565b34801561061257600080fd5b5061033c611b72565b34801561062757600080fd5b506102d7610636366004613d79565b611b86565b34801561064757600080fd5b5061033c610656366004613a5a565b612848565b34801561066757600080fd5b50600a546001600160a01b0316610304565b34801561068557600080fd5b5061033c610694366004613c86565b612872565b3480156106a557600080fd5b506102d761288d565b3480156106ba57600080fd5b5061033c6106c9366004613b78565b61289c565b3480156106da57600080fd5b5061033c6106e9366004613c86565b6128a7565b3480156106fa57600080fd5b5061033c610709366004613dc6565b6128c2565b34801561071a57600080fd5b5061033c610729366004613af8565b6128ff565b34801561073a57600080fd5b5061033c610749366004613c0e565b612937565b34801561075a57600080fd5b506102d7610769366004613d3d565b6129f4565b34801561077a57600080fd5b506102d7610789366004613d56565b612b03565b34801561079a57600080fd5b5061033c6107a9366004613bd9565b612b37565b3480156107ba57600080fd5b5061033c6107c9366004613bad565b612bab565b3480156107da57600080fd5b506102ad6107e9366004613a7e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561082357600080fd5b506102d7610832366004613d79565b612bc8565b34801561084357600080fd5b5061033c610852366004613a5a565b612bd9565b34801561086357600080fd5b5061033c610872366004613d3d565b612c4f565b34801561088357600080fd5b5061033c610892366004613c86565b612c5c565b3480156108a357600080fd5b5061033c6108b2366004613d3d565b612c77565b60006108c282612ca2565b92915050565b6060600080546108d7906144e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610903906144e0565b80156109505780601f1061092557610100808354040283529160200191610950565b820191906000526020600020905b81548152906001019060200180831161093357829003601f168201915b5050505050905090565b600061096582612cc7565b506000908152600460205260409020546001600160a01b031690565b600061098c826119c1565b9050806001600160a01b0316836001600160a01b031614156109ff5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a1b5750610a1b81336107e9565b610a8d5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016109f6565b610a978383612d26565b505050565b6060610aa782611aab565b600082815260106020818152604080842054815180830190925260028252614e6f60f01b8284015293869052919052600882901c601f1691600160501b900460ff1615610b0a575060408051808201909152600381526259657360e81b60208201525b600084815260106020526040902054610b2590600716612d94565b610b7e6040518060400160405280602081526020017e0b0b0402060d010a0c0b06060e000f000f0f010b0d01000607000f000b0e068152508460ff1681518110610b7157610b7161458c565b016020015160f81c612d94565b610bcb6040518060400160405280602081526020017f010f000101010506020b0c0e0e060f0b0f0b0004010002070302030b010f060e8152508560ff1681518110610b7157610b7161458c565b600087815260106020908152604090912054610bea911c601f16612d94565b600088815260106020526040902054610c0c90600160401b900460ff16612d94565b85604051602001610c2296959493929190613ecb565b60405160208183030381529060405292505050919050565b600061040060115410610c7b5760405162461bcd60e51b815260206004820152600960248201526826b4b73a1037bb32b960b91b60448201526064016109f6565b6010610c8633611aec565b10610cbe5760405162461bcd60e51b81526020600482015260086024820152672634b6b4ba10189b60c11b60448201526064016109f6565b600c54341015610cfd5760405162461bcd60e51b815260206004820152600a6024820152694d696e7420707269636560b01b60448201526064016109f6565b6011805460018101909155610d123382612e92565b4233610d1d83612d94565b604051602001610d2f939291906142ca565b60408051601f198184030181529181528151602092830120600084815260109093529120805467ffffffffffffffff191660c09290921c91909117815542600190910155919050565b610d8233836118a8565b60008281526010602052604090205460ff600160401b90910481169082161115610dd75760405162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b60448201526064016109f6565b600091825260106020526040909120805460ff909216600160481b0269ff00000000000000000019909216919091179055565b610e143382612eac565b610e305760405162461bcd60e51b81526004016109f6906143ab565b610a97838383612f2a565b610e436130d1565b47811115610e795760405162461bcd60e51b8152602060048201526003602482015262105b5d60ea1b60448201526064016109f6565b604051339082156108fc029083906000818181858888f19350505050158015610ea6573d6000803e3d6000fd5b5050565b6000610eb583611aec565b8210610f175760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109f6565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000610f4b82611aab565b6000828152601060205260409020600101546108c2904261449d565b6060610f7285611aab565b600085815260106020526040902054600160501b900460ff16610fc05760405162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b60448201526064016109f6565b6000610fce86868686611b86565b905060005b6101c981101561104a576040518061020001604052806101c981526020016145e46101c99139818151811061100a5761100a61458c565b602001015160f81c60f81b8282610548018151811061102b5761102b61458c565b60200101906001600160f81b031916908160001a905350600101610fd3565b60008781526010602052604090205460011c6003908116141561109857600f60f81b826106ce815181106110805761108061458c565b60200101906001600160f81b031916908160001a9053505b8561118e57600360fa1b826106ce815181106110b6576110b661458c565b60200101906001600160f81b031916908160001a905350600560f91b8261066d815181106110e6576110e661458c565b60200101906001600160f81b031916908160001a905350600160fb1b82610675815181106111165761111661458c565b60200101906001600160f81b031916908160001a905350600360fa1b82610676815181106111465761114661458c565b60200101906001600160f81b031916908160001a905350600560f91b82610677815181106111765761117661458c565b60200101906001600160f81b031916908160001a9053505b60008781526010602052604090205460021c600716600381111561132b5760ee60f81b8361035e815181106111c5576111c561458c565b60200101906001600160f81b031916908160001a90535060d060f81b83610360815181106111f5576111f561458c565b60200101906001600160f81b031916908160001a90535080600414156112995760d060f81b8361054d8151811061122e5761122e61458c565b60200101906001600160f81b031916908160001a90535050600087815260106020526040902054825160079190911c600216906016820160f81b90849061035f90811061127d5761127d61458c565b60200101906001600160f81b031916908160001a905350611541565b80600514156112bb57602160f81b8361035f8151811061127d5761127d61458c565b806006141561130d57602060f81b83610360815181106112dd576112dd61458c565b60200101906001600160f81b031916908160001a905350600060f81b8361035f8151811061127d5761127d61458c565b601660f81b8361035f8151811061127d5761127d61458c565b611541565b806003141561137d5760a560f81b836103308151811061134d5761134d61458c565b60200101906001600160f81b031916908160001a905350607060f81b836103318151811061127d5761127d61458c565b80600214156113bc57600088815260106020526040902054835160f89190911b6001600160f81b03191690849061034790811061127d5761127d61458c565b80600114156114e05760008881526010602052604090205460061c60011661145f57600091505b600682101561132657604051806040016040528060068152602001650ee21d0ee20d60d41b815250828151811061141c5761141c61458c565b602001015160f81c60f81b83836102f3018151811061143d5761143d61458c565b60200101906001600160f81b031916908160001a9053506001909101906113e3565b600091505b600682101561132657604051806040016040528060068152602001650ee21d0ee20d60d41b815250828151811061149d5761149d61458c565b602001015160f81c60f81b838361033a01815181106114be576114be61458c565b60200101906001600160f81b031916908160001a905350600190910190611464565b60a460f81b836102ff815181106114f9576114f961458c565b60200101906001600160f81b031916908160001a905350608160f81b83610300815181106115295761152961458c565b60200101906001600160f81b031916908160001a9053505b60008881526010602052604090205460be60089190911c60ff1611156115c057608a60f81b836055815181106115795761157961458c565b60200101906001600160f81b031916908160001a90535060ea60f81b836056815181106115a8576115a861458c565b60200101906001600160f81b031916908160001a9053505b600088815260106020526040902054603c600e9190911c60ff1611156116ee57600091505b600d821015611668576040518060400160405280600d81526020016c018ad18d06902290e09e08d18d609c1b81525082815181106116255761162561458c565b602001015160f81c60f81b83836102c201815181106116465761164661458c565b60200101906001600160f81b031916908160001a9053506001909101906115e5565b600091505b60068210156116e95760405180604001604052806006815260200165054f4468c68360d51b81525082815181106116a6576116a661458c565b602001015160f81c60f81b83836102b701815181106116c7576116c761458c565b60200101906001600160f81b031916908160001a90535060019091019061166d565b61174f565b60ea60f81b83610304815181106117075761170761458c565b60200101906001600160f81b031916908160001a90535060ea60f81b83610305815181106117375761173761458c565b60200101906001600160f81b031916908160001a9053505b600088815260106020526040902054607f60169190911c60ff1611156117f757600091505b60088210156117f25760405180604001604052806008815260200167103e851480c8a87560c11b81525082815181106117af576117af61458c565b602001015160f81c60f81b83836102a001815181106117d0576117d061458c565b60200101906001600160f81b031916908160001a905350600190910190611774565b61187f565b600091505b600d82101561187f576040518060400160405280600d81526020016c0103e85468010103e854682103609d1b815250828151811061183c5761183c61458c565b602001015160f81c60f81b838361028c018151811061185d5761185d61458c565b60200101906001600160f81b031916908160001a9053506001909101906117fc565b50909150505b949350505050565b610a97838383604051806020016040528060008152506128ff565b6118b181611aab565b816001600160a01b03166118c4826119c1565b6001600160a01b031614610ea65760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b60448201526064016109f6565b600061191160085490565b82106119745760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109f6565b600882815481106119875761198761458c565b90600052602060002001549050919050565b60006119a482611aab565b50600090815260106020526040902054600160501b900460ff1690565b6000818152600260205260408120546001600160a01b0316806108c25760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109f6565b6060611a37611a3286868686610f67565b61312b565b95945050505050565b6000611a4b82611aab565b50600090815260106020526040902054600160401b900460ff1690565b6000611a7382611aab565b5060009081526010602052604090205467ffffffffffffffff1690565b611a986130d1565b8051610ea690600d90602084019061395d565b6011548110611ae95760405162461bcd60e51b815260206004820152600a602482015269125b9d985b1a59081a5960b21b60448201526064016109f6565b50565b60006001600160a01b038216611b565760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016109f6565b506001600160a01b031660009081526003602052604090205490565b611b7a6130d1565b611b84600061327f565b565b6060611b9185611aab565b60006040518061082001604052806108008152602001614e9a61080091396000878152601060205260408120549192509081906007168015801590611bd65750600481105b15611c6657600181036038029150600092505b6038831015611c61576040518060e0016040528060a88152602001614df260a8913982840181518110611c1e57611c1e61458c565b602001015160f81c60f81b84846107c80181518110611c3f57611c3f61458c565b60200101906001600160f81b031916908160001a905350600190920191611be9565b611cf8565b6003811115611cf8576004810360ef029150600092505b60ef831015611cf857604051806103e001604052806103bc81526020016147ad6103bc913982840181518110611cb557611cb561458c565b602001015160f81c60f81b84846107110181518110611cd657611cd661458c565b60200101906001600160f81b031916908160001a905350600190920191611c7d565b6003811115611de357600092505b6101c9831015611d80576040518061020001604052806101c98152602001614c296101c991398381518110611d3d57611d3d61458c565b602001015160f81c60f81b84846105480181518110611d5e57611d5e61458c565b60200101906001600160f81b031916908160001a905350600190920191611d06565b601060f81b8460a581518110611d9857611d9861458c565b60200101906001600160f81b031916908160001a905350600f60f81b8460a681518110611dc757611dc761458c565b60200101906001600160f81b031916908160001a905350611e2e565b60008981526010602052604090205460031c60011615611e2e57600560f91b8461065181518110611e1657611e1661458c565b60200101906001600160f81b031916908160001a9053505b60ff871615611e67578660f81b8461018a81518110611e4f57611e4f61458c565b60200101906001600160f81b031916908160001a9053505b60ff861615611ea0578560f81b8461018681518110611e8857611e8861458c565b60200101906001600160f81b031916908160001a9053505b6000898152601060208190526040909120549081901c600716601890810293501c600f16886121a957600093506054015b6004841015611faf576040518060400160405280600481526020016218060360e11b8152508481518110611f0757611f0761458c565b602001015160f81c60f81b85856104a90181518110611f2857611f2861458c565b60200101906001600160f81b031916908160001a9053506040518060400160405280600481526020016206060360e11b8152508481518110611f6c57611f6c61458c565b602001015160f81c60f81b85856104ad0181518110611f8d57611f8d61458c565b60200101906001600160f81b031916908160001a905350600190930192611ed1565b60048210156121a957600093505b60048410156120385760405180604001604052806005815260200164181818018360db1b8152508481518110611ff557611ff561458c565b602001015160f81c60f81b858561064d01815181106120165761201661458c565b60200101906001600160f81b031916908160001a905350600190930192611fbd565b60008a81526010602052604090205460031c6001161561208757600360fa1b856106518151811061206b5761206b61458c565b60200101906001600160f81b031916908160001a9053506120b8565b600360fb1b85610651815181106120a0576120a061458c565b60200101906001600160f81b031916908160001a9053505b600160fa1b85610696815181106120d1576120d161458c565b60200101906001600160f81b031916908160001a905350605f60f81b8561057f815181106121015761210161458c565b60200101906001600160f81b031916908160001a905350600360fc1b856106ae815181106121315761213161458c565b60200101906001600160f81b031916908160001a905350600360fc1b8561075d815181106121615761216161458c565b60200101906001600160f81b031916908160001a905350600960fc1b85610763815181106121915761219161458c565b60200101906001600160f81b031916908160001a9053505b600093505b60188410156122c757806040518060e0016040528060c08152602001614b6960c09139848601815181106121e4576121e461458c565b602001015160f81c60f81b60f81c60ff160191506040518060e0016040528060a881526020016156da60a8913982815181106122225761222261458c565b602001015160f81c60f81b858561051801815181106122435761224361458c565b60200101906001600160f81b031916908160001a9053506040518060e0016040528060a8815260200161578260a8913982815181106122845761228461458c565b602001015160f81c60f81b858561053001815181106122a5576122a561458c565b60200101906001600160f81b031916908160001a9053506001909301926121ae565b60008a8152601060209081526040918290205482518084019093528183527f010f000101010506020b0c0e0e060f0b0f0b0004010002070302030b010f060e8383015260081c601f169350839081106123225761232261458c565b602001015160f81c60f81b8561017e815181106123415761234161458c565b60200101906001600160f81b031916908160001a9053506040518060400160405280602081526020017e0b0b0402060d010a0c0b06060e000f000f0f010b0d01000607000f000b0e06815250828151811061239e5761239e61458c565b602001015160f81c60f81b856056815181106123bc576123bc61458c565b60200101906001600160f81b031916908160001a90535060008a815260106020908152604090912054901c601f1660380292506106c883101561247957600093505b6038841015612479576040518061070001604052806106c8815260200161582a6106c89139848401815181106124365761243661458c565b602001015160f81c60f81b85856104c001815181106124575761245761458c565b60200101906001600160f81b031916908160001a9053506001909301926123fe565b60008a8152601060205260409020548551602882901c60ff16935060d09190911b6001600160f81b0319169086906104a89081106124b9576124b961458c565b60200101906001600160f81b031916908160001a90535060008a8152601060208181526040928390205483518085019094528284526f1d2b2d4d5f63656971878da9c3cfe7f560801b9184019190915260301c600f169350839081106125215761252161458c565b602001015160f81c60f81b85610287815181106125405761254061458c565b60200101906001600160f81b031916908160001a90535060008a81526010602052604081205490945067ffffffffffffffff60389190911c6007166003021691505b6003841015612617576040518060400160405280601881526020017f08000014000a14005014281478785050505060500a0204080000000000000000815250828501815181106125d4576125d461458c565b602001015160f81c60f81b85856104b101815181106125f5576125f561458c565b60200101906001600160f81b031916908160001a905350600190930192612582565b60008a81526010602052604081205490945067ffffffffffffffff603b9190911c6003166004021691505b60048410156126ca576040518060400160405280601081526020016f01900000a0a00000f0500000a100000160851b815250828501815181106126875761268761458c565b602001015160f81c60f81b85856104bc01815181106126a8576126a861458c565b60200101906001600160f81b031916908160001a905350600190930192612642565b60008a8152601060205260408120549094506004603d9190911c6001160267ffffffffffffffff1691505b60048410156127745760405180604001604052806008815260200166f502828192828560c51b815250828501815181106127315761273161458c565b602001015160f81c60f81b85856104b801815181106127525761275261458c565b60200101906001600160f81b031916908160001a9053506001909301926126f5565b601060008b815260200190815260200160002060000160089054906101000a900460ff1660010160f81b856101c6815181106127b2576127b261458c565b60200101906001600160f81b031916908160001a90535060008a815260106020526040902054600160481b900460ff161561283a5760008a8152601060205260409020548551600160481b90910460f81b6001600160f81b03191690869061010e9081106128225761282261458c565b60200101906001600160f81b031916908160001a9053505b509298975050505050505050565b6128506130d1565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b61287a6130d1565b8051610ea690600b90602084019061395d565b6060600180546108d7906144e0565b610ea63383836132d1565b6128af6130d1565b8051610ea690600e90602084019061395d565b6128cd338383612937565b600091825260106020526040909120805460ff909216600160401b0268ff000000000000000019909216919091179055565b6129093383612eac565b6129255760405162461bcd60e51b81526004016109f6906143ab565b612931848484846133a0565b50505050565b60048160ff16106129745760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b60448201526064016109f6565b6000604051806080016040528060008152602001620151806008612998919061447e565b81526020016129ab62015180601061447e565b81526020016201518060206129c0919061447e565b9052905060008160ff8416600481106129db576129db61458c565b602002015190506129ed858583612b37565b5050505050565b60606129ff82611aab565b6012546001600160a01b031615612a965760125460405163e9dc637560e01b8152306004820152602481018490526001600160a01b039091169063e9dc63759060440160006040518083038186803b158015612a5a57600080fd5b505afa158015612a6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c29190810190613ccf565b6000612aa183612d94565b90506000612af082600b612ab4856133d3565b612abd88610a9c565b612ac8896000612b03565b604051602001612adc959493929190614137565b60405160208183030381529060405261312b565b905080604051602001610c229190614254565b6060612b0e83611aab565b8115612b2957612b22836001600080611a21565b90506108c2565b612b22836001600080612bc8565b612b4183836118a8565b6000612b4c82612d94565b604051602001612b5c9190614299565b60408051601f198184030181529181526000858152601060205220600101549091508290612b8a904261449d565b101581906129ed5760405162461bcd60e51b81526004016109f69190614346565b6000612bbb62015180604061447e565b9050610a97838383612b37565b6060611a37611a3286868686611b86565b612be16130d1565b6001600160a01b038116612c465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109f6565b611ae98161327f565b612c576130d1565b600c55565b612c646130d1565b8051610ea690600f90602084019061395d565b612c813382612bab565b6000908152601060205260409020805460ff60501b1916600160501b179055565b60006001600160e01b0319821663780e9d6360e01b14806108c257506108c28261340c565b6000818152600260205260409020546001600160a01b0316611ae95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109f6565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612d5b826119c1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606081612db85750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612de25780612dcc8161451b565b9150612ddb9050600a8361446a565b9150612dbc565b60008167ffffffffffffffff811115612dfd57612dfd6145a2565b6040519080825280601f01601f191660200182016040528015612e27576020820181803683370190505b5090505b841561188557612e3c60018361449d565b9150612e49600a86614536565b612e54906030614452565b60f81b818381518110612e6957612e6961458c565b60200101906001600160f81b031916908160001a905350612e8b600a8661446a565b9450612e2b565b610ea682826040518060200160405280600081525061345c565b600080612eb8836119c1565b9050806001600160a01b0316846001600160a01b03161480612eff57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806118855750836001600160a01b0316612f188461095a565b6001600160a01b031614949350505050565b826001600160a01b0316612f3d826119c1565b6001600160a01b031614612fa15760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109f6565b6001600160a01b0382166130035760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109f6565b61300e83838361348f565b613019600082612d26565b6001600160a01b038316600090815260036020526040812080546001929061304290849061449d565b90915550506001600160a01b0382166000908152600360205260408120805460019290613070908490614452565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b03163314611b845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b606081516000141561314b57505060408051602081019091526000815290565b600060405180606001604052806040815260200161569a604091399050600060038451600261317a9190614452565b613184919061446a565b61318f90600461447e565b67ffffffffffffffff8111156131a7576131a76145a2565b6040519080825280601f01601f1916602001820160405280156131d1576020820181803683370190505b509050600182016020820185865187015b8082101561323d576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506131e2565b5050600386510660018114613259576002811461326c57613274565b603d6001830353603d6002830353613274565b603d60018303535b509195945050505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156133335760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109f6565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6133ab848484612f2a565b6133b7848484846134bd565b6129315760405162461bcd60e51b81526004016109f690614359565b60606000600d83600e85600f876040516020016133f596959493929190614071565b60408051601f198184030181529190529392505050565b60006001600160e01b031982166380ac58cd60e01b148061343d57506001600160e01b03198216635b5e139f60e01b145b806108c257506301ffc9a760e01b6001600160e01b03198316146108c2565b61346683836135c7565b61347360008484846134bd565b610a975760405162461bcd60e51b81526004016109f690614359565b61349a838383613715565b601154811015610a97576000908152601060205260409020426001909101555050565b60006001600160a01b0384163b156135bf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613501903390899088908890600401614309565b602060405180830381600087803b15801561351b57600080fd5b505af192505050801561354b575060408051601f3d908101601f1916820190925261354891810190613c69565b60015b6135a5573d808015613579576040519150601f19603f3d011682016040523d82523d6000602084013e61357e565b606091505b50805161359d5760405162461bcd60e51b81526004016109f690614359565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611885565b506001611885565b6001600160a01b03821661361d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109f6565b6000818152600260205260409020546001600160a01b0316156136825760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109f6565b61368e6000838361348f565b6001600160a01b03821660009081526003602052604081208054600192906136b7908490614452565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0383166137705761376b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613793565b816001600160a01b0316836001600160a01b0316146137935761379383826137cd565b6001600160a01b0382166137aa57610a978161386a565b826001600160a01b0316826001600160a01b031614610a9757610a978282613919565b600060016137da84611aec565b6137e4919061449d565b600083815260076020526040902054909150808214613837576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061387c9060019061449d565b600083815260096020526040812054600880549394509092849081106138a4576138a461458c565b9060005260206000200154905080600883815481106138c5576138c561458c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806138fd576138fd614576565b6001900381819060005260206000200160009055905550505050565b600061392483611aec565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054613969906144e0565b90600052602060002090601f01602090048101928261398b57600085556139d1565b82601f106139a457805160ff19168380011785556139d1565b828001600101855582156139d1579182015b828111156139d15782518255916020019190600101906139b6565b506139dd9291506139e1565b5090565b5b808211156139dd57600081556001016139e2565b6000613a09613a048461442a565b6143f9565b9050828152838383011115613a1d57600080fd5b828260208301376000602084830101529392505050565b80358015158114613a4457600080fd5b919050565b803560ff81168114613a4457600080fd5b600060208284031215613a6c57600080fd5b8135613a77816145b8565b9392505050565b60008060408385031215613a9157600080fd5b8235613a9c816145b8565b91506020830135613aac816145b8565b809150509250929050565b600080600060608486031215613acc57600080fd5b8335613ad7816145b8565b92506020840135613ae7816145b8565b929592945050506040919091013590565b60008060008060808587031215613b0e57600080fd5b8435613b19816145b8565b93506020850135613b29816145b8565b925060408501359150606085013567ffffffffffffffff811115613b4c57600080fd5b8501601f81018713613b5d57600080fd5b613b6c878235602084016139f6565b91505092959194509250565b60008060408385031215613b8b57600080fd5b8235613b96816145b8565b9150613ba460208401613a34565b90509250929050565b60008060408385031215613bc057600080fd5b8235613bcb816145b8565b946020939093013593505050565b600080600060608486031215613bee57600080fd5b8335613bf9816145b8565b95602085013595506040909401359392505050565b600080600060608486031215613c2357600080fd5b8335613c2e816145b8565b925060208401359150613c4360408501613a49565b90509250925092565b600060208284031215613c5e57600080fd5b8135613a77816145cd565b600060208284031215613c7b57600080fd5b8151613a77816145cd565b600060208284031215613c9857600080fd5b813567ffffffffffffffff811115613caf57600080fd5b8201601f81018413613cc057600080fd5b611885848235602084016139f6565b600060208284031215613ce157600080fd5b815167ffffffffffffffff811115613cf857600080fd5b8201601f81018413613d0957600080fd5b8051613d17613a048261442a565b818152856020838501011115613d2c57600080fd5b611a378260208301602086016144b4565b600060208284031215613d4f57600080fd5b5035919050565b60008060408385031215613d6957600080fd5b82359150613ba460208401613a34565b60008060008060808587031215613d8f57600080fd5b84359350613d9f60208601613a34565b9250613dad60408601613a49565b9150613dbb60608601613a49565b905092959194509250565b60008060408385031215613dd957600080fd5b82359150613ba460208401613a49565b60008151808452613e018160208601602086016144b4565b601f01601f19169290920160200192915050565b60008151613e278185602086016144b4565b9290920192915050565b8054600090600181811c9080831680613e4b57607f831692505b6020808410821415613e6d57634e487b7160e01b600052602260045260246000fd5b818015613e815760018114613e9257613ebf565b60ff19861689528489019650613ebf565b60008881526020902060005b86811015613eb75781548b820152908501908301613e9e565b505084890196505b50505050505092915050565b7f5b7b2274726169745f74797065223a2254797065222c2276616c7565223a2200815260008751613f0381601f850160208c016144b4565b7f227d2c7b2274726169745f74797065223a224647222c2276616c7565223a2200601f918401918201528751613f4081603e840160208c016144b4565b7f227d2c7b2274726169745f74797065223a224247222c2276616c7565223a2200603e92909101918201528651613f7e81605d840160208b016144b4565b7f227d2c207b2274726169745f74797065223a2243686172736574222c2276616c605d9290910191820152643ab2911d1160d91b607d8201528551613fca816082840160208a016144b4565b61406361405461404e6140196140136082868801017f227d2c7b2274726169745f74797065223a224d6f646573222c2276616c7565228152611d1160f11b602082015260220190565b8a613e15565b7f227d2c207b2274726169745f74797065223a225061746368222c2276616c7565815262111d1160e91b602082015260230190565b87613e15565b62227d5d60e81b815260030190565b9a9950505050505050505050565b681134b6b0b3b2911d1160b91b8152600061408f6009830189613e31565b875161409f818360208c016144b4565b7f2e706e67222c22616e696d6174696f6e5f75726c223a2200000000000000000091019081526140d26017820188613e31565b905085516140e4818360208a016144b4565b7111161132bc3a32b93730b62fbab936111d1160711b910190815261410c6012820186613e31565b9050835161411e8183602088016144b4565b601160f91b910190815260010198975050505050505050565b6f03d913730b6b2911d1137b930b0b732160851b81528551600090614163816010850160208b016144b4565b701116113232b9b1b934b83a34b7b7111d1160791b60109184019182015261418e6021820188613e31565b61088b60f21b815286519091506141ac816002840160208a016144b4565b6d161130ba3a3934b13aba32b9911d60911b6002929091019182015284516141db8160108401602089016144b4565b7f2c22707267223a22646174613a6170706c69636174696f6e2f782d6336342d70601092909101918201526d1c9bd9dc985b4ed8985cd94d8d0b60921b6030820152835161423081603e8401602088016144b4565b614247603e8284010161227d60f01b815260020190565b9998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161428c81601d8501602087016144b4565b91909101601d0192915050565b6802932b8903a34b6b2960bd1b8152600082516142bd8160098501602087016144b4565b9190910160090192915050565b8381526bffffffffffffffffffffffff198360601b166020820152600082516142fa8160348501602087016144b4565b91909101603401949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061433c90830184613de9565b9695505050505050565b602081526000613a776020830184613de9565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715614422576144226145a2565b604052919050565b600067ffffffffffffffff821115614444576144446145a2565b50601f01601f191660200190565b600082198211156144655761446561454a565b500190565b60008261447957614479614560565b500490565b60008160001904831182151516156144985761449861454a565b500290565b6000828210156144af576144af61454a565b500390565b60005b838110156144cf5781810151838201526020016144b7565b838111156129315750506000910152565b600181811c908216806144f457607f821691505b6020821081141561451557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561452f5761452f61454a565b5060010190565b60008261454557614545614560565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611ae957600080fd5b6001600160e01b031981168114611ae957600080fdfe4c7b0ea200d00ffe00d8fe00d9fe00dafe00dbcad0f1a46cc003d004a915d00e6674e6bda5bd29036900aabd6f0e8574c624c6a9d007a98085a920010fa5aca28520f30918a57f65bc857fc000f004a524d016a5a7395d0ed00f207d0ad9bb0ca900b003207d0a85bc207d0ac964b94f0eb003b9530e85ada20286a818a5a73d600e6524d005207d0a95b5bcea0b38b97000e906997000b00fb97100e900997100b005a90099710018b972007db00c997200b973006900997300a524d023a46cb51839770ebcea0b1875b5f618aabd0060997000bd0061997100a6a8b5ad997400a524d5a1d005a920997400ca108ba524d006a5aa8524e6a7a901857aa218b5709d00d4ca10f8604141414115514151ed98fae698fa031f0f1f3f7f648c6e010303070704080a0f5020508000070a0807000307a200207d0a291fc91810f7a8b9170dc5b3f0ef85b39d0060b92f0d9d0061cad0e1a214a900950385a7e003104e207d0a9518a94195ada46cb9730e85aabcea0b9673a910997500bd5a0e997600a56cd013a90a85aaa94195adbd570e997600bd630ed015c901d005bd660ed00cc902d005bd690ed003bd6c0e95a1ca10a5a901852485a98528a46cb9b30c8586b9b70c85ac60a930207d0a297fc90ab002690a85a0a9308551a9008550a207a03f207d0ac5a0b004a90191508810f2869ea940a25020f309ca10e4a907859ca003a207bd00309d3830ca10f7a9084820ef0f6838ad4f0fe9088d4f0f8810e2a92020ef0f18ad4f0f69608d4f0f9003ee500fc69c10c9a940859ca003a204b900309d0030e88810f618ad870f69088d870f9003ee880f18ad8a0f69088d8a0f9003ee8b0fc69cd0d2207d0a9031a204a0308451c8844fa9008550a9c0854ea03fb150914e8810f9869ea940a25020f30938a54ee940854eb002c64fcad0e0a9088dab0c8daf0c60186d4c0f8d4c0f9003ee4d0f60000000207d0a290785b4207d0a2907690e859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aa207d0aa59c2903a8b9dc0f855f20e00fc69cd0c9a907859ca003a207bd00309d3830ca10f7a9084820cf0f6838ad650fe9088d650f8810e2a92020cf0f18ad650f69608d650f9003ee660fc69c10c9a940859ca003a204b900309d0030e88810f618ad9d0f69088d9d0f9003ee9e0f18ada00f69088da00f9003eea10fc69cd0d2a9088dab0c8daf0c60186d620f8d620f9003ee630f6000010840a000a9019150869ea55fa25020f309ca10f060000000000000000000000000207d0a290785b4207d0a2907690e859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aa207d0aa59c2903a8b9dc0f855f20e00fc69cd0c9a907859ca003a207bd00309d3830ca10f7a9084820cf0f6838ad650fe9088d650f8810e2a92020cf0f18ad650f69608d650f9003ee660fc69c10c9a940859ca003a204b900309d0030e88810f618ad9d0f69088d9d0f9003ee9e0f18ada00f69088da00f9003eea10fc69cd0d2a9088dab0c8daf0c60186d620f8d620f9003ee630f60000105bda000a9019150869ea55fa25020f309ca10f060000000000000000000000000207d0a290f69028de00fa90f85b4207d0a29076906859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aaa59c2901a8b9e00f855f20e40fc69cd0cca907859ca003a207bd00309d3830ca10f7a9084820d30f6838ad690fe9088d690f8810e2a92020d30f18ad690f69608d690f9003ee6a0fc69c10c9a940859ca003a204b900309d0030e88810f618ada10f69088da10f9003eea20f18ada40f69088da40f9003eea50fc69cd0d2a9088dab0c8daf0c60186d660f8d660f9003ee670f6000010840a000a9019150869eade00fa25020f309ca10ef60000000000000000c13181f22181618181f242b2e242224181f242b2e2422240c13181c211f1518181f24282d2b2124181f24282d2b21240c13181b221f1618181f24272e2b2224181f24272e2b22240c13181c231f1718181f24282f2b2324181f24282f2b23240c13181c231f1718181f24282f2b2324302b24283b3723300c13181c221f1618181f24282e2b2224302b24283a3722300c12181b221e1618181e24272e2a2224302a24273a3622300c12181b211e1518181e24272d2a2124302a2433393621304c740ea46cc624c6a9d00aa98085a9a52849018528a528d00aa5aca28520f3094c750d38a585e5ac8585b002c68618a57f65bc857fc4cff004a524d02da5a739620ed026207d0ad9bb0ca900b003207d0a85bca524d013207d0ac964290885cfb9540eb003b9580e85ada20286a818a5a73d650e6524d005207d0a95b5bcea0bb97400c951f039b5b9d01a18b972007db00c997200900eb973006900290fd002f6b9997300b5b9f01a38b97200fdb00c997200b00eb97300e900290fd002d6b9997300a524d01db51829071875b5f618aabd0060997000bd0061997100a6a8b5ad997400a524d5a1d008b9740029fe997400ca30034cb30da524d006a5aa8524e6a7a218b5709d00d4ca10f8601141414115514151899cdd8689d9031f0f1f3f7f6e8c6e0208080c0c04080a0fa200207d0a291fc91810f7a8b9170dc5b3f0ef85b39d0060b92f0d9d0061cad0e1a214a900950385a7e0031053207d0a9518a94195ada46cb9ac0c85aabcea0b9673a910997500bd5f0e997600a56cd018a9ff85aaa91195ada9f0997500bd5c0e997600bd680ed015c901d005bd6b0ed00cc902d005bd6e0ed003bd710e95a1ca10a0a901852485a98528a46ca9788585b9b30c8586b9b70c85ac60a9308551a207a03feea70c207d0addf20fb004a90191508810eea551854f869ea940a25020f309ca10dc60080e141e3250648c0000000000207d0a293f692ec9549008a2088eab0c8eaf0c85a0a9308551a207a03f207d0ac5a0b004a90191508810f2869ea940a25020f309ca10e460a9a085a0207d0a2907855f29fdd002e65fa9308551a207a03f207d0ac5a0b004a90191503898e55fa810ee869ea940a25020f309ca10e06001080b0800009e323036320000000078a9358501a97f8d0ddc8d0dddad0ddcad0ddda92c8dfaffa90a8dfbffa9018d1ad0a9188d11d0a9ff8dfeffa9098dffffa2fd8e12d0a9009d00309dfc309df93195019dff1fa9089dffd79dfcd89df9d99deadabdbe0c9d0f20bdf60c9d2723cad0d3a93c855ba9e88d18d0a0b4a9038560a9008556b9f20b8848293f9d0070e86829c005564a4a8556c660d0e89d0070e898d0d920c70fa2208e30348666a2488665a7b88d003418bd003469089d0134bd303469009d3134e8e02ed0eaa438be0070bd003485618567bd30348562a9238568be2270bd00348563bd30348564a007b16749ff3163116191658810f3a908a26520f309e638a538c922d0c0a900856c20e20aa203a9ec8dff59a9008d3f5abdcf0a8d3f0a8d500a8d580abdd50a8d440abdd60a8d560abdd40a8596bdd30a8597bdda0a8598bdde0a85998656a22b869ba2fe869da000a201a599202d0ae8e009d0f8a6978696a219869ba202869da207202d0acad0faa656ca1099a9008d20d08d21d0a91f8588a9f4858758af00dcc52ff03b852f2904d002e6578a2908d002c6578a2901d008a558c908f002e6588a2902d006a558f002c6588a2910d00fe66ca56cc9043004a900856c20e20aa66cf01abdec0b8deb09bdef0b8dec09a56ddda80c3007a900856d20b50a20f20a4c8d0918750095009002f601a69e60488a489848a9ff8d19d0204a0de66da55ef014a55b855d4904855bad18d049108d18d0a900855e68a868aa684040869c186596484818a59b659d859b859a68990050481869ffc01d1006e49cd002a9ff99005168481869f8990052681865984818b9ff59659a99005ab93f5a690099405aa902859a68c8cad0c568a69c60ada70cf0030a9002492d8da70c60a9308551a9008550a9408537a000b1508556a007b350a556915086568810f5a908a25020f309c637d0e260c66e3002d004a908856e6018a5586901c909d002a900855860004080c00108fff80108fff90907f7f8084737a9088558a964856da900856e20470d60a55ef002ea60a55b8551a204a000988550915088d0fbe651cad0f1a5572903aabdcf0a8d610b8d770b8d840ba558d003e65e608536a9008554a9308555a93e8530a55b8531a56ef004c536d003205b0b38a530e9288530b002c631a940a25420f309c636d0dfe65e60a200eaeaeabc0050b154f07a18bd005a65308550bd405a65318551bc0051b154c0ffd002a9008533bc0052b15485328660a000b350bd4470e000f00ac909d006a633f002a9019150c8b350bd6f70e000f00ac90fd006a632f002a9019150a028b150f006a903a633d002a9029150c8a9049150a050b350bd9a709150c8b350bdc5709150a660e8e040f0034c5d0b6000070ec1b68b0a0a0aa11fa0088808a1209f5ddc9f5fdfe2a11e5e5ee0de08880808881f48dd9c48c82a8787595a98ea999959a99b9a5897564747470747d9589b1a5987075796150752d2a79414536828a853e75212d25212925352114f13145111515206d14f0f062666a3a625e48e0ece0ece8ea4664d25e44d8d0ccc0ecd0c0a89ce0cc5490a85c55cdf5d5695535550c704428b088584020dc80544c10786030107870645850548480888080787070747c70646860645850545457500280a05000a0a0560500a145028141ea05050220000328000e000f800fe008000e000f800fe000103070f1f3f7fff00000000000000000000000000000000ff003f000f000300fffefcf8f0e0c0800103070f1f3f7fff80c0e0f0f8fcfeffff7f3f1f0f070301fffefcf8f0e0c0802d435a7c5285a95a5a85b4f7a30a52b45a85b4f7a30a52b402030405070603040406080a0e0d07080406080a0e0d07084c7a0fa528d00aa52ba28520f3094c680d38a585e52b8585b007c686100320bd0fc629d00dc62ad009a5284901852820b40fc6241004a94f8524a202a524d007d60fd00320670ebcea0b18b970007509997000b97100750c997100b574c951f03cb5b9d01a18b972007db00c997200900eb973006900290fd002f6b9997300b5b9f01a38b97200fdb00c997200b00eb97300e900290fd002d6b9997300d612d015b506f011b9740049019974004ab5069002b5039512b515f032d615d02eb51ef005d6184c100ef618b51818862d351b7521aab97400c981f00cbd170d997000bd2f0d997100a62db5259515ca30034c830da218b5709d00d4ca10f860100804010707070fa0a0a00a140000000808020032001e0014b4321111418161dddebfbd440ea46cd0010a950fb9b70c852b207d0a39480e0903951b207d0a39470e79530e29079521207d0a2901951ea903855fb9ac0c9525c001d004a9288526c908d002065fa55f95039512207d0ad95b0ea900b002a9029506f612a9019515a941bcea0b997400a46ce002d01a207d0ad9bb0ca900b00e207d0ac920b004a9158582207d0a850e207d0ad9570eb008a9518574a9018573b9b30c859fe000d02d20bd0fc003d0268609207d0ac932b01d290385098625207d0ac932a981b002a9158574861ba55f8503a9028506207d0ad9590eb006a9008523851d98d035bcea0ba911997400e002d00b207d0a2903a8b95f0e8582a92895039512a9789506f612207d0a2907a8b94c0e9525207d0a2901850a60a9018524a214a9009503e0031029bcea0ba56cd010bd650e997500bd620e090d997600d00ba911997500bd620e997600967320670ef60fca10cca9648529a901852a60a59f8586a9008528f0eda9308551a207a03fe007f004b14ef00c207d0addf70fb004a90191508810e9a551854f18a550854e694085509002e651ca10d3603c648cdc4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f1727394b5f748aa1bad4f00e2d4e7196bee8144374a9e11c5a9ce22d7ccf2885e852c137b439c55af79e4f0ad1a3826e68718ab3ee3c9e15a24604dcd0e21467dd793c29448d08b8a1c528cdbaf17853871a10710c1c2d3f52667b92aac3defa18385a7ea4ccf7245486bcf53171b5fc4898ee48a90d79ea62e26af89030dc90521af2d4c4c4d4f02060b820a434e4a88888a8e040c070404868c850101050c08080e08090d090a00101010101010101010101020202020202020303030303040404040505050606060707080809090a0a0b0c0d0d0e0f10111213141517181a1b1d1f20222427292b2e3134373a3e4145494e52575c62686e757c83010101010101010101010101020202020202020303030303040404040505050606070707080809090a0b0b0c0d0e0e0f10111213151617191a1c1d1f212325272a2c2f3235383b3f43474b4f54595e646a70777e8000e000f800fe008000e000f800fe000102070a1f2a7faa00000000000000000000000000000000ff003f000f000300ffaafca8f0a0c08080c0a0908884828180c0a0908884828101030509112141810102040810204080804020100804020181412111090503018182848890a0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103070f1f3f7fff00000000000000000000000000000000ff7f3f1f0f070301fffefcf8f0e0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103050911214181010204081020408080402010080402017f3f1f0f07030100010204081020408020104864524944422010486452494442040812264a922242000001020408102000008040201008044222120a06020000424448506040000080402090c8e4723980402090c8e472390102040913274e9c010204081020408080402010080402019c4e2713090402013972e4c8902040808040209048a452298040209048a452290102040912254a9401020408102040808040201008040201944a2512090402012952a4489020408080c0e0b0988c868380c0e0b0988c86830103070d193161c101020408102040808040201008040201c16131190d07030183868c98b0e0c08080c0e0b0d8acd6ab80c0e0b0d8acd6ab0103070d1b356bd501020408102040808040201008040201d56b351b0d070301abd6acd8b0e0c08080c0a0908884c2a180402010088442210102050b162d5bb70102040810204080804020100804020190482412090402016fdebc78f0e0c08080c0a09098a4c28180c0a09098a4c28101030509192543810102040810204080804020100804020181412111090503018182848890a0c08080c0a09088a492a980402010082412290103070f1d3b75eb01020408102040808040201008040201944a241208040201d7aedcb8f0e0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103070f1f3f7fff01020408102040808040201008040201ff7f3f1f0f070301fffefcf8f0e0c0808000200088002200800020008800220000000200080022000000000000000000000000000000000088002200080002008800200080000000804020904824924980402090482492490102050b162d5bb60102040810204080804020100804020192492412090402016ddab468d0a0408000c000f000fc00ff00c000f000fc00ff0103050e173b5dee00000000000000000000000000000000007f001f0007000177badce870a0c0808000a000a800aa008000a000a800aa000102070a1f2a7faa00000000000000000000000000000000aa002a000a000200ffaafca8f0a0c08080c0a0d0a8d4aad58040a050a854aa550103070f1f3f7fff01020408102040808040201008040201aa552a150a050201fffefcf8f0e0c08080c0a09088c4a29180402010884422110103070f1e3d7bf7010204081020408080402010080402018844221108040201efdebc78f0e0c0808040209048a452298040209048a452290102050b162d5bb601020408102040808040201008040201944a2512090402016ddab468d0a04080804020100804020180402010080402010102040810204080010204081020408080402010080402018040201008040201010204081020408080402090c864b2d980402090c864b2d90102040913264d9b01020408102040808040201008040201ec763b1d0e070301376edcb870e0c0808000e000f800fe008000e000f800fe00010007001f007f0000000000000000000000000000000000ff003f000f000300ff00fc00f000c0008040a050a854aa558040a050a854aa55000102050a152a5500000000000000000000000000000000aa552a150a050201aa54a850a04080008040201088442211804020108844221101020408112244880102040810204080804020100804020188442211080402011122448810204080000080002000880000008000200088000101040613194c660000000000000000000000000000000022000800020000003398cc603080c000000080402010884400008040201088440101040613194c660000000000000000000000000000000022110804020100003398cc603080c0008000a000a800aa008000a000a800aa00000002000a002a0000000000000000000000000000000000aa002a000a000200aa00a800a000800080c0a0908884828180402010080402010103070f1f3f7fff010204081020408080402010080402018040201008040201fefcf8f0e0c08000008000a000a800aa008000a000a800aa0102050a152a55aa00000000000000000000000000000000002a000a0002000055aa54a850a040808040a050a854aa558040a050a854aa550103070f1f3f7fff01020408102040808040201008040201aa552a150a050201fffefcf8f0e0c080a264697066735822122006731cb67252eb84a25ba6c8f4dfe676857c6017b41fd69b056ad11443e6c4ac64736f6c63430008070033323034382062797465206f6e20636861696e2050524720666f722074686520436f6d6d6f646f7265203634
Deployed Bytecode
0x6080604052600436106102885760003560e01c80636cfa24cc1161015a578063b88d4fde116100c1578063e985e9c51161007a578063e985e9c5146107ce578063f0f49ef514610817578063f2fde38b14610837578063f4a0a52814610857578063f8654e8214610877578063fd7cbad61461089757600080fd5b8063b88d4fde1461070e578063bdcf2f0e1461072e578063c87b56dd1461074e578063d18434151461076e578063d71a7a301461078e578063e34cb05d146107ae57600080fd5b80638da5cb5b116101135780638da5cb5b1461065b57806390c3f38f1461067957806395d89b4114610699578063a22cb465146106ae578063a2c6e888146106ce578063aa28d67d146106ee57600080fd5b80636cfa24cc146105a65780636f790d2c146105c657806370a08231146105e6578063715018a6146106065780637ec1d1b11461061b57806382fc31471461063b57600080fd5b80633f109376116101fe5780636352211e116101b75780636352211e146104c557806367da849d146104e55780636817c76c14610505578063698f87be1461051b5780636a37d7d31461053b5780636be636691461056d57600080fd5b80633f1093761461040557806340bb4abb1461042557806342842e0e1461044557806342bbf40a146104655780634f6ccce7146104855780636071862d146104a557600080fd5b80631f4f5a23116102505780631f4f5a231461035d5780632004ffd91461037d57806321af8ed91461038557806323b872dd146103a55780632e1a7d4d146103c55780632f745c59146103e557600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c57806318160ddd1461033e575b600080fd5b34801561029957600080fd5b506102ad6102a8366004613c4c565b6108b7565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d76108c8565b6040516102b99190614346565b3480156102f057600080fd5b506103046102ff366004613d3d565b61095a565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c610337366004613bad565b610981565b005b34801561034a57600080fd5b506008545b6040519081526020016102b9565b34801561036957600080fd5b506102d7610378366004613d3d565b610a9c565b61034f610c3a565b34801561039157600080fd5b5061033c6103a0366004613dc6565b610d78565b3480156103b157600080fd5b5061033c6103c0366004613ab7565b610e0a565b3480156103d157600080fd5b5061033c6103e0366004613d3d565b610e3b565b3480156103f157600080fd5b5061034f610400366004613bad565b610eaa565b34801561041157600080fd5b5061034f610420366004613d3d565b610f40565b34801561043157600080fd5b506102d7610440366004613d79565b610f67565b34801561045157600080fd5b5061033c610460366004613ab7565b61188d565b34801561047157600080fd5b5061033c610480366004613bad565b6118a8565b34801561049157600080fd5b5061034f6104a0366004613d3d565b611906565b3480156104b157600080fd5b506102ad6104c0366004613d3d565b611999565b3480156104d157600080fd5b506103046104e0366004613d3d565b6119c1565b3480156104f157600080fd5b506102d7610500366004613d79565b611a21565b34801561051157600080fd5b5061034f600c5481565b34801561052757600080fd5b50601254610304906001600160a01b031681565b34801561054757600080fd5b5061055b610556366004613d3d565b611a40565b60405160ff90911681526020016102b9565b34801561057957600080fd5b5061058d610588366004613d3d565b611a68565b60405167ffffffffffffffff90911681526020016102b9565b3480156105b257600080fd5b5061033c6105c1366004613c86565b611a90565b3480156105d257600080fd5b5061033c6105e1366004613d3d565b611aab565b3480156105f257600080fd5b5061034f610601366004613a5a565b611aec565b34801561061257600080fd5b5061033c611b72565b34801561062757600080fd5b506102d7610636366004613d79565b611b86565b34801561064757600080fd5b5061033c610656366004613a5a565b612848565b34801561066757600080fd5b50600a546001600160a01b0316610304565b34801561068557600080fd5b5061033c610694366004613c86565b612872565b3480156106a557600080fd5b506102d761288d565b3480156106ba57600080fd5b5061033c6106c9366004613b78565b61289c565b3480156106da57600080fd5b5061033c6106e9366004613c86565b6128a7565b3480156106fa57600080fd5b5061033c610709366004613dc6565b6128c2565b34801561071a57600080fd5b5061033c610729366004613af8565b6128ff565b34801561073a57600080fd5b5061033c610749366004613c0e565b612937565b34801561075a57600080fd5b506102d7610769366004613d3d565b6129f4565b34801561077a57600080fd5b506102d7610789366004613d56565b612b03565b34801561079a57600080fd5b5061033c6107a9366004613bd9565b612b37565b3480156107ba57600080fd5b5061033c6107c9366004613bad565b612bab565b3480156107da57600080fd5b506102ad6107e9366004613a7e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561082357600080fd5b506102d7610832366004613d79565b612bc8565b34801561084357600080fd5b5061033c610852366004613a5a565b612bd9565b34801561086357600080fd5b5061033c610872366004613d3d565b612c4f565b34801561088357600080fd5b5061033c610892366004613c86565b612c5c565b3480156108a357600080fd5b5061033c6108b2366004613d3d565b612c77565b60006108c282612ca2565b92915050565b6060600080546108d7906144e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610903906144e0565b80156109505780601f1061092557610100808354040283529160200191610950565b820191906000526020600020905b81548152906001019060200180831161093357829003601f168201915b5050505050905090565b600061096582612cc7565b506000908152600460205260409020546001600160a01b031690565b600061098c826119c1565b9050806001600160a01b0316836001600160a01b031614156109ff5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a1b5750610a1b81336107e9565b610a8d5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016109f6565b610a978383612d26565b505050565b6060610aa782611aab565b600082815260106020818152604080842054815180830190925260028252614e6f60f01b8284015293869052919052600882901c601f1691600160501b900460ff1615610b0a575060408051808201909152600381526259657360e81b60208201525b600084815260106020526040902054610b2590600716612d94565b610b7e6040518060400160405280602081526020017e0b0b0402060d010a0c0b06060e000f000f0f010b0d01000607000f000b0e068152508460ff1681518110610b7157610b7161458c565b016020015160f81c612d94565b610bcb6040518060400160405280602081526020017f010f000101010506020b0c0e0e060f0b0f0b0004010002070302030b010f060e8152508560ff1681518110610b7157610b7161458c565b600087815260106020908152604090912054610bea911c601f16612d94565b600088815260106020526040902054610c0c90600160401b900460ff16612d94565b85604051602001610c2296959493929190613ecb565b60405160208183030381529060405292505050919050565b600061040060115410610c7b5760405162461bcd60e51b815260206004820152600960248201526826b4b73a1037bb32b960b91b60448201526064016109f6565b6010610c8633611aec565b10610cbe5760405162461bcd60e51b81526020600482015260086024820152672634b6b4ba10189b60c11b60448201526064016109f6565b600c54341015610cfd5760405162461bcd60e51b815260206004820152600a6024820152694d696e7420707269636560b01b60448201526064016109f6565b6011805460018101909155610d123382612e92565b4233610d1d83612d94565b604051602001610d2f939291906142ca565b60408051601f198184030181529181528151602092830120600084815260109093529120805467ffffffffffffffff191660c09290921c91909117815542600190910155919050565b610d8233836118a8565b60008281526010602052604090205460ff600160401b90910481169082161115610dd75760405162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b60448201526064016109f6565b600091825260106020526040909120805460ff909216600160481b0269ff00000000000000000019909216919091179055565b610e143382612eac565b610e305760405162461bcd60e51b81526004016109f6906143ab565b610a97838383612f2a565b610e436130d1565b47811115610e795760405162461bcd60e51b8152602060048201526003602482015262105b5d60ea1b60448201526064016109f6565b604051339082156108fc029083906000818181858888f19350505050158015610ea6573d6000803e3d6000fd5b5050565b6000610eb583611aec565b8210610f175760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109f6565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000610f4b82611aab565b6000828152601060205260409020600101546108c2904261449d565b6060610f7285611aab565b600085815260106020526040902054600160501b900460ff16610fc05760405162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b60448201526064016109f6565b6000610fce86868686611b86565b905060005b6101c981101561104a576040518061020001604052806101c981526020016145e46101c99139818151811061100a5761100a61458c565b602001015160f81c60f81b8282610548018151811061102b5761102b61458c565b60200101906001600160f81b031916908160001a905350600101610fd3565b60008781526010602052604090205460011c6003908116141561109857600f60f81b826106ce815181106110805761108061458c565b60200101906001600160f81b031916908160001a9053505b8561118e57600360fa1b826106ce815181106110b6576110b661458c565b60200101906001600160f81b031916908160001a905350600560f91b8261066d815181106110e6576110e661458c565b60200101906001600160f81b031916908160001a905350600160fb1b82610675815181106111165761111661458c565b60200101906001600160f81b031916908160001a905350600360fa1b82610676815181106111465761114661458c565b60200101906001600160f81b031916908160001a905350600560f91b82610677815181106111765761117661458c565b60200101906001600160f81b031916908160001a9053505b60008781526010602052604090205460021c600716600381111561132b5760ee60f81b8361035e815181106111c5576111c561458c565b60200101906001600160f81b031916908160001a90535060d060f81b83610360815181106111f5576111f561458c565b60200101906001600160f81b031916908160001a90535080600414156112995760d060f81b8361054d8151811061122e5761122e61458c565b60200101906001600160f81b031916908160001a90535050600087815260106020526040902054825160079190911c600216906016820160f81b90849061035f90811061127d5761127d61458c565b60200101906001600160f81b031916908160001a905350611541565b80600514156112bb57602160f81b8361035f8151811061127d5761127d61458c565b806006141561130d57602060f81b83610360815181106112dd576112dd61458c565b60200101906001600160f81b031916908160001a905350600060f81b8361035f8151811061127d5761127d61458c565b601660f81b8361035f8151811061127d5761127d61458c565b611541565b806003141561137d5760a560f81b836103308151811061134d5761134d61458c565b60200101906001600160f81b031916908160001a905350607060f81b836103318151811061127d5761127d61458c565b80600214156113bc57600088815260106020526040902054835160f89190911b6001600160f81b03191690849061034790811061127d5761127d61458c565b80600114156114e05760008881526010602052604090205460061c60011661145f57600091505b600682101561132657604051806040016040528060068152602001650ee21d0ee20d60d41b815250828151811061141c5761141c61458c565b602001015160f81c60f81b83836102f3018151811061143d5761143d61458c565b60200101906001600160f81b031916908160001a9053506001909101906113e3565b600091505b600682101561132657604051806040016040528060068152602001650ee21d0ee20d60d41b815250828151811061149d5761149d61458c565b602001015160f81c60f81b838361033a01815181106114be576114be61458c565b60200101906001600160f81b031916908160001a905350600190910190611464565b60a460f81b836102ff815181106114f9576114f961458c565b60200101906001600160f81b031916908160001a905350608160f81b83610300815181106115295761152961458c565b60200101906001600160f81b031916908160001a9053505b60008881526010602052604090205460be60089190911c60ff1611156115c057608a60f81b836055815181106115795761157961458c565b60200101906001600160f81b031916908160001a90535060ea60f81b836056815181106115a8576115a861458c565b60200101906001600160f81b031916908160001a9053505b600088815260106020526040902054603c600e9190911c60ff1611156116ee57600091505b600d821015611668576040518060400160405280600d81526020016c018ad18d06902290e09e08d18d609c1b81525082815181106116255761162561458c565b602001015160f81c60f81b83836102c201815181106116465761164661458c565b60200101906001600160f81b031916908160001a9053506001909101906115e5565b600091505b60068210156116e95760405180604001604052806006815260200165054f4468c68360d51b81525082815181106116a6576116a661458c565b602001015160f81c60f81b83836102b701815181106116c7576116c761458c565b60200101906001600160f81b031916908160001a90535060019091019061166d565b61174f565b60ea60f81b83610304815181106117075761170761458c565b60200101906001600160f81b031916908160001a90535060ea60f81b83610305815181106117375761173761458c565b60200101906001600160f81b031916908160001a9053505b600088815260106020526040902054607f60169190911c60ff1611156117f757600091505b60088210156117f25760405180604001604052806008815260200167103e851480c8a87560c11b81525082815181106117af576117af61458c565b602001015160f81c60f81b83836102a001815181106117d0576117d061458c565b60200101906001600160f81b031916908160001a905350600190910190611774565b61187f565b600091505b600d82101561187f576040518060400160405280600d81526020016c0103e85468010103e854682103609d1b815250828151811061183c5761183c61458c565b602001015160f81c60f81b838361028c018151811061185d5761185d61458c565b60200101906001600160f81b031916908160001a9053506001909101906117fc565b50909150505b949350505050565b610a97838383604051806020016040528060008152506128ff565b6118b181611aab565b816001600160a01b03166118c4826119c1565b6001600160a01b031614610ea65760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b60448201526064016109f6565b600061191160085490565b82106119745760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109f6565b600882815481106119875761198761458c565b90600052602060002001549050919050565b60006119a482611aab565b50600090815260106020526040902054600160501b900460ff1690565b6000818152600260205260408120546001600160a01b0316806108c25760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109f6565b6060611a37611a3286868686610f67565b61312b565b95945050505050565b6000611a4b82611aab565b50600090815260106020526040902054600160401b900460ff1690565b6000611a7382611aab565b5060009081526010602052604090205467ffffffffffffffff1690565b611a986130d1565b8051610ea690600d90602084019061395d565b6011548110611ae95760405162461bcd60e51b815260206004820152600a602482015269125b9d985b1a59081a5960b21b60448201526064016109f6565b50565b60006001600160a01b038216611b565760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016109f6565b506001600160a01b031660009081526003602052604090205490565b611b7a6130d1565b611b84600061327f565b565b6060611b9185611aab565b60006040518061082001604052806108008152602001614e9a61080091396000878152601060205260408120549192509081906007168015801590611bd65750600481105b15611c6657600181036038029150600092505b6038831015611c61576040518060e0016040528060a88152602001614df260a8913982840181518110611c1e57611c1e61458c565b602001015160f81c60f81b84846107c80181518110611c3f57611c3f61458c565b60200101906001600160f81b031916908160001a905350600190920191611be9565b611cf8565b6003811115611cf8576004810360ef029150600092505b60ef831015611cf857604051806103e001604052806103bc81526020016147ad6103bc913982840181518110611cb557611cb561458c565b602001015160f81c60f81b84846107110181518110611cd657611cd661458c565b60200101906001600160f81b031916908160001a905350600190920191611c7d565b6003811115611de357600092505b6101c9831015611d80576040518061020001604052806101c98152602001614c296101c991398381518110611d3d57611d3d61458c565b602001015160f81c60f81b84846105480181518110611d5e57611d5e61458c565b60200101906001600160f81b031916908160001a905350600190920191611d06565b601060f81b8460a581518110611d9857611d9861458c565b60200101906001600160f81b031916908160001a905350600f60f81b8460a681518110611dc757611dc761458c565b60200101906001600160f81b031916908160001a905350611e2e565b60008981526010602052604090205460031c60011615611e2e57600560f91b8461065181518110611e1657611e1661458c565b60200101906001600160f81b031916908160001a9053505b60ff871615611e67578660f81b8461018a81518110611e4f57611e4f61458c565b60200101906001600160f81b031916908160001a9053505b60ff861615611ea0578560f81b8461018681518110611e8857611e8861458c565b60200101906001600160f81b031916908160001a9053505b6000898152601060208190526040909120549081901c600716601890810293501c600f16886121a957600093506054015b6004841015611faf576040518060400160405280600481526020016218060360e11b8152508481518110611f0757611f0761458c565b602001015160f81c60f81b85856104a90181518110611f2857611f2861458c565b60200101906001600160f81b031916908160001a9053506040518060400160405280600481526020016206060360e11b8152508481518110611f6c57611f6c61458c565b602001015160f81c60f81b85856104ad0181518110611f8d57611f8d61458c565b60200101906001600160f81b031916908160001a905350600190930192611ed1565b60048210156121a957600093505b60048410156120385760405180604001604052806005815260200164181818018360db1b8152508481518110611ff557611ff561458c565b602001015160f81c60f81b858561064d01815181106120165761201661458c565b60200101906001600160f81b031916908160001a905350600190930192611fbd565b60008a81526010602052604090205460031c6001161561208757600360fa1b856106518151811061206b5761206b61458c565b60200101906001600160f81b031916908160001a9053506120b8565b600360fb1b85610651815181106120a0576120a061458c565b60200101906001600160f81b031916908160001a9053505b600160fa1b85610696815181106120d1576120d161458c565b60200101906001600160f81b031916908160001a905350605f60f81b8561057f815181106121015761210161458c565b60200101906001600160f81b031916908160001a905350600360fc1b856106ae815181106121315761213161458c565b60200101906001600160f81b031916908160001a905350600360fc1b8561075d815181106121615761216161458c565b60200101906001600160f81b031916908160001a905350600960fc1b85610763815181106121915761219161458c565b60200101906001600160f81b031916908160001a9053505b600093505b60188410156122c757806040518060e0016040528060c08152602001614b6960c09139848601815181106121e4576121e461458c565b602001015160f81c60f81b60f81c60ff160191506040518060e0016040528060a881526020016156da60a8913982815181106122225761222261458c565b602001015160f81c60f81b858561051801815181106122435761224361458c565b60200101906001600160f81b031916908160001a9053506040518060e0016040528060a8815260200161578260a8913982815181106122845761228461458c565b602001015160f81c60f81b858561053001815181106122a5576122a561458c565b60200101906001600160f81b031916908160001a9053506001909301926121ae565b60008a8152601060209081526040918290205482518084019093528183527f010f000101010506020b0c0e0e060f0b0f0b0004010002070302030b010f060e8383015260081c601f169350839081106123225761232261458c565b602001015160f81c60f81b8561017e815181106123415761234161458c565b60200101906001600160f81b031916908160001a9053506040518060400160405280602081526020017e0b0b0402060d010a0c0b06060e000f000f0f010b0d01000607000f000b0e06815250828151811061239e5761239e61458c565b602001015160f81c60f81b856056815181106123bc576123bc61458c565b60200101906001600160f81b031916908160001a90535060008a815260106020908152604090912054901c601f1660380292506106c883101561247957600093505b6038841015612479576040518061070001604052806106c8815260200161582a6106c89139848401815181106124365761243661458c565b602001015160f81c60f81b85856104c001815181106124575761245761458c565b60200101906001600160f81b031916908160001a9053506001909301926123fe565b60008a8152601060205260409020548551602882901c60ff16935060d09190911b6001600160f81b0319169086906104a89081106124b9576124b961458c565b60200101906001600160f81b031916908160001a90535060008a8152601060208181526040928390205483518085019094528284526f1d2b2d4d5f63656971878da9c3cfe7f560801b9184019190915260301c600f169350839081106125215761252161458c565b602001015160f81c60f81b85610287815181106125405761254061458c565b60200101906001600160f81b031916908160001a90535060008a81526010602052604081205490945067ffffffffffffffff60389190911c6007166003021691505b6003841015612617576040518060400160405280601881526020017f08000014000a14005014281478785050505060500a0204080000000000000000815250828501815181106125d4576125d461458c565b602001015160f81c60f81b85856104b101815181106125f5576125f561458c565b60200101906001600160f81b031916908160001a905350600190930192612582565b60008a81526010602052604081205490945067ffffffffffffffff603b9190911c6003166004021691505b60048410156126ca576040518060400160405280601081526020016f01900000a0a00000f0500000a100000160851b815250828501815181106126875761268761458c565b602001015160f81c60f81b85856104bc01815181106126a8576126a861458c565b60200101906001600160f81b031916908160001a905350600190930192612642565b60008a8152601060205260408120549094506004603d9190911c6001160267ffffffffffffffff1691505b60048410156127745760405180604001604052806008815260200166f502828192828560c51b815250828501815181106127315761273161458c565b602001015160f81c60f81b85856104b801815181106127525761275261458c565b60200101906001600160f81b031916908160001a9053506001909301926126f5565b601060008b815260200190815260200160002060000160089054906101000a900460ff1660010160f81b856101c6815181106127b2576127b261458c565b60200101906001600160f81b031916908160001a90535060008a815260106020526040902054600160481b900460ff161561283a5760008a8152601060205260409020548551600160481b90910460f81b6001600160f81b03191690869061010e9081106128225761282261458c565b60200101906001600160f81b031916908160001a9053505b509298975050505050505050565b6128506130d1565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b61287a6130d1565b8051610ea690600b90602084019061395d565b6060600180546108d7906144e0565b610ea63383836132d1565b6128af6130d1565b8051610ea690600e90602084019061395d565b6128cd338383612937565b600091825260106020526040909120805460ff909216600160401b0268ff000000000000000019909216919091179055565b6129093383612eac565b6129255760405162461bcd60e51b81526004016109f6906143ab565b612931848484846133a0565b50505050565b60048160ff16106129745760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b60448201526064016109f6565b6000604051806080016040528060008152602001620151806008612998919061447e565b81526020016129ab62015180601061447e565b81526020016201518060206129c0919061447e565b9052905060008160ff8416600481106129db576129db61458c565b602002015190506129ed858583612b37565b5050505050565b60606129ff82611aab565b6012546001600160a01b031615612a965760125460405163e9dc637560e01b8152306004820152602481018490526001600160a01b039091169063e9dc63759060440160006040518083038186803b158015612a5a57600080fd5b505afa158015612a6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c29190810190613ccf565b6000612aa183612d94565b90506000612af082600b612ab4856133d3565b612abd88610a9c565b612ac8896000612b03565b604051602001612adc959493929190614137565b60405160208183030381529060405261312b565b905080604051602001610c229190614254565b6060612b0e83611aab565b8115612b2957612b22836001600080611a21565b90506108c2565b612b22836001600080612bc8565b612b4183836118a8565b6000612b4c82612d94565b604051602001612b5c9190614299565b60408051601f198184030181529181526000858152601060205220600101549091508290612b8a904261449d565b101581906129ed5760405162461bcd60e51b81526004016109f69190614346565b6000612bbb62015180604061447e565b9050610a97838383612b37565b6060611a37611a3286868686611b86565b612be16130d1565b6001600160a01b038116612c465760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109f6565b611ae98161327f565b612c576130d1565b600c55565b612c646130d1565b8051610ea690600f90602084019061395d565b612c813382612bab565b6000908152601060205260409020805460ff60501b1916600160501b179055565b60006001600160e01b0319821663780e9d6360e01b14806108c257506108c28261340c565b6000818152600260205260409020546001600160a01b0316611ae95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109f6565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612d5b826119c1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606081612db85750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612de25780612dcc8161451b565b9150612ddb9050600a8361446a565b9150612dbc565b60008167ffffffffffffffff811115612dfd57612dfd6145a2565b6040519080825280601f01601f191660200182016040528015612e27576020820181803683370190505b5090505b841561188557612e3c60018361449d565b9150612e49600a86614536565b612e54906030614452565b60f81b818381518110612e6957612e6961458c565b60200101906001600160f81b031916908160001a905350612e8b600a8661446a565b9450612e2b565b610ea682826040518060200160405280600081525061345c565b600080612eb8836119c1565b9050806001600160a01b0316846001600160a01b03161480612eff57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806118855750836001600160a01b0316612f188461095a565b6001600160a01b031614949350505050565b826001600160a01b0316612f3d826119c1565b6001600160a01b031614612fa15760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109f6565b6001600160a01b0382166130035760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109f6565b61300e83838361348f565b613019600082612d26565b6001600160a01b038316600090815260036020526040812080546001929061304290849061449d565b90915550506001600160a01b0382166000908152600360205260408120805460019290613070908490614452565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b03163314611b845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f6565b606081516000141561314b57505060408051602081019091526000815290565b600060405180606001604052806040815260200161569a604091399050600060038451600261317a9190614452565b613184919061446a565b61318f90600461447e565b67ffffffffffffffff8111156131a7576131a76145a2565b6040519080825280601f01601f1916602001820160405280156131d1576020820181803683370190505b509050600182016020820185865187015b8082101561323d576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506131e2565b5050600386510660018114613259576002811461326c57613274565b603d6001830353603d6002830353613274565b603d60018303535b509195945050505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156133335760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109f6565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6133ab848484612f2a565b6133b7848484846134bd565b6129315760405162461bcd60e51b81526004016109f690614359565b60606000600d83600e85600f876040516020016133f596959493929190614071565b60408051601f198184030181529190529392505050565b60006001600160e01b031982166380ac58cd60e01b148061343d57506001600160e01b03198216635b5e139f60e01b145b806108c257506301ffc9a760e01b6001600160e01b03198316146108c2565b61346683836135c7565b61347360008484846134bd565b610a975760405162461bcd60e51b81526004016109f690614359565b61349a838383613715565b601154811015610a97576000908152601060205260409020426001909101555050565b60006001600160a01b0384163b156135bf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613501903390899088908890600401614309565b602060405180830381600087803b15801561351b57600080fd5b505af192505050801561354b575060408051601f3d908101601f1916820190925261354891810190613c69565b60015b6135a5573d808015613579576040519150601f19603f3d011682016040523d82523d6000602084013e61357e565b606091505b50805161359d5760405162461bcd60e51b81526004016109f690614359565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611885565b506001611885565b6001600160a01b03821661361d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109f6565b6000818152600260205260409020546001600160a01b0316156136825760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109f6565b61368e6000838361348f565b6001600160a01b03821660009081526003602052604081208054600192906136b7908490614452565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0383166137705761376b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613793565b816001600160a01b0316836001600160a01b0316146137935761379383826137cd565b6001600160a01b0382166137aa57610a978161386a565b826001600160a01b0316826001600160a01b031614610a9757610a978282613919565b600060016137da84611aec565b6137e4919061449d565b600083815260076020526040902054909150808214613837576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061387c9060019061449d565b600083815260096020526040812054600880549394509092849081106138a4576138a461458c565b9060005260206000200154905080600883815481106138c5576138c561458c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806138fd576138fd614576565b6001900381819060005260206000200160009055905550505050565b600061392483611aec565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054613969906144e0565b90600052602060002090601f01602090048101928261398b57600085556139d1565b82601f106139a457805160ff19168380011785556139d1565b828001600101855582156139d1579182015b828111156139d15782518255916020019190600101906139b6565b506139dd9291506139e1565b5090565b5b808211156139dd57600081556001016139e2565b6000613a09613a048461442a565b6143f9565b9050828152838383011115613a1d57600080fd5b828260208301376000602084830101529392505050565b80358015158114613a4457600080fd5b919050565b803560ff81168114613a4457600080fd5b600060208284031215613a6c57600080fd5b8135613a77816145b8565b9392505050565b60008060408385031215613a9157600080fd5b8235613a9c816145b8565b91506020830135613aac816145b8565b809150509250929050565b600080600060608486031215613acc57600080fd5b8335613ad7816145b8565b92506020840135613ae7816145b8565b929592945050506040919091013590565b60008060008060808587031215613b0e57600080fd5b8435613b19816145b8565b93506020850135613b29816145b8565b925060408501359150606085013567ffffffffffffffff811115613b4c57600080fd5b8501601f81018713613b5d57600080fd5b613b6c878235602084016139f6565b91505092959194509250565b60008060408385031215613b8b57600080fd5b8235613b96816145b8565b9150613ba460208401613a34565b90509250929050565b60008060408385031215613bc057600080fd5b8235613bcb816145b8565b946020939093013593505050565b600080600060608486031215613bee57600080fd5b8335613bf9816145b8565b95602085013595506040909401359392505050565b600080600060608486031215613c2357600080fd5b8335613c2e816145b8565b925060208401359150613c4360408501613a49565b90509250925092565b600060208284031215613c5e57600080fd5b8135613a77816145cd565b600060208284031215613c7b57600080fd5b8151613a77816145cd565b600060208284031215613c9857600080fd5b813567ffffffffffffffff811115613caf57600080fd5b8201601f81018413613cc057600080fd5b611885848235602084016139f6565b600060208284031215613ce157600080fd5b815167ffffffffffffffff811115613cf857600080fd5b8201601f81018413613d0957600080fd5b8051613d17613a048261442a565b818152856020838501011115613d2c57600080fd5b611a378260208301602086016144b4565b600060208284031215613d4f57600080fd5b5035919050565b60008060408385031215613d6957600080fd5b82359150613ba460208401613a34565b60008060008060808587031215613d8f57600080fd5b84359350613d9f60208601613a34565b9250613dad60408601613a49565b9150613dbb60608601613a49565b905092959194509250565b60008060408385031215613dd957600080fd5b82359150613ba460208401613a49565b60008151808452613e018160208601602086016144b4565b601f01601f19169290920160200192915050565b60008151613e278185602086016144b4565b9290920192915050565b8054600090600181811c9080831680613e4b57607f831692505b6020808410821415613e6d57634e487b7160e01b600052602260045260246000fd5b818015613e815760018114613e9257613ebf565b60ff19861689528489019650613ebf565b60008881526020902060005b86811015613eb75781548b820152908501908301613e9e565b505084890196505b50505050505092915050565b7f5b7b2274726169745f74797065223a2254797065222c2276616c7565223a2200815260008751613f0381601f850160208c016144b4565b7f227d2c7b2274726169745f74797065223a224647222c2276616c7565223a2200601f918401918201528751613f4081603e840160208c016144b4565b7f227d2c7b2274726169745f74797065223a224247222c2276616c7565223a2200603e92909101918201528651613f7e81605d840160208b016144b4565b7f227d2c207b2274726169745f74797065223a2243686172736574222c2276616c605d9290910191820152643ab2911d1160d91b607d8201528551613fca816082840160208a016144b4565b61406361405461404e6140196140136082868801017f227d2c7b2274726169745f74797065223a224d6f646573222c2276616c7565228152611d1160f11b602082015260220190565b8a613e15565b7f227d2c207b2274726169745f74797065223a225061746368222c2276616c7565815262111d1160e91b602082015260230190565b87613e15565b62227d5d60e81b815260030190565b9a9950505050505050505050565b681134b6b0b3b2911d1160b91b8152600061408f6009830189613e31565b875161409f818360208c016144b4565b7f2e706e67222c22616e696d6174696f6e5f75726c223a2200000000000000000091019081526140d26017820188613e31565b905085516140e4818360208a016144b4565b7111161132bc3a32b93730b62fbab936111d1160711b910190815261410c6012820186613e31565b9050835161411e8183602088016144b4565b601160f91b910190815260010198975050505050505050565b6f03d913730b6b2911d1137b930b0b732160851b81528551600090614163816010850160208b016144b4565b701116113232b9b1b934b83a34b7b7111d1160791b60109184019182015261418e6021820188613e31565b61088b60f21b815286519091506141ac816002840160208a016144b4565b6d161130ba3a3934b13aba32b9911d60911b6002929091019182015284516141db8160108401602089016144b4565b7f2c22707267223a22646174613a6170706c69636174696f6e2f782d6336342d70601092909101918201526d1c9bd9dc985b4ed8985cd94d8d0b60921b6030820152835161423081603e8401602088016144b4565b614247603e8284010161227d60f01b815260020190565b9998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161428c81601d8501602087016144b4565b91909101601d0192915050565b6802932b8903a34b6b2960bd1b8152600082516142bd8160098501602087016144b4565b9190910160090192915050565b8381526bffffffffffffffffffffffff198360601b166020820152600082516142fa8160348501602087016144b4565b91909101603401949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061433c90830184613de9565b9695505050505050565b602081526000613a776020830184613de9565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715614422576144226145a2565b604052919050565b600067ffffffffffffffff821115614444576144446145a2565b50601f01601f191660200190565b600082198211156144655761446561454a565b500190565b60008261447957614479614560565b500490565b60008160001904831182151516156144985761449861454a565b500290565b6000828210156144af576144af61454a565b500390565b60005b838110156144cf5781810151838201526020016144b7565b838111156129315750506000910152565b600181811c908216806144f457607f821691505b6020821081141561451557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561452f5761452f61454a565b5060010190565b60008261454557614545614560565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611ae957600080fd5b6001600160e01b031981168114611ae957600080fdfe4c7b0ea200d00ffe00d8fe00d9fe00dafe00dbcad0f1a46cc003d004a915d00e6674e6bda5bd29036900aabd6f0e8574c624c6a9d007a98085a920010fa5aca28520f30918a57f65bc857fc000f004a524d016a5a7395d0ed00f207d0ad9bb0ca900b003207d0a85bc207d0ac964b94f0eb003b9530e85ada20286a818a5a73d600e6524d005207d0a95b5bcea0b38b97000e906997000b00fb97100e900997100b005a90099710018b972007db00c997200b973006900997300a524d023a46cb51839770ebcea0b1875b5f618aabd0060997000bd0061997100a6a8b5ad997400a524d5a1d005a920997400ca108ba524d006a5aa8524e6a7a901857aa218b5709d00d4ca10f8604141414115514151ed98fae698fa031f0f1f3f7f648c6e010303070704080a0f5020508000070a0807000307a200207d0a291fc91810f7a8b9170dc5b3f0ef85b39d0060b92f0d9d0061cad0e1a214a900950385a7e003104e207d0a9518a94195ada46cb9730e85aabcea0b9673a910997500bd5a0e997600a56cd013a90a85aaa94195adbd570e997600bd630ed015c901d005bd660ed00cc902d005bd690ed003bd6c0e95a1ca10a5a901852485a98528a46cb9b30c8586b9b70c85ac60a930207d0a297fc90ab002690a85a0a9308551a9008550a207a03f207d0ac5a0b004a90191508810f2869ea940a25020f309ca10e4a907859ca003a207bd00309d3830ca10f7a9084820ef0f6838ad4f0fe9088d4f0f8810e2a92020ef0f18ad4f0f69608d4f0f9003ee500fc69c10c9a940859ca003a204b900309d0030e88810f618ad870f69088d870f9003ee880f18ad8a0f69088d8a0f9003ee8b0fc69cd0d2207d0a9031a204a0308451c8844fa9008550a9c0854ea03fb150914e8810f9869ea940a25020f30938a54ee940854eb002c64fcad0e0a9088dab0c8daf0c60186d4c0f8d4c0f9003ee4d0f60000000207d0a290785b4207d0a2907690e859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aa207d0aa59c2903a8b9dc0f855f20e00fc69cd0c9a907859ca003a207bd00309d3830ca10f7a9084820cf0f6838ad650fe9088d650f8810e2a92020cf0f18ad650f69608d650f9003ee660fc69c10c9a940859ca003a204b900309d0030e88810f618ad9d0f69088d9d0f9003ee9e0f18ada00f69088da00f9003eea10fc69cd0d2a9088dab0c8daf0c60186d620f8d620f9003ee630f6000010840a000a9019150869ea55fa25020f309ca10f060000000000000000000000000207d0a290785b4207d0a2907690e859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aa207d0aa59c2903a8b9dc0f855f20e00fc69cd0c9a907859ca003a207bd00309d3830ca10f7a9084820cf0f6838ad650fe9088d650f8810e2a92020cf0f18ad650f69608d650f9003ee660fc69c10c9a940859ca003a204b900309d0030e88810f618ad9d0f69088d9d0f9003ee9e0f18ada00f69088da00f9003eea10fc69cd0d2a9088dab0c8daf0c60186d620f8d620f9003ee630f60000105bda000a9019150869ea55fa25020f309ca10f060000000000000000000000000207d0a290f69028de00fa90f85b4207d0a29076906859cd006a59c2903d017a9308551207d0a2903d002e651207d0a29db1869008550207d0a25b4aaa59c2901a8b9e00f855f20e40fc69cd0cca907859ca003a207bd00309d3830ca10f7a9084820d30f6838ad690fe9088d690f8810e2a92020d30f18ad690f69608d690f9003ee6a0fc69c10c9a940859ca003a204b900309d0030e88810f618ada10f69088da10f9003eea20f18ada40f69088da40f9003eea50fc69cd0d2a9088dab0c8daf0c60186d660f8d660f9003ee670f6000010840a000a9019150869eade00fa25020f309ca10ef60000000000000000c13181f22181618181f242b2e242224181f242b2e2422240c13181c211f1518181f24282d2b2124181f24282d2b21240c13181b221f1618181f24272e2b2224181f24272e2b22240c13181c231f1718181f24282f2b2324181f24282f2b23240c13181c231f1718181f24282f2b2324302b24283b3723300c13181c221f1618181f24282e2b2224302b24283a3722300c12181b221e1618181e24272e2a2224302a24273a3622300c12181b211e1518181e24272d2a2124302a2433393621304c740ea46cc624c6a9d00aa98085a9a52849018528a528d00aa5aca28520f3094c750d38a585e5ac8585b002c68618a57f65bc857fc4cff004a524d02da5a739620ed026207d0ad9bb0ca900b003207d0a85bca524d013207d0ac964290885cfb9540eb003b9580e85ada20286a818a5a73d650e6524d005207d0a95b5bcea0bb97400c951f039b5b9d01a18b972007db00c997200900eb973006900290fd002f6b9997300b5b9f01a38b97200fdb00c997200b00eb97300e900290fd002d6b9997300a524d01db51829071875b5f618aabd0060997000bd0061997100a6a8b5ad997400a524d5a1d008b9740029fe997400ca30034cb30da524d006a5aa8524e6a7a218b5709d00d4ca10f8601141414115514151899cdd8689d9031f0f1f3f7f6e8c6e0208080c0c04080a0fa200207d0a291fc91810f7a8b9170dc5b3f0ef85b39d0060b92f0d9d0061cad0e1a214a900950385a7e0031053207d0a9518a94195ada46cb9ac0c85aabcea0b9673a910997500bd5f0e997600a56cd018a9ff85aaa91195ada9f0997500bd5c0e997600bd680ed015c901d005bd6b0ed00cc902d005bd6e0ed003bd710e95a1ca10a0a901852485a98528a46ca9788585b9b30c8586b9b70c85ac60a9308551a207a03feea70c207d0addf20fb004a90191508810eea551854f869ea940a25020f309ca10dc60080e141e3250648c0000000000207d0a293f692ec9549008a2088eab0c8eaf0c85a0a9308551a207a03f207d0ac5a0b004a90191508810f2869ea940a25020f309ca10e460a9a085a0207d0a2907855f29fdd002e65fa9308551a207a03f207d0ac5a0b004a90191503898e55fa810ee869ea940a25020f309ca10e06001080b0800009e323036320000000078a9358501a97f8d0ddc8d0dddad0ddcad0ddda92c8dfaffa90a8dfbffa9018d1ad0a9188d11d0a9ff8dfeffa9098dffffa2fd8e12d0a9009d00309dfc309df93195019dff1fa9089dffd79dfcd89df9d99deadabdbe0c9d0f20bdf60c9d2723cad0d3a93c855ba9e88d18d0a0b4a9038560a9008556b9f20b8848293f9d0070e86829c005564a4a8556c660d0e89d0070e898d0d920c70fa2208e30348666a2488665a7b88d003418bd003469089d0134bd303469009d3134e8e02ed0eaa438be0070bd003485618567bd30348562a9238568be2270bd00348563bd30348564a007b16749ff3163116191658810f3a908a26520f309e638a538c922d0c0a900856c20e20aa203a9ec8dff59a9008d3f5abdcf0a8d3f0a8d500a8d580abdd50a8d440abdd60a8d560abdd40a8596bdd30a8597bdda0a8598bdde0a85998656a22b869ba2fe869da000a201a599202d0ae8e009d0f8a6978696a219869ba202869da207202d0acad0faa656ca1099a9008d20d08d21d0a91f8588a9f4858758af00dcc52ff03b852f2904d002e6578a2908d002c6578a2901d008a558c908f002e6588a2902d006a558f002c6588a2910d00fe66ca56cc9043004a900856c20e20aa66cf01abdec0b8deb09bdef0b8dec09a56ddda80c3007a900856d20b50a20f20a4c8d0918750095009002f601a69e60488a489848a9ff8d19d0204a0de66da55ef014a55b855d4904855bad18d049108d18d0a900855e68a868aa684040869c186596484818a59b659d859b859a68990050481869ffc01d1006e49cd002a9ff99005168481869f8990052681865984818b9ff59659a99005ab93f5a690099405aa902859a68c8cad0c568a69c60ada70cf0030a9002492d8da70c60a9308551a9008550a9408537a000b1508556a007b350a556915086568810f5a908a25020f309c637d0e260c66e3002d004a908856e6018a5586901c909d002a900855860004080c00108fff80108fff90907f7f8084737a9088558a964856da900856e20470d60a55ef002ea60a55b8551a204a000988550915088d0fbe651cad0f1a5572903aabdcf0a8d610b8d770b8d840ba558d003e65e608536a9008554a9308555a93e8530a55b8531a56ef004c536d003205b0b38a530e9288530b002c631a940a25420f309c636d0dfe65e60a200eaeaeabc0050b154f07a18bd005a65308550bd405a65318551bc0051b154c0ffd002a9008533bc0052b15485328660a000b350bd4470e000f00ac909d006a633f002a9019150c8b350bd6f70e000f00ac90fd006a632f002a9019150a028b150f006a903a633d002a9029150c8a9049150a050b350bd9a709150c8b350bdc5709150a660e8e040f0034c5d0b6000070ec1b68b0a0a0aa11fa0088808a1209f5ddc9f5fdfe2a11e5e5ee0de08880808881f48dd9c48c82a8787595a98ea999959a99b9a5897564747470747d9589b1a5987075796150752d2a79414536828a853e75212d25212925352114f13145111515206d14f0f062666a3a625e48e0ece0ece8ea4664d25e44d8d0ccc0ecd0c0a89ce0cc5490a85c55cdf5d5695535550c704428b088584020dc80544c10786030107870645850548480888080787070747c70646860645850545457500280a05000a0a0560500a145028141ea05050220000328000e000f800fe008000e000f800fe000103070f1f3f7fff00000000000000000000000000000000ff003f000f000300fffefcf8f0e0c0800103070f1f3f7fff80c0e0f0f8fcfeffff7f3f1f0f070301fffefcf8f0e0c0802d435a7c5285a95a5a85b4f7a30a52b45a85b4f7a30a52b402030405070603040406080a0e0d07080406080a0e0d07084c7a0fa528d00aa52ba28520f3094c680d38a585e52b8585b007c686100320bd0fc629d00dc62ad009a5284901852820b40fc6241004a94f8524a202a524d007d60fd00320670ebcea0b18b970007509997000b97100750c997100b574c951f03cb5b9d01a18b972007db00c997200900eb973006900290fd002f6b9997300b5b9f01a38b97200fdb00c997200b00eb97300e900290fd002d6b9997300d612d015b506f011b9740049019974004ab5069002b5039512b515f032d615d02eb51ef005d6184c100ef618b51818862d351b7521aab97400c981f00cbd170d997000bd2f0d997100a62db5259515ca30034c830da218b5709d00d4ca10f860100804010707070fa0a0a00a140000000808020032001e0014b4321111418161dddebfbd440ea46cd0010a950fb9b70c852b207d0a39480e0903951b207d0a39470e79530e29079521207d0a2901951ea903855fb9ac0c9525c001d004a9288526c908d002065fa55f95039512207d0ad95b0ea900b002a9029506f612a9019515a941bcea0b997400a46ce002d01a207d0ad9bb0ca900b00e207d0ac920b004a9158582207d0a850e207d0ad9570eb008a9518574a9018573b9b30c859fe000d02d20bd0fc003d0268609207d0ac932b01d290385098625207d0ac932a981b002a9158574861ba55f8503a9028506207d0ad9590eb006a9008523851d98d035bcea0ba911997400e002d00b207d0a2903a8b95f0e8582a92895039512a9789506f612207d0a2907a8b94c0e9525207d0a2901850a60a9018524a214a9009503e0031029bcea0ba56cd010bd650e997500bd620e090d997600d00ba911997500bd620e997600967320670ef60fca10cca9648529a901852a60a59f8586a9008528f0eda9308551a207a03fe007f004b14ef00c207d0addf70fb004a90191508810e9a551854f18a550854e694085509002e651ca10d3603c648cdc4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f1727394b5f748aa1bad4f00e2d4e7196bee8144374a9e11c5a9ce22d7ccf2885e852c137b439c55af79e4f0ad1a3826e68718ab3ee3c9e15a24604dcd0e21467dd793c29448d08b8a1c528cdbaf17853871a10710c1c2d3f52667b92aac3defa18385a7ea4ccf7245486bcf53171b5fc4898ee48a90d79ea62e26af89030dc90521af2d4c4c4d4f02060b820a434e4a88888a8e040c070404868c850101050c08080e08090d090a00101010101010101010101020202020202020303030303040404040505050606060707080809090a0a0b0c0d0d0e0f10111213141517181a1b1d1f20222427292b2e3134373a3e4145494e52575c62686e757c83010101010101010101010101020202020202020303030303040404040505050606070707080809090a0b0b0c0d0e0e0f10111213151617191a1c1d1f212325272a2c2f3235383b3f43474b4f54595e646a70777e8000e000f800fe008000e000f800fe000102070a1f2a7faa00000000000000000000000000000000ff003f000f000300ffaafca8f0a0c08080c0a0908884828180c0a0908884828101030509112141810102040810204080804020100804020181412111090503018182848890a0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103070f1f3f7fff00000000000000000000000000000000ff7f3f1f0f070301fffefcf8f0e0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103050911214181010204081020408080402010080402017f3f1f0f07030100010204081020408020104864524944422010486452494442040812264a922242000001020408102000008040201008044222120a06020000424448506040000080402090c8e4723980402090c8e472390102040913274e9c010204081020408080402010080402019c4e2713090402013972e4c8902040808040209048a452298040209048a452290102040912254a9401020408102040808040201008040201944a2512090402012952a4489020408080c0e0b0988c868380c0e0b0988c86830103070d193161c101020408102040808040201008040201c16131190d07030183868c98b0e0c08080c0e0b0d8acd6ab80c0e0b0d8acd6ab0103070d1b356bd501020408102040808040201008040201d56b351b0d070301abd6acd8b0e0c08080c0a0908884c2a180402010088442210102050b162d5bb70102040810204080804020100804020190482412090402016fdebc78f0e0c08080c0a09098a4c28180c0a09098a4c28101030509192543810102040810204080804020100804020181412111090503018182848890a0c08080c0a09088a492a980402010082412290103070f1d3b75eb01020408102040808040201008040201944a241208040201d7aedcb8f0e0c08080c0e0f0f8fcfeff80c0e0f0f8fcfeff0103070f1f3f7fff01020408102040808040201008040201ff7f3f1f0f070301fffefcf8f0e0c0808000200088002200800020008800220000000200080022000000000000000000000000000000000088002200080002008800200080000000804020904824924980402090482492490102050b162d5bb60102040810204080804020100804020192492412090402016ddab468d0a0408000c000f000fc00ff00c000f000fc00ff0103050e173b5dee00000000000000000000000000000000007f001f0007000177badce870a0c0808000a000a800aa008000a000a800aa000102070a1f2a7faa00000000000000000000000000000000aa002a000a000200ffaafca8f0a0c08080c0a0d0a8d4aad58040a050a854aa550103070f1f3f7fff01020408102040808040201008040201aa552a150a050201fffefcf8f0e0c08080c0a09088c4a29180402010884422110103070f1e3d7bf7010204081020408080402010080402018844221108040201efdebc78f0e0c0808040209048a452298040209048a452290102050b162d5bb601020408102040808040201008040201944a2512090402016ddab468d0a04080804020100804020180402010080402010102040810204080010204081020408080402010080402018040201008040201010204081020408080402090c864b2d980402090c864b2d90102040913264d9b01020408102040808040201008040201ec763b1d0e070301376edcb870e0c0808000e000f800fe008000e000f800fe00010007001f007f0000000000000000000000000000000000ff003f000f000300ff00fc00f000c0008040a050a854aa558040a050a854aa55000102050a152a5500000000000000000000000000000000aa552a150a050201aa54a850a04080008040201088442211804020108844221101020408112244880102040810204080804020100804020188442211080402011122448810204080000080002000880000008000200088000101040613194c660000000000000000000000000000000022000800020000003398cc603080c000000080402010884400008040201088440101040613194c660000000000000000000000000000000022110804020100003398cc603080c0008000a000a800aa008000a000a800aa00000002000a002a0000000000000000000000000000000000aa002a000a000200aa00a800a000800080c0a0908884828180402010080402010103070f1f3f7fff010204081020408080402010080402018040201008040201fefcf8f0e0c08000008000a000a800aa008000a000a800aa0102050a152a55aa00000000000000000000000000000000002a000a0002000055aa54a850a040808040a050a854aa558040a050a854aa550103070f1f3f7fff01020408102040808040201008040201aa552a150a050201fffefcf8f0e0c080a264697066735822122006731cb67252eb84a25ba6c8f4dfe676857c6017b41fd69b056ad11443e6c4ac64736f6c63430008070033
Deployed Bytecode Sourcemap
49847:36615:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81518:192;;;;;;;;;;-1:-1:-1;81518:192:0;;;;;:::i;:::-;;:::i;:::-;;;17285:14:1;;17278:22;17260:41;;17248:2;17233:18;81518:192:0;;;;;;;;29460:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30973:171::-;;;;;;;;;;-1:-1:-1;30973:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;16583:32:1;;;16565:51;;16553:2;16538:18;30973:171:0;16419:203:1;30490:417:0;;;;;;;;;;-1:-1:-1;30490:417:0;;;;;:::i;:::-;;:::i;:::-;;43372:113;;;;;;;;;;-1:-1:-1;43460:10:0;:17;43372:113;;;27028:25:1;;;27016:2;27001:18;43372:113:0;26882:177:1;69063:945:0;;;;;;;;;;-1:-1:-1;69063:945:0;;;;;:::i;:::-;;:::i;67174:616::-;;;:::i;81002:249::-;;;;;;;;;;-1:-1:-1;81002:249:0;;;;;:::i;:::-;;:::i;31673:336::-;;;;;;;;;;-1:-1:-1;31673:336:0;;;;;:::i;:::-;;:::i;82204:180::-;;;;;;;;;;-1:-1:-1;82204:180:0;;;;;:::i;:::-;;:::i;43040:256::-;;;;;;;;;;-1:-1:-1;43040:256:0;;;;;:::i;:::-;;:::i;70014:208::-;;;;;;;;;;-1:-1:-1;70014:208:0;;;;;:::i;:::-;;:::i;75981:3065::-;;;;;;;;;;-1:-1:-1;75981:3065:0;;;;;:::i;:::-;;:::i;32080:185::-;;;;;;;;;;-1:-1:-1;32080:185:0;;;;;:::i;:::-;;:::i;79387:183::-;;;;;;;;;;-1:-1:-1;79387:183:0;;;;;:::i;:::-;;:::i;43562:233::-;;;;;;;;;;-1:-1:-1;43562:233:0;;;;;:::i;:::-;;:::i;70642:213::-;;;;;;;;;;-1:-1:-1;70642:213:0;;;;;:::i;:::-;;:::i;29171:222::-;;;;;;;;;;-1:-1:-1;29171:222:0;;;;;:::i;:::-;;:::i;75628:277::-;;;;;;;;;;-1:-1:-1;75628:277:0;;;;;:::i;:::-;;:::i;50171:35::-;;;;;;;;;;;;;;;;66998:34;;;;;;;;;;-1:-1:-1;66998:34:0;;;;-1:-1:-1;;;;;66998:34:0;;;70436:200;;;;;;;;;;-1:-1:-1;70436:200:0;;;;;:::i;:::-;;:::i;:::-;;;27441:4:1;27429:17;;;27411:36;;27399:2;27384:18;70436:200:0;27269:184:1;70228:202:0;;;;;;;;;;-1:-1:-1;70228:202:0;;;;;:::i;:::-;;:::i;:::-;;;27238:18:1;27226:31;;;27208:50;;27196:2;27181:18;70228:202:0;27064:200:1;82390:153:0;;;;;;;;;;-1:-1:-1;82390:153:0;;;;;:::i;:::-;;:::i;79188:127::-;;;;;;;;;;-1:-1:-1;79188:127:0;;;;;:::i;:::-;;:::i;28902:207::-;;;;;;;;;;-1:-1:-1;28902:207:0;;;;;:::i;:::-;;:::i;7941:103::-;;;;;;;;;;;;;:::i;71486:4052::-;;;;;;;;;;-1:-1:-1;71486:4052:0;;;;;:::i;:::-;;:::i;82975:128::-;;;;;;;;;;-1:-1:-1;82975:128:0;;;;;:::i;:::-;;:::i;7293:87::-;;;;;;;;;;-1:-1:-1;7366:6:0;;-1:-1:-1;;;;;7366:6:0;7293:87;;82853:116;;;;;;;;;;-1:-1:-1;82853:116:0;;;;;:::i;:::-;;:::i;29629:104::-;;;;;;;;;;;;;:::i;31216:155::-;;;;;;;;;;-1:-1:-1;31216:155:0;;;;;:::i;:::-;;:::i;82549:162::-;;;;;;;;;;-1:-1:-1;82549:162:0;;;;;:::i;:::-;;:::i;80786:169::-;;;;;;;;;;-1:-1:-1;80786:169:0;;;;;:::i;:::-;;:::i;32336:323::-;;;;;;;;;;-1:-1:-1;32336:323:0;;;;;:::i;:::-;;:::i;80050:337::-;;;;;;;;;;-1:-1:-1;80050:337:0;;;;;:::i;:::-;;:::i;67872:790::-;;;;;;;;;;-1:-1:-1;67872:790:0;;;;;:::i;:::-;;:::i;70861:350::-;;;;;;;;;;-1:-1:-1;70861:350:0;;;;;:::i;:::-;;:::i;79658:348::-;;;;;;;;;;-1:-1:-1;79658:348:0;;;;;:::i;:::-;;:::i;80465:196::-;;;;;;;;;;-1:-1:-1;80465:196:0;;;;;:::i;:::-;;:::i;31442:164::-;;;;;;;;;;-1:-1:-1;31442:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31563:25:0;;;31539:4;31563:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31442:164;71217:263;;;;;;;;;;-1:-1:-1;71217:263:0;;;;;:::i;:::-;;:::i;8199:201::-;;;;;;;;;;-1:-1:-1;8199:201:0;;;;;:::i;:::-;;:::i;82091:107::-;;;;;;;;;;-1:-1:-1;82091:107:0;;;;;:::i;:::-;;:::i;82717:130::-;;;;;;;;;;-1:-1:-1;82717:130:0;;;;;:::i;:::-;;:::i;81280:156::-;;;;;;;;;;-1:-1:-1;81280:156:0;;;;;:::i;:::-;;:::i;81518:192::-;81641:4;81666:38;81691:11;81666:23;:38::i;:::-;81659:45;81518:192;-1:-1:-1;;81518:192:0:o;29460:100::-;29514:13;29547:5;29540:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29460:100;:::o;30973:171::-;31049:7;31069:23;31084:7;31069:14;:23::i;:::-;-1:-1:-1;31112:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31112:24:0;;30973:171::o;30490:417::-;30571:13;30587:23;30602:7;30587:14;:23::i;:::-;30571:39;;30635:5;-1:-1:-1;;;;;30629:11:0;:2;-1:-1:-1;;;;;30629:11:0;;;30621:57;;;;-1:-1:-1;;;30621:57:0;;24846:2:1;30621:57:0;;;24828:21:1;24885:2;24865:18;;;24858:30;24924:34;24904:18;;;24897:62;-1:-1:-1;;;24975:18:1;;;24968:31;25016:19;;30621:57:0;;;;;;;;;5918:10;-1:-1:-1;;;;;30713:21:0;;;;:62;;-1:-1:-1;30738:37:0;30755:5;5918:10;31442:164;:::i;30738:37::-;30691:174;;;;-1:-1:-1;;;30691:174:0;;22670:2:1;30691:174:0;;;22652:21:1;22709:2;22689:18;;;22682:30;22748:34;22728:18;;;22721:62;22819:32;22799:18;;;22792:60;22869:19;;30691:174:0;22468:426:1;30691:174:0;30878:21;30887:2;30891:7;30878:8;:21::i;:::-;30560:347;30490:417;;:::o;69063:945::-;69177:13;69203:21;69216:7;69203:12;:21::i;:::-;69233:11;69254:18;;;:9;:18;;;;;;;;:25;69302:26;;;;;;;;;;;-1:-1:-1;;;69302:26:0;;;;69338:18;;;;;;;69283:1;69254:30;;;69288:4;69253:39;;-1:-1:-1;;;69338:32:0;;;;69335:67;;;-1:-1:-1;69381:13:0;;;;;;;;;;;;-1:-1:-1;;;69381:13:0;;;;69335:67;69511:18;;;;:9;:18;;;;;:25;69494:48;;69539:1;69511:29;69494:16;:48::i;:::-;69589:40;69612:8;;;;;;;;;;;;;;;;;69621:5;69612:15;;;;;;;;;;:::i;:::-;;;;;;;69589:16;:40::i;:::-;69676;69699:8;;;;;;;;;;;;;;;;;69708:5;69699:15;;;;;;;;;;:::i;69676:40::-;69787:18;;;;:9;69816:2;69787:18;;;;;;;:25;69769:58;;69787:31;69822:4;69786:40;69769:16;:58::i;:::-;69894:18;;;;:9;:18;;;;;:24;69877:42;;-1:-1:-1;;;69894:24:0;;;;69877:16;:42::i;:::-;69973:5;69432:569;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69410:592;;;;69063:945;;;:::o;67174:616::-;67234:7;50160:4;67262:15;;:35;67253:58;;;;-1:-1:-1;;;67253:58:0;;21923:2:1;67253:58:0;;;21905:21:1;21962:1;21942:18;;;21935:29;-1:-1:-1;;;21980:18:1;;;21973:39;22029:18;;67253:58:0;21721:332:1;67253:58:0;67353:2;67329:21;67339:10;67329:9;:21::i;:::-;:26;67320:48;;;;-1:-1:-1;;;67320:48:0;;25585:2:1;67320:48:0;;;25567:21:1;25624:1;25604:18;;;25597:29;-1:-1:-1;;;25642:18:1;;;25635:38;25690:18;;67320:48:0;25383:331:1;67320:48:0;67397:9;;67384;:22;;67375:46;;;;-1:-1:-1;;;67375:46:0;;24154:2:1;67375:46:0;;;24136:21:1;24193:2;24173:18;;;24166:30;-1:-1:-1;;;24212:18:1;;;24205:40;24262:18;;67375:46:0;23952:334:1;67375:46:0;67448:15;;;67527:1;67509:19;;67491:37;;;67544:30;67554:10;67448:15;67544:9;:30::i;:::-;67652:15;67669:10;67681:18;:7;:16;:18::i;:::-;67635:65;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;67635:65:0;;;;;;;;;67625:76;;67635:65;67625:76;;;;67583:18;;;;:9;:18;;;;;:120;;-1:-1:-1;;67583:120:0;67611:92;;;;;67583:120;;;;;;67746:15;67583:120;67712:31;;;:49;67593:7;67174:616;-1:-1:-1;67174:616:0:o;81002:249::-;81086:38;81104:10;81116:7;81086:17;:38::i;:::-;81157:18;;;;:9;:18;;;;;:24;;-1:-1:-1;;;81157:24:0;;;;;81142:39;;;;;81133:59;;;;-1:-1:-1;;;81133:59:0;;18490:2:1;81133:59:0;;;18472:21:1;18529:1;18509:18;;;18502:29;-1:-1:-1;;;18547:18:1;;;18540:36;18593:18;;81133:59:0;18288:329:1;81133:59:0;81201:18;;;;:9;:18;;;;;;:44;;;;;;-1:-1:-1;;;81201:44:0;-1:-1:-1;;81201:44:0;;;;;;;;;81002:249::o;31673:336::-;31868:41;5918:10;31901:7;31868:18;:41::i;:::-;31860:100;;;;-1:-1:-1;;;31860:100:0;;;;;;;:::i;:::-;31973:28;31983:4;31989:2;31993:7;31973:9;:28::i;82204:180::-;7179:13;:11;:13::i;:::-;82304:21:::1;82294:6;:31;;82285:48;;;::::0;-1:-1:-1;;;82285:48:0;;23462:2:1;82285:48:0::1;::::0;::::1;23444:21:1::0;23501:1;23481:18;;;23474:29;-1:-1:-1;;;23519:18:1;;;23512:33;23562:18;;82285:48:0::1;23260:326:1::0;82285:48:0::1;82342:36;::::0;82350:10:::1;::::0;82342:36;::::1;;;::::0;82371:6;;82342:36:::1;::::0;;;82371:6;82350:10;82342:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;82204:180:::0;:::o;43040:256::-;43137:7;43173:23;43190:5;43173:16;:23::i;:::-;43165:5;:31;43157:87;;;;-1:-1:-1;;;43157:87:0;;18824:2:1;43157:87:0;;;18806:21:1;18863:2;18843:18;;;18836:30;18902:34;18882:18;;;18875:62;-1:-1:-1;;;18953:18:1;;;18946:41;19004:19;;43157:87:0;18622:407:1;43157:87:0;-1:-1:-1;;;;;;43262:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;43040:256::o;70014:208::-;70111:7;70130:21;70143:7;70130:12;:21::i;:::-;70185:18;;;;:9;:18;;;;;:31;;;70167:49;;:15;:49;:::i;75981:3065::-;76157:12;76181:23;76195:7;76181:12;:23::i;:::-;76222:18;;;;:9;:18;;;;;:32;-1:-1:-1;;;76222:32:0;;;;76213:52;;;;-1:-1:-1;;;76213:52:0;;18490:2:1;76213:52:0;;;18472:21:1;18529:1;18509:18;;;18502:29;-1:-1:-1;;;18547:18:1;;;18540:36;18593:18;;76213:52:0;18288:329:1;76213:52:0;76278:21;76302:67;76314:7;76323:3;76328:22;76352:16;76302:11;:67::i;:::-;76278:91;;76378:9;76445:102;58373:3;76457:1;:18;76445:102;;;76526:8;;;;;;;;;;;;;;;;;76535:1;76526:11;;;;;;;;:::i;:::-;;;;;;;;;76493:8;76521:1;58414:5;76502:20;76493:30;;;;;;;;:::i;:::-;;;;:44;-1:-1:-1;;;;;76493:44:0;;;;;;;;-1:-1:-1;76477:3:0;;76445:102;;;76568:18;;;;:9;:18;;;;;:25;76597:1;76568:30;76602:1;76567:36;;;76561:48;76557:100;;;-1:-1:-1;;;76622:8:0;76631:5;76622:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;76622:25:0;;;;;;;;;76557:100;76672:3;76667:200;;-1:-1:-1;;;76688:8:0;76697:5;76688:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;76688:25:0;;;;;;;;;-1:-1:-1;;;76724:8:0;76733:5;76724:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;76724:25:0;;;;;;;;;-1:-1:-1;;;76760:8:0;76769:5;76760:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;76760:25:0;;;;;;;;;-1:-1:-1;;;76796:8:0;76805:5;76796:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;76796:25:0;;;;;;;;;-1:-1:-1;;;76832:8:0;76841:5;76832:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;76832:25:0;;;;;;;;;76667:200;76877:10;76896:18;;;:9;:18;;;;;:25;76925:1;76896:30;76930:1;76895:36;76955:1;76947:9;;76943:1218;;;76987:4;76969:22;;:8;76978:5;76969:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;76969:22:0;;;;;;;;;77020:4;77002:22;;:8;77011:5;77002:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;77002:22:0;;;;;;;;;77041:5;77050:1;77041:10;77037:423;;;77084:4;77066:22;;:8;77075:5;77066:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;77066:22:0;;;;;;;;-1:-1:-1;;77119:18:0;;;;:9;:18;;;;;:25;77177:15;;77148:1;77119:30;;;;77153:3;77118:38;;77202:4;:19;;77195:27;;;77177:15;;77186:5;;77177:15;;;;;;:::i;:::-;;;;:45;-1:-1:-1;;;;;77177:45:0;;;;;;;;;76943:1218;;77037:423;77244:5;77253:1;77244:10;77240:220;;;77287:4;77269:22;;:8;77278:5;77269:15;;;;;;;;:::i;77240:220::-;77313:5;77322:1;77313:10;77309:151;;;77356:4;77338:22;;:8;77347:5;77338:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;77338:22:0;;;;;;;;;77391:4;77373:22;;:8;77382:5;77373:15;;;;;;;;:::i;77309:151::-;77444:4;77426:22;;:8;77435:5;77426:15;;;;;;;;:::i;77309:151::-;76943:1218;;;77479:5;77488:1;77479:10;77475:686;;;77520:4;77502:22;;:8;77511:5;77502:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;77502:22:0;;;;;;;;;77553:4;77535:22;;:8;77544:5;77535:15;;;;;;;;:::i;77475:686::-;77599:5;77608:1;77599:10;77595:566;;;77653:18;;;;:9;:18;;;;;:25;77622:15;;77640:47;;;;;-1:-1:-1;;;;;;77640:47:0;;77622:15;;77631:5;;77622:15;;;;;;:::i;77595:566::-;77706:5;77715:1;77706:10;77703:458;;;77739:18;;;;:9;:18;;;;;:25;77769:1;77738:32;77739:25;77738:36;77729:341;;77804:1;77800:5;;77795:117;66489:1;77807;:20;77795:117;;;77885:10;;;;;;;;;;;;;-1:-1:-1;;;77885:10:0;;;77896:1;77885:13;;;;;;;;:::i;:::-;;;;;;;;;77849:8;77880:1;66531:5;77858:23;77849:33;;;;;;;;:::i;:::-;;;;:49;-1:-1:-1;;;;;77849:49:0;;;;;;;;-1:-1:-1;77829:3:0;;;;;77795:117;;77729:341;77951:1;77947:5;;77942:117;66489:1;77954;:20;77942:117;;;78032:10;;;;;;;;;;;;;-1:-1:-1;;;78032:10:0;;;78043:1;78032:13;;;;;;;;:::i;:::-;;;;;;;;;77996:8;78027:1;66577:5;78005:23;77996:33;;;;;;;;:::i;:::-;;;;:49;-1:-1:-1;;;;;77996:49:0;;;;;;;;-1:-1:-1;77976:3:0;;;;;77942:117;;77703:458;78114:4;78096:22;;:8;78105:5;78096:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;78096:22:0;;;;;;;;;78147:4;78129:22;;:8;78138:5;78129:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;78129:22:0;;;;;;;;;77703:458;78177:18;;;;:9;:18;;;;;:25;78219:3;78206:1;78177:30;;;;78211:4;78176:39;78175:47;78171:129;;;78254:4;78235:23;;:8;78244:4;78235:14;;;;;;;;:::i;:::-;;;;:23;-1:-1:-1;;;;;78235:23:0;;;;;;;;;78286:4;78269:21;;:8;78278:4;78269:14;;;;;;;;:::i;:::-;;;;:21;-1:-1:-1;;;;;78269:21:0;;;;;;;;;78171:129;78316:18;;;;:9;:18;;;;;:25;78359:2;78345;78316:31;;;;78351:4;78315:40;78314:47;78310:391;;;78383:1;78379:5;;78374:112;65824:2;78386:1;:20;78374:112;;;78461:10;;;;;;;;;;;;;-1:-1:-1;;;78461:10:0;;;78472:1;78461:13;;;;;;;;:::i;:::-;;;;;;;;;78426:8;78456:1;65866:5;78435:22;78426:32;;;;;;;;:::i;:::-;;;;:48;-1:-1:-1;;;;;78426:48:0;;;;;;;;-1:-1:-1;78408:3:0;;;;;78374:112;;;78507:1;78503:5;;78499:111;65998:1;78510;:20;78499:111;;;78585:10;;;;;;;;;;;;;-1:-1:-1;;;78585:10:0;;;78596:1;78585:13;;;;;;;;:::i;:::-;;;;;;;;;78550:8;78580:1;66039:5;78559:22;78550:32;;;;;;;;:::i;:::-;;;;:48;-1:-1:-1;;;;;78550:48:0;;;;;;;;-1:-1:-1;78532:3:0;;;;;78499:111;;;78310:391;;;78654:4;78636:22;;:8;78645:5;78636:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;78636:22:0;;;;;;;;;78687:4;78669:22;;:8;78678:5;78669:15;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;78669:22:0;;;;;;;;;78310:391;78717:18;;;;:9;:18;;;;;:25;78760:3;78746:2;78717:31;;;;78752:4;78716:40;78715:48;78711:299;;;78784:1;78780:5;;78776:96;78791:1;78787;:5;78776:96;;;78847:10;;;;;;;;;;;;;-1:-1:-1;;;78847:10:0;;;78858:1;78847:13;;;;;;;;:::i;:::-;;;;;;;;;78812:8;78842:1;66196:5;78821:22;78812:32;;;;;;;;:::i;:::-;;;;:48;-1:-1:-1;;;;;78812:48:0;;;;;;;;-1:-1:-1;78794:3:0;;;;;78776:96;;;78711:299;;;78906:1;78902:5;;78898:103;78913:2;78909:1;:6;78898:103;;;78970:10;;;;;;;;;;;;;-1:-1:-1;;;78970:10:0;;;78981:1;78970:13;;;;;;;;:::i;:::-;;;;;;;;;78935:8;78965:1;66358:5;78944:22;78935:32;;;;;;;;:::i;:::-;;;;:48;-1:-1:-1;;;;;78935:48:0;;;;;;;;-1:-1:-1;78917:3:0;;;;;78898:103;;;-1:-1:-1;79032:8:0;;-1:-1:-1;;75981:3065:0;;;;;;;:::o;32080:185::-;32218:39;32235:4;32241:2;32245:7;32218:39;;;;;;;;;;;;:16;:39::i;79387:183::-;79480:21;79493:7;79480:12;:21::i;:::-;79544:6;-1:-1:-1;;;;;79517:33:0;:23;79532:7;79517:14;:23::i;:::-;-1:-1:-1;;;;;79517:33:0;;79508:56;;;;-1:-1:-1;;;79508:56:0;;25248:2:1;79508:56:0;;;25230:21:1;25287:1;25267:18;;;25260:29;-1:-1:-1;;;25305:18:1;;;25298:39;25354:18;;79508:56:0;25046:332:1;43562:233:0;43637:7;43673:30;43460:10;:17;;43372:113;43673:30;43665:5;:38;43657:95;;;;-1:-1:-1;;;43657:95:0;;26256:2:1;43657:95:0;;;26238:21:1;26295:2;26275:18;;;26268:30;26334:34;26314:18;;;26307:62;-1:-1:-1;;;26385:18:1;;;26378:42;26437:19;;43657:95:0;26054:408:1;43657:95:0;43770:10;43781:5;43770:17;;;;;;;;:::i;:::-;;;;;;;;;43763:24;;43562:233;;;:::o;70642:213::-;70760:4;70776:21;70789:7;70776:12;:21::i;:::-;-1:-1:-1;70817:18:0;;;;:9;:18;;;;;:32;-1:-1:-1;;;70817:32:0;;;;;70642:213::o;29171:222::-;29243:7;29279:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29279:16:0;29314:19;29306:56;;;;-1:-1:-1;;;29306:56:0;;24493:2:1;29306:56:0;;;24475:21:1;24532:2;24512:18;;;24505:30;-1:-1:-1;;;24551:18:1;;;24544:54;24615:18;;29306:56:0;24291:348:1;75628:277:0;75779:13;75811:88;75824:74;75843:7;75852:3;75857:22;75881:16;75824:18;:74::i;:::-;75811:12;:88::i;:::-;75804:95;75628:277;-1:-1:-1;;;;;75628:277:0:o;70436:200::-;70547:5;70565:21;70578:7;70565:12;:21::i;:::-;-1:-1:-1;70606:18:0;;;;:9;:18;;;;;:24;-1:-1:-1;;;70606:24:0;;;;;70436:200::o;70228:202::-;70339:6;70358:21;70371:7;70358:12;:21::i;:::-;-1:-1:-1;70399:18:0;;;;:9;:18;;;;;:25;;;;70228:202::o;82390:153::-;7179:13;:11;:13::i;:::-;82515:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;79188:127::-:0;79279:15;;79269:7;:25;79260:49;;;;-1:-1:-1;;;79260:49:0;;21584:2:1;79260:49:0;;;21566:21:1;21623:2;21603:18;;;21596:30;-1:-1:-1;;;21642:18:1;;;21635:40;21692:18;;79260:49:0;21382:334:1;79260:49:0;79188:127;:::o;28902:207::-;28974:7;-1:-1:-1;;;;;29002:19:0;;28994:73;;;;-1:-1:-1;;;28994:73:0;;22260:2:1;28994:73:0;;;22242:21:1;22299:2;22279:18;;;22272:30;22338:34;22318:18;;;22311:62;-1:-1:-1;;;22389:18:1;;;22382:39;22438:19;;28994:73:0;22058:405:1;28994:73:0;-1:-1:-1;;;;;;29085:16:0;;;;;:9;:16;;;;;;;28902:207::o;7941:103::-;7179:13;:11;:13::i;:::-;8006:30:::1;8033:1;8006:18;:30::i;:::-;7941:103::o:0;71486:4052::-;71655:12;71679:21;71692:7;71679:12;:21::i;:::-;71709;71733:11;;;;;;;;;;;;;;;;;71774:6;71833:18;;;:9;:18;;;;;:25;71709:35;;-1:-1:-1;71774:6:0;;;71861:3;71833:31;71880:9;;;;;:22;;;71901:1;71893:5;:9;71880:22;71876:420;;;71938:1;71930:5;:9;71943:2;71929:16;71915:31;;71966:1;71962:5;;71957:122;54778:2;71969:1;:25;71957:122;;;72047:8;;;;;;;;;;;;;;;;;72060:6;72056:1;:10;72047:20;;;;;;;;:::i;:::-;;;;;;;;;72014:8;72042:1;54823:5;72023:20;72014:30;;;;;;;;:::i;:::-;;;;:53;-1:-1:-1;;;;;72014:53:0;;;;;;;;-1:-1:-1;71996:3:0;;;;;71957:122;;;71876:420;;;72106:1;72098:5;:9;72094:202;;;72143:1;72135:5;:9;72148:3;72134:17;72120:32;;72174:1;72170:5;;72165:122;55264:3;72177:1;:25;72165:122;;;72255:8;;;;;;;;;;;;;;;;;72268:6;72264:1;:10;72255:20;;;;;;;;:::i;:::-;;;;;;;;;72222:8;72250:1;55310:5;72231:20;72222:30;;;;;;;;:::i;:::-;;;;:53;-1:-1:-1;;;;;72222:53:0;;;;;;;;-1:-1:-1;72204:3:0;;;;;72165:122;;;72319:1;72311:5;:9;72307:347;;;72342:1;72338:5;;72333:106;57320:3;72345:1;:18;72333:106;;;72416:8;;;;;;;;;;;;;;;;;72425:1;72416:11;;;;;;;;:::i;:::-;;;;;;;;;72383:8;72411:1;57361:5;72392:20;72383:30;;;;;;;;:::i;:::-;;;;:44;-1:-1:-1;;;;;72383:44:0;;;;;;;;-1:-1:-1;72365:3:0;;;;;72333:106;;;72473:4;72466:12;;72449:8;72458:4;72449:14;;;;;;;;:::i;:::-;;;;:29;-1:-1:-1;;;;;72449:29:0;;;;;;;;;72513:4;72506:12;;72489:8;72498:4;72489:14;;;;;;;;:::i;:::-;;;;:29;-1:-1:-1;;;;;72489:29:0;;;;;;;;;72307:347;;;72592:1;72552:18;;;:9;:18;;;;;:25;72581:1;72552:30;:25;72551:38;:42;72547:98;;-1:-1:-1;;;72608:8:0;72617:5;72608:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;72608:25:0;;;;;;;;;72547:98;72668:27;;;;72664:127;;72758:22;72751:30;;72708:8;54654:5;72708:40;;;;;;;;:::i;:::-;;;;:73;-1:-1:-1;;;;;72708:73:0;;;;;;;;;72664:127;72805:21;;;;72801:110;;72883:16;72876:24;;72839:8;54711:5;72839:34;;;;;;;;:::i;:::-;;;;:61;-1:-1:-1;;;;;72839:61:0;;;;;;;;;72801:110;72936:18;;;;72965:2;72936:18;;;;;;;;:25;:31;;;;72971:3;72935:39;72978:2;72930:50;;;;-1:-1:-1;73015:31:0;73050:3;73014:39;73070:3;73065:745;;73124:1;;-1:-1:-1;73100:2:0;73086:16;73115:168;65453:1;73127;:19;73115:168;;;73200:9;;;;;;;;;;;;;-1:-1:-1;;;73200:9:0;;;73210:1;73200:12;;;;;;;;:::i;:::-;;;;;;;;;73166:8;73195:1;65493:5;73175:21;73166:31;;;;;;;;:::i;:::-;;;;:46;-1:-1:-1;;;;;73166:46:0;;;;;;;;;73259:9;;;;;;;;;;;;;-1:-1:-1;;;73259:9:0;;;73269:1;73259:12;;;;;;;;:::i;:::-;;;;;;;;;73225:8;73254:1;65602:5;73234:21;73225:31;;;;;;;;:::i;:::-;;;;:46;-1:-1:-1;;;;;73225:46:0;;;;;;;;-1:-1:-1;73148:3:0;;;;;73115:168;;;73307:1;73299:5;:9;73295:506;;;73332:1;73328:5;;73323:99;73339:1;73335;:5;73323:99;;;73396:9;;;;;;;;;;;;;-1:-1:-1;;;73396:9:0;;;73406:1;73396:12;;;;;;;;:::i;:::-;;;;;;;;;73362:8;73391:1;65711:5;73371:21;73362:31;;;;;;;;:::i;:::-;;;;:46;-1:-1:-1;;;;;73362:46:0;;;;;;;;-1:-1:-1;73342:3:0;;;;;73323:99;;;73481:1;73441:18;;;:9;:18;;;;;:25;73470:1;73441:30;:25;73440:38;:42;73436:162;;-1:-1:-1;;;73499:8:0;73508:5;73499:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;73499:25:0;;;;;;;;;73436:162;;;-1:-1:-1;;;73559:8:0;73568:5;73559:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;73559:25:0;;;;;;;;;73436:162;-1:-1:-1;;;73612:8:0;73621:5;73612:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;73612:25:0;;;;;;;;;-1:-1:-1;;;73650:8:0;73659:5;73650:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;73650:25:0;;;;;;;;;-1:-1:-1;;;73688:8:0;73697:5;73688:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;73688:25:0;;;;;;;;;-1:-1:-1;;;73726:8:0;73735:5;73726:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;73726:25:0;;;;;;;;;-1:-1:-1;;;73764:8:0;73773:5;73764:15;;;;;;;;:::i;:::-;;;;:25;-1:-1:-1;;;;;73764:25:0;;;;;;;;;73295:506;73831:1;73827:5;;73822:238;59479:2;73834:1;:25;73822:238;;;73922:10;73896:9;;;;;;;;;;;;;;;;;73910:6;73906:1;:10;73896:21;;;;;;;;:::i;:::-;;;;;;;;;73890:28;;73885:34;;:47;73877:55;;73976:8;;;;;;;;;;;;;;;;;73985:5;73976:15;;;;;;;;:::i;:::-;;;;;;;;;73943:8;73971:1;59431:5;73952:20;73943:30;;;;;;;;:::i;:::-;;;;:48;-1:-1:-1;;;;;73943:48:0;;;;;;;;;74035:8;;;;;;;;;;;;;;;;;74044:5;74035:15;;;;;;;;:::i;:::-;;;;;;;;;74002:8;74030:1;59910:5;74011:20;74002:30;;;;;;;;:::i;:::-;;;;:48;-1:-1:-1;;;;;74002:48:0;;;;;;;;-1:-1:-1;73861:3:0;;;;;73822:238;;;74084:18;;;;:9;:18;;;;;;;;;:25;74163:8;;;;;;;;;;;;;;;;74113:1;74084:30;74118:4;74083:39;;-1:-1:-1;74083:39:0;;74163:15;;;;;;:::i;:::-;;;;;;;;;74134:8;60505:5;74134:26;;;;;;;;:::i;:::-;;;;:44;-1:-1:-1;;;;;74134:44:0;;;;;;;;;74216:8;;;;;;;;;;;;;;;;;74225:5;74216:15;;;;;;;;:::i;:::-;;;;;;;;;74187:8;60344:4;74187:26;;;;;;;;:::i;:::-;;;;:44;-1:-1:-1;;;;;74187:44:0;;;;;;;;-1:-1:-1;74257:18:0;;;;:9;74286:2;74257:18;;;;;;;:25;:31;;74292:4;74256:40;74300:2;74251:51;;-1:-1:-1;74326:4:0;74317:13;;74313:164;;;74352:1;74348:5;;74343:125;61393:2;74355:1;:26;74343:125;;;74435:9;;;;;;;;;;;;;;;;;74454:1;74445:6;:10;74435:21;;;;;;;;:::i;:::-;;;;;;;;;74401:8;74430:1;61439:5;74410:21;74401:31;;;;;;;;:::i;:::-;;;;:55;-1:-1:-1;;;;;74401:55:0;;;;;;;;-1:-1:-1;74383:3:0;;;;;74343:125;;;74501:18;;;;:9;:18;;;;;:25;74550:23;;74530:2;74501:31;;;74536:4;74500:40;;-1:-1:-1;74576:20:0;;;;;-1:-1:-1;;;;;;74576:20:0;;74550:23;;74559:13;;74550:23;;;;;;:::i;:::-;;;;:46;-1:-1:-1;;;;;74550:46:0;;;;;;;;-1:-1:-1;74621:18:0;;;;:9;:18;;;;;;;;;:25;74699:8;;;;;;;;;;;-1:-1:-1;;;74699:8:0;;;;;;;74650:2;74621:31;74656:3;74620:39;;-1:-1:-1;74620:39:0;;74699:15;;;;;;:::i;:::-;;;;;;;;;74670:8;60667:5;74670:26;;;;;;;;:::i;:::-;;;;:44;-1:-1:-1;;;;;74670:44:0;;;;;;;;-1:-1:-1;74740:18:0;;;;:9;:18;;;;;:25;:18;;-1:-1:-1;74740:25:0;74769:2;74740:31;;;;74775:3;74739:39;74782:1;74738:45;74733:51;;-1:-1:-1;74793:120:0;60804:1;74805;:26;74793:120;;;74883:9;;;;;;;;;;;;;;;;;74897:5;74893:1;:9;74883:20;;;;;;;;:::i;:::-;;;;;;;;;74849:8;74878:1;60849:5;74858:21;74849:31;;;;;;;;:::i;:::-;;;;:54;-1:-1:-1;;;;;74849:54:0;;;;;;;;-1:-1:-1;74833:3:0;;;;;74793:120;;;74938:18;;;;:9;:18;;;;;:25;:18;;-1:-1:-1;74938:25:0;74967:2;74938:31;;;;74973:3;74937:39;74980:1;74936:45;74931:51;;-1:-1:-1;74991:120:0;61022:1;75003;:26;74991:120;;;75081:9;;;;;;;;;;;;;-1:-1:-1;;;75081:9:0;;;75095:5;75091:1;:9;75081:20;;;;;;;;:::i;:::-;;;;;;;;;75047:8;75076:1;61067:5;75056:21;75047:31;;;;;;;;:::i;:::-;;;;:54;-1:-1:-1;;;;;75047:54:0;;;;;;;;-1:-1:-1;75031:3:0;;;;;74991:120;;;75136:18;;;;:9;:18;;;;;:25;:18;;-1:-1:-1;75178:1:0;75165:2;75136:31;;;;:25;75135:39;75134:45;75136:25;75129:51;;-1:-1:-1;75189:120:0;61225:1;75201;:26;75189:120;;;75279:9;;;;;;;;;;;;;-1:-1:-1;;;75279:9:0;;;75293:5;75289:1;:9;75279:20;;;;;;;;:::i;:::-;;;;;;;;;75245:8;75274:1;61270:5;75254:21;75245:31;;;;;;;;:::i;:::-;;;;:54;-1:-1:-1;;;;;75245:54:0;;;;;;;;-1:-1:-1;75229:3:0;;;;;75189:120;;;75344:9;:18;75354:7;75344:18;;;;;;;;;;;:24;;;;;;;;;;;;75371:1;75344:28;75337:36;;75319:8;75328:5;75319:15;;;;;;;;:::i;:::-;;;;:54;-1:-1:-1;;;;;75319:54:0;;;;;;;;-1:-1:-1;75388:18:0;;;;:9;:18;;;;;:30;-1:-1:-1;;;75388:30:0;;;;:35;75384:118;;75461:18;;;;:9;:18;;;;;:30;75436:15;;-1:-1:-1;;;75461:30:0;;;75454:38;;-1:-1:-1;;;;;;75454:38:0;;75436:15;;75445:5;;75436:15;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;75436:56:0;;;;;;;;;75384:118;-1:-1:-1;75524:8:0;;71486:4052;-1:-1:-1;;;;;;;;71486:4052:0:o;82975:128::-;7179:13;:11;:13::i;:::-;83067:16:::1;:30:::0;;-1:-1:-1;;;;;;83067:30:0::1;-1:-1:-1::0;;;;;83067:30:0;;;::::1;::::0;;;::::1;::::0;;82975:128::o;82853:116::-;7179:13;:11;:13::i;:::-;82945:18;;::::1;::::0;:11:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;29629:104::-:0;29685:13;29718:7;29711:14;;;;;:::i;31216:155::-;31311:52;5918:10;31344:8;31354;31311:18;:52::i;82549:162::-;7179:13;:11;:13::i;:::-;82679:26;;::::1;::::0;:16:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;80786:169::-:0;80861:47;80881:10;80893:7;80902:5;80861:19;:47::i;:::-;80917:18;;;;:9;:18;;;;;;:32;;;;;;-1:-1:-1;;;80917:32:0;-1:-1:-1;;80917:32:0;;;;;;;;;80786:169::o;32336:323::-;32510:41;5918:10;32543:7;32510:18;:41::i;:::-;32502:100;;;;-1:-1:-1;;;32502:100:0;;;;;;;:::i;:::-;32613:38;32627:4;32633:2;32637:7;32646:4;32613:13;:38::i;:::-;32336:323;;;;:::o;80050:337::-;80174:1;80166:5;:9;;;80157:30;;;;-1:-1:-1;;;80157:30:0;;25921:2:1;80157:30:0;;;25903:21:1;25960:1;25940:18;;;25933:29;-1:-1:-1;;;25978:18:1;;;25971:37;26025:18;;80157:30:0;25719:330:1;80157:30:0;80196:25;:84;;;;;;;;80225:1;80196:84;;;;50244:12;80228:1;:15;;;;:::i;:::-;80196:84;;;;80245:16;50244:12;80245:2;:16;:::i;:::-;80196:84;;;;50244:12;80263:2;:16;;;;:::i;:::-;80196:84;;;-1:-1:-1;80287:23:0;80196:84;80313:14;;;;;;;;;;:::i;:::-;;;;;80287:40;;80334:47;80348:6;80356:7;80365:15;80334:13;:47::i;:::-;80150:237;;80050:337;;;:::o;67872:790::-;67961:13;67987:21;68000:7;67987:12;:21::i;:::-;68029:16;;-1:-1:-1;;;;;68029:16:0;68021:39;68017:126;;68078:16;;:57;;-1:-1:-1;;;68078:57:0;;68120:4;68078:57;;;17732:51:1;17799:18;;;17792:34;;;-1:-1:-1;;;;;68078:16:0;;;;:25;;17705:18:1;;68078:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68078:57:0;;;;;;;;;;;;:::i;68017:126::-;68155:27;68185:25;68202:7;68185:16;:25::i;:::-;68155:55;;68219:18;68240:337;68311:13;68354:11;68380:27;68393:13;68380:12;:27::i;:::-;68434;68453:7;68434:18;:27::i;:::-;68520:33;68538:7;68547:5;68520:17;:33::i;:::-;68266:308;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68240:12;:337::i;:::-;68219:358;;68650:4;68600:55;;;;;;;;:::i;70861:350::-;70994:13;71019:21;71032:7;71019:12;:21::i;:::-;71053:14;71049:157;;;71085:45;71110:7;71119:4;71125:1;71128;71085:24;:45::i;:::-;71078:52;;;;71049:157;71160:38;71178:7;71187:4;71193:1;71196;71160:17;:38::i;79658:348::-;79772:34;79790:6;79798:7;79772:17;:34::i;:::-;79815:21;79876:26;:15;:24;:26::i;:::-;79846:57;;;;;;;;:::i;:::-;;;;-1:-1:-1;;79846:57:0;;;;;;;;;79939:18;;;;:9;79846:57;79939:18;;:31;;;79846:57;;-1:-1:-1;79975:15:0;;79921:49;;:15;:49;:::i;:::-;79920:70;;79992:7;79911:89;;;;;-1:-1:-1;;;79911:89:0;;;;;;;;:::i;80465:196::-;80559:23;80585:16;50244:12;80585:2;:16;:::i;:::-;80559:42;;80608:47;80622:6;80630:7;80639:15;80608:13;:47::i;71217:263::-;71361:13;71393:81;71406:67;71418:7;71427:3;71432:22;71456:16;71406:11;:67::i;8199:201::-;7179:13;:11;:13::i;:::-;-1:-1:-1;;;;;8288:22:0;::::1;8280:73;;;::::0;-1:-1:-1;;;8280:73:0;;19655:2:1;8280:73:0::1;::::0;::::1;19637:21:1::0;19694:2;19674:18;;;19667:30;19733:34;19713:18;;;19706:62;-1:-1:-1;;;19784:18:1;;;19777:36;19830:19;;8280:73:0::1;19453:402:1::0;8280:73:0::1;8364:28;8383:8;8364:18;:28::i;82091:107::-:0;7179:13;:11;:13::i;:::-;82175:9:::1;:17:::0;82091:107::o;82717:130::-;7179:13;:11;:13::i;:::-;82816:25;;::::1;::::0;:15:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;81280:156::-:0;81342:40;81362:10;81374:7;81342:19;:40::i;:::-;81391:18;;;;:9;:18;;;;;:39;;-1:-1:-1;;;;81391:39:0;-1:-1:-1;;;81391:39:0;;;81280:156::o;42732:224::-;42834:4;-1:-1:-1;;;;;;42858:50:0;;-1:-1:-1;;;42858:50:0;;:90;;;42912:36;42936:11;42912:23;:36::i;38948:135::-;34231:4;34255:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34255:16:0;39022:53;;;;-1:-1:-1;;;39022:53:0;;24493:2:1;39022:53:0;;;24475:21:1;24532:2;24512:18;;;24505:30;-1:-1:-1;;;24551:18:1;;;24544:54;24615:18;;39022:53:0;24291:348:1;38227:174:0;38302:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38302:29:0;-1:-1:-1;;;;;38302:29:0;;;;;;;;:24;;38356:23;38302:24;38356:14;:23::i;:::-;-1:-1:-1;;;;;38347:46:0;;;;;;;;;;;38227:174;;:::o;3086:723::-;3142:13;3363:10;3359:53;;-1:-1:-1;;3390:10:0;;;;;;;;;;;;-1:-1:-1;;;3390:10:0;;;;;3086:723::o;3359:53::-;3437:5;3422:12;3478:78;3485:9;;3478:78;;3511:8;;;;:::i;:::-;;-1:-1:-1;3534:10:0;;-1:-1:-1;3542:2:0;3534:10;;:::i;:::-;;;3478:78;;;3566:19;3598:6;3588:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3588:17:0;;3566:39;;3616:154;3623:10;;3616:154;;3650:11;3660:1;3650:11;;:::i;:::-;;-1:-1:-1;3719:10:0;3727:2;3719:5;:10;:::i;:::-;3706:24;;:2;:24;:::i;:::-;3693:39;;3676:6;3683;3676:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3676:56:0;;;;;;;;-1:-1:-1;3747:11:0;3756:2;3747:11;;:::i;:::-;;;3616:154;;35066:110;35142:26;35152:2;35156:7;35142:26;;;;;;;;;;;;:9;:26::i;34460:264::-;34553:4;34570:13;34586:23;34601:7;34586:14;:23::i;:::-;34570:39;;34639:5;-1:-1:-1;;;;;34628:16:0;:7;-1:-1:-1;;;;;34628:16:0;;:52;;;-1:-1:-1;;;;;;31563:25:0;;;31539:4;31563:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;34648:32;34628:87;;;;34708:7;-1:-1:-1;;;;;34684:31:0;:20;34696:7;34684:11;:20::i;:::-;-1:-1:-1;;;;;34684:31:0;;34620:96;34460:264;-1:-1:-1;;;;34460:264:0:o;37483:625::-;37642:4;-1:-1:-1;;;;;37615:31:0;:23;37630:7;37615:14;:23::i;:::-;-1:-1:-1;;;;;37615:31:0;;37607:81;;;;-1:-1:-1;;;37607:81:0;;20062:2:1;37607:81:0;;;20044:21:1;20101:2;20081:18;;;20074:30;20140:34;20120:18;;;20113:62;-1:-1:-1;;;20191:18:1;;;20184:35;20236:19;;37607:81:0;19860:401:1;37607:81:0;-1:-1:-1;;;;;37707:16:0;;37699:65;;;;-1:-1:-1;;;37699:65:0;;20825:2:1;37699:65:0;;;20807:21:1;20864:2;20844:18;;;20837:30;20903:34;20883:18;;;20876:62;-1:-1:-1;;;20954:18:1;;;20947:34;20998:19;;37699:65:0;20623:400:1;37699:65:0;37777:39;37798:4;37804:2;37808:7;37777:20;:39::i;:::-;37881:29;37898:1;37902:7;37881:8;:29::i;:::-;-1:-1:-1;;;;;37923:15:0;;;;;;:9;:15;;;;;:20;;37942:1;;37923:15;:20;;37942:1;;37923:20;:::i;:::-;;;;-1:-1:-1;;;;;;;37954:13:0;;;;;;:9;:13;;;;;:18;;37971:1;;37954:13;:18;;37971:1;;37954:18;:::i;:::-;;;;-1:-1:-1;;37983:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37983:21:0;-1:-1:-1;;;;;37983:21:0;;;;;;;;;38022:27;;37983:16;;38022:27;;;;;;;30560:347;30490:417;;:::o;7458:132::-;7366:6;;-1:-1:-1;;;;;7366:6:0;5918:10;7522:23;7514:68;;;;-1:-1:-1;;;7514:68:0;;23793:2:1;7514:68:0;;;23775:21:1;;;23812:18;;;23805:30;23871:34;23851:18;;;23844:62;23923:18;;7514:68:0;23591:356:1;83494:2965:0;83558:13;83765:4;:11;83780:1;83765:16;83761:31;;;-1:-1:-1;;83783:9:0;;;;;;;;;-1:-1:-1;83783:9:0;;;83494:2965::o;83761:31::-;83841:19;83863:6;;;;;;;;;;;;;;;;;83841:28;;84266:20;84325:1;84306:4;:11;84320:1;84306:15;;;;:::i;:::-;84305:21;;;;:::i;:::-;84300:27;;:1;:27;:::i;:::-;84289:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84289:39:0;;84266:62;;84500:1;84493:5;84489:13;84600:2;84592:6;84588:15;84705:4;84755;84749:11;84743:4;84739:22;84669:1386;84787:6;84778:7;84775:19;84669:1386;;;84887:1;84878:7;84874:15;84863:26;;84924:7;84918:14;85561:4;85553:5;85549:2;85545:14;85541:25;85531:8;85527:40;85521:47;85510:9;85502:67;85613:1;85602:9;85598:17;85585:30;;85703:4;85695:5;85691:2;85687:14;85683:25;85673:8;85669:40;85663:47;85652:9;85644:67;85755:1;85744:9;85740:17;85727:30;;85844:4;85836:5;85833:1;85829:13;85825:24;85815:8;85811:39;85805:46;85794:9;85786:66;85896:1;85885:9;85881:17;85868:30;;85977:4;85970:5;85966:16;85956:8;85952:31;85946:38;85935:9;85927:58;;86029:1;86018:9;86014:17;86001:30;;84669:1386;;;84673:101;;86211:1;86204:4;86198:11;86194:19;86230:1;86225:117;;;;86359:1;86354:69;;;;86187:236;;86225:117;86276:4;86272:1;86261:9;86257:17;86249:32;86324:4;86320:1;86309:9;86305:17;86297:32;86225:117;;86354:69;86405:4;86401:1;86390:9;86386:17;86378:32;86187:236;-1:-1:-1;86447:6:0;;83494:2965;-1:-1:-1;;;;;83494:2965:0:o;8560:191::-;8653:6;;;-1:-1:-1;;;;;8670:17:0;;;-1:-1:-1;;;;;;8670:17:0;;;;;;;8703:40;;8653:6;;;8670:17;8653:6;;8703:40;;8634:16;;8703:40;8623:128;8560:191;:::o;38544:315::-;38699:8;-1:-1:-1;;;;;38690:17:0;:5;-1:-1:-1;;;;;38690:17:0;;;38682:55;;;;-1:-1:-1;;;38682:55:0;;21230:2:1;38682:55:0;;;21212:21:1;21269:2;21249:18;;;21242:30;21308:27;21288:18;;;21281:55;21353:18;;38682:55:0;21028:349:1;38682:55:0;-1:-1:-1;;;;;38748:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;38748:46:0;;;;;;;;;;38810:41;;17260::1;;;38810::0;;17233:18:1;38810:41:0;;;;;;;38544:315;;;:::o;33540:313::-;33696:28;33706:4;33712:2;33716:7;33696:9;:28::i;:::-;33743:47;33766:4;33772:2;33776:7;33785:4;33743:22;:47::i;:::-;33735:110;;;;-1:-1:-1;;;33735:110:0;;;;;;;:::i;68670:387::-;68761:13;68787:23;68858:12;68872:13;68921:16;68939:13;68983:15;69000:13;68820:205;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;68820:205:0;;;;;;;;;;68670:387;-1:-1:-1;;;68670:387:0:o;28533:305::-;28635:4;-1:-1:-1;;;;;;28672:40:0;;-1:-1:-1;;;28672:40:0;;:105;;-1:-1:-1;;;;;;;28729:48:0;;-1:-1:-1;;;28729:48:0;28672:105;:158;;;-1:-1:-1;;;;;;;;;;20280:40:0;;;28794:36;20171:157;35403:319;35532:18;35538:2;35542:7;35532:5;:18::i;:::-;35583:53;35614:1;35618:2;35622:7;35631:4;35583:22;:53::i;:::-;35561:153;;;;-1:-1:-1;;;35561:153:0;;;;;;;:::i;81716:293::-;81853:45;81880:4;81886:2;81890:7;81853:26;:45::i;:::-;81921:15;;81911:7;:25;81907:97;;;81947:18;;;;:9;:18;;;;;81981:15;81947:31;;;;:49;-1:-1:-1;;81716:293:0:o;39647:853::-;39801:4;-1:-1:-1;;;;;39822:13:0;;10292:19;:23;39818:675;;39858:71;;-1:-1:-1;;;39858:71:0;;-1:-1:-1;;;;;39858:36:0;;;;;:71;;5918:10;;39909:4;;39915:7;;39924:4;;39858:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39858:71:0;;;;;;;;-1:-1:-1;;39858:71:0;;;;;;;;;;;;:::i;:::-;;;39854:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40099:13:0;;40095:328;;40142:60;;-1:-1:-1;;;40142:60:0;;;;;;;:::i;40095:328::-;40373:6;40367:13;40358:6;40354:2;40350:15;40343:38;39854:584;-1:-1:-1;;;;;;39980:51:0;-1:-1:-1;;;39980:51:0;;-1:-1:-1;39973:58:0;;39818:675;-1:-1:-1;40477:4:0;40470:11;;36058:439;-1:-1:-1;;;;;36138:16:0;;36130:61;;;;-1:-1:-1;;;36130:61:0;;23101:2:1;36130:61:0;;;23083:21:1;;;23120:18;;;23113:30;23179:34;23159:18;;;23152:62;23231:18;;36130:61:0;22899:356:1;36130:61:0;34231:4;34255:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34255:16:0;:30;36202:58;;;;-1:-1:-1;;;36202:58:0;;20468:2:1;36202:58:0;;;20450:21:1;20507:2;20487:18;;;20480:30;20546;20526:18;;;20519:58;20594:18;;36202:58:0;20266:352:1;36202:58:0;36273:45;36302:1;36306:2;36310:7;36273:20;:45::i;:::-;-1:-1:-1;;;;;36331:13:0;;;;;;:9;:13;;;;;:18;;36348:1;;36331:13;:18;;36348:1;;36331:18;:::i;:::-;;;;-1:-1:-1;;36360:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36360:21:0;-1:-1:-1;;;;;36360:21:0;;;;;;;;36399:33;;36360:16;;;36399:33;;36360:16;;36399:33;82342:36:::1;82204:180:::0;:::o;44408:589::-;-1:-1:-1;;;;;44614:18:0;;44610:187;;44649:40;44681:7;45824:10;:17;;45797:24;;;;:15;:24;;;;;:44;;;45852:24;;;;;;;;;;;;45720:164;44649:40;44610:187;;;44719:2;-1:-1:-1;;;;;44711:10:0;:4;-1:-1:-1;;;;;44711:10:0;;44707:90;;44738:47;44771:4;44777:7;44738:32;:47::i;:::-;-1:-1:-1;;;;;44811:16:0;;44807:183;;44844:45;44881:7;44844:36;:45::i;44807:183::-;44917:4;-1:-1:-1;;;;;44911:10:0;:2;-1:-1:-1;;;;;44911:10:0;;44907:83;;44938:40;44966:2;44970:7;44938:27;:40::i;46511:988::-;46777:22;46827:1;46802:22;46819:4;46802:16;:22::i;:::-;:26;;;;:::i;:::-;46839:18;46860:26;;;:17;:26;;;;;;46777:51;;-1:-1:-1;46993:28:0;;;46989:328;;-1:-1:-1;;;;;47060:18:0;;47038:19;47060:18;;;:12;:18;;;;;;;;:34;;;;;;;;;47111:30;;;;;;:44;;;47228:30;;:17;:30;;;;;:43;;;46989:328;-1:-1:-1;47413:26:0;;;;:17;:26;;;;;;;;47406:33;;;-1:-1:-1;;;;;47457:18:0;;;;;:12;:18;;;;;:34;;;;;;;47450:41;46511:988::o;47794:1079::-;48072:10;:17;48047:22;;48072:21;;48092:1;;48072:21;:::i;:::-;48104:18;48125:24;;;:15;:24;;;;;;48498:10;:26;;48047:46;;-1:-1:-1;48125:24:0;;48047:46;;48498:26;;;;;;:::i;:::-;;;;;;;;;48476:48;;48562:11;48537:10;48548;48537:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;48642:28;;;:15;:28;;;;;;;:41;;;48814:24;;;;;48807:31;48849:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;47865:1008;;;47794:1079;:::o;45298:221::-;45383:14;45400:20;45417:2;45400:16;:20::i;:::-;-1:-1:-1;;;;;45431:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;45476:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;45298:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:336:1;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:45;;;239:1;236;229:12;198:45;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;14:336;;;;;:::o;355:160::-;420:20;;476:13;;469:21;459:32;;449:60;;505:1;502;495:12;449:60;355:160;;;:::o;520:156::-;586:20;;646:4;635:16;;625:27;;615:55;;666:1;663;656:12;681:247;740:6;793:2;781:9;772:7;768:23;764:32;761:52;;;809:1;806;799:12;761:52;848:9;835:23;867:31;892:5;867:31;:::i;:::-;917:5;681:247;-1:-1:-1;;;681:247:1:o;933:388::-;1001:6;1009;1062:2;1050:9;1041:7;1037:23;1033:32;1030:52;;;1078:1;1075;1068:12;1030:52;1117:9;1104:23;1136:31;1161:5;1136:31;:::i;:::-;1186:5;-1:-1:-1;1243:2:1;1228:18;;1215:32;1256:33;1215:32;1256:33;:::i;:::-;1308:7;1298:17;;;933:388;;;;;:::o;1326:456::-;1403:6;1411;1419;1472:2;1460:9;1451:7;1447:23;1443:32;1440:52;;;1488:1;1485;1478:12;1440:52;1527:9;1514:23;1546:31;1571:5;1546:31;:::i;:::-;1596:5;-1:-1:-1;1653:2:1;1638:18;;1625:32;1666:33;1625:32;1666:33;:::i;:::-;1326:456;;1718:7;;-1:-1:-1;;;1772:2:1;1757:18;;;;1744:32;;1326:456::o;1787:794::-;1882:6;1890;1898;1906;1959:3;1947:9;1938:7;1934:23;1930:33;1927:53;;;1976:1;1973;1966:12;1927:53;2015:9;2002:23;2034:31;2059:5;2034:31;:::i;:::-;2084:5;-1:-1:-1;2141:2:1;2126:18;;2113:32;2154:33;2113:32;2154:33;:::i;:::-;2206:7;-1:-1:-1;2260:2:1;2245:18;;2232:32;;-1:-1:-1;2315:2:1;2300:18;;2287:32;2342:18;2331:30;;2328:50;;;2374:1;2371;2364:12;2328:50;2397:22;;2450:4;2442:13;;2438:27;-1:-1:-1;2428:55:1;;2479:1;2476;2469:12;2428:55;2502:73;2567:7;2562:2;2549:16;2544:2;2540;2536:11;2502:73;:::i;:::-;2492:83;;;1787:794;;;;;;;:::o;2586:315::-;2651:6;2659;2712:2;2700:9;2691:7;2687:23;2683:32;2680:52;;;2728:1;2725;2718:12;2680:52;2767:9;2754:23;2786:31;2811:5;2786:31;:::i;:::-;2836:5;-1:-1:-1;2860:35:1;2891:2;2876:18;;2860:35;:::i;:::-;2850:45;;2586:315;;;;;:::o;2906:::-;2974:6;2982;3035:2;3023:9;3014:7;3010:23;3006:32;3003:52;;;3051:1;3048;3041:12;3003:52;3090:9;3077:23;3109:31;3134:5;3109:31;:::i;:::-;3159:5;3211:2;3196:18;;;;3183:32;;-1:-1:-1;;;2906:315:1:o;3226:383::-;3303:6;3311;3319;3372:2;3360:9;3351:7;3347:23;3343:32;3340:52;;;3388:1;3385;3378:12;3340:52;3427:9;3414:23;3446:31;3471:5;3446:31;:::i;:::-;3496:5;3548:2;3533:18;;3520:32;;-1:-1:-1;3599:2:1;3584:18;;;3571:32;;3226:383;-1:-1:-1;;;3226:383:1:o;3614:385::-;3689:6;3697;3705;3758:2;3746:9;3737:7;3733:23;3729:32;3726:52;;;3774:1;3771;3764:12;3726:52;3813:9;3800:23;3832:31;3857:5;3832:31;:::i;:::-;3882:5;-1:-1:-1;3934:2:1;3919:18;;3906:32;;-1:-1:-1;3957:36:1;3989:2;3974:18;;3957:36;:::i;:::-;3947:46;;3614:385;;;;;:::o;4004:245::-;4062:6;4115:2;4103:9;4094:7;4090:23;4086:32;4083:52;;;4131:1;4128;4121:12;4083:52;4170:9;4157:23;4189:30;4213:5;4189:30;:::i;4254:249::-;4323:6;4376:2;4364:9;4355:7;4351:23;4347:32;4344:52;;;4392:1;4389;4382:12;4344:52;4424:9;4418:16;4443:30;4467:5;4443:30;:::i;4779:450::-;4848:6;4901:2;4889:9;4880:7;4876:23;4872:32;4869:52;;;4917:1;4914;4907:12;4869:52;4957:9;4944:23;4990:18;4982:6;4979:30;4976:50;;;5022:1;5019;5012:12;4976:50;5045:22;;5098:4;5090:13;;5086:27;-1:-1:-1;5076:55:1;;5127:1;5124;5117:12;5076:55;5150:73;5215:7;5210:2;5197:16;5192:2;5188;5184:11;5150:73;:::i;5234:635::-;5314:6;5367:2;5355:9;5346:7;5342:23;5338:32;5335:52;;;5383:1;5380;5373:12;5335:52;5416:9;5410:16;5449:18;5441:6;5438:30;5435:50;;;5481:1;5478;5471:12;5435:50;5504:22;;5557:4;5549:13;;5545:27;-1:-1:-1;5535:55:1;;5586:1;5583;5576:12;5535:55;5615:2;5609:9;5640:48;5656:31;5684:2;5656:31;:::i;5640:48::-;5711:2;5704:5;5697:17;5751:7;5746:2;5741;5737;5733:11;5729:20;5726:33;5723:53;;;5772:1;5769;5762:12;5723:53;5785:54;5836:2;5831;5824:5;5820:14;5815:2;5811;5807:11;5785:54;:::i;5874:180::-;5933:6;5986:2;5974:9;5965:7;5961:23;5957:32;5954:52;;;6002:1;5999;5992:12;5954:52;-1:-1:-1;6025:23:1;;5874:180;-1:-1:-1;5874:180:1:o;6059:248::-;6124:6;6132;6185:2;6173:9;6164:7;6160:23;6156:32;6153:52;;;6201:1;6198;6191:12;6153:52;6237:9;6224:23;6214:33;;6266:35;6297:2;6286:9;6282:18;6266:35;:::i;6312:389::-;6391:6;6399;6407;6415;6468:3;6456:9;6447:7;6443:23;6439:33;6436:53;;;6485:1;6482;6475:12;6436:53;6521:9;6508:23;6498:33;;6550:35;6581:2;6570:9;6566:18;6550:35;:::i;:::-;6540:45;;6604:36;6636:2;6625:9;6621:18;6604:36;:::i;:::-;6594:46;;6659:36;6691:2;6680:9;6676:18;6659:36;:::i;:::-;6649:46;;6312:389;;;;;;;:::o;6706:250::-;6772:6;6780;6833:2;6821:9;6812:7;6808:23;6804:32;6801:52;;;6849:1;6846;6839:12;6801:52;6885:9;6872:23;6862:33;;6914:36;6946:2;6935:9;6931:18;6914:36;:::i;6961:257::-;7002:3;7040:5;7034:12;7067:6;7062:3;7055:19;7083:63;7139:6;7132:4;7127:3;7123:14;7116:4;7109:5;7105:16;7083:63;:::i;:::-;7200:2;7179:15;-1:-1:-1;;7175:29:1;7166:39;;;;7207:4;7162:50;;6961:257;-1:-1:-1;;6961:257:1:o;7223:185::-;7265:3;7303:5;7297:12;7318:52;7363:6;7358:3;7351:4;7344:5;7340:16;7318:52;:::i;:::-;7386:16;;;;;7223:185;-1:-1:-1;;7223:185:1:o;7413:973::-;7498:12;;7463:3;;7553:1;7573:18;;;;7626;;;;7653:61;;7707:4;7699:6;7695:17;7685:27;;7653:61;7733:2;7781;7773:6;7770:14;7750:18;7747:38;7744:161;;;7827:10;7822:3;7818:20;7815:1;7808:31;7862:4;7859:1;7852:15;7890:4;7887:1;7880:15;7744:161;7921:18;7948:104;;;;8066:1;8061:319;;;;7914:466;;7948:104;-1:-1:-1;;7981:24:1;;7969:37;;8026:16;;;;-1:-1:-1;7948:104:1;;8061:319;28002:1;27995:14;;;28039:4;28026:18;;8155:1;8169:165;8183:6;8180:1;8177:13;8169:165;;;8261:14;;8248:11;;;8241:35;8304:16;;;;8198:10;;8169:165;;;8173:3;;8363:6;8358:3;8354:16;8347:23;;7914:466;;;;;;;7413:973;;;;:::o;9113:2257::-;10221:66;10216:3;10209:79;10191:3;10317:6;10311:13;10333:62;10388:6;10383:2;10378:3;10374:12;10367:4;10359:6;10355:17;10333:62;:::i;:::-;10459:66;10454:2;10414:16;;;10446:11;;;10439:87;10551:13;;10573:63;10551:13;10622:2;10614:11;;10607:4;10595:17;;10573:63;:::i;:::-;10701:66;10696:2;10655:17;;;;10688:11;;;10681:87;10793:13;;10815:63;10793:13;10864:2;10856:11;;10849:4;10837:17;;10815:63;:::i;:::-;10943:66;10938:2;10897:17;;;;10930:11;;;10923:87;-1:-1:-1;;;11034:3:1;11026:12;;11019:44;11088:13;;11110:64;11088:13;11159:3;11151:12;;11144:4;11132:17;;11110:64;:::i;:::-;11190:174;11220:143;11246:116;11276:85;11302:58;11355:3;11344:8;11340:2;11336:17;11332:27;8601:66;8589:79;;-1:-1:-1;;;8693:2:1;8684:12;;8677:36;8738:2;8729:12;;8524:223;11302:58;11294:6;11276:85;:::i;:::-;8959:66;8947:79;;-1:-1:-1;;;9051:2:1;9042:12;;9035:39;9099:2;9090:12;;8882:226;11246:116;11238:6;11220:143;:::i;:::-;-1:-1:-1;;;8456:30:1;;8511:1;8502:11;;8391:128;11190:174;11183:181;9113:2257;-1:-1:-1;;;;;;;;;;9113:2257:1:o;11375:1675::-;-1:-1:-1;;;12159:43:1;;12141:3;12221:46;12264:1;12255:11;;12247:6;12221:46;:::i;:::-;12296:6;12290:13;12312:52;12357:6;12353:2;12346:4;12338:6;12334:17;12312:52;:::i;:::-;12424:66;12386:15;;12410:81;;;12510:49;12555:2;12544:14;;12536:6;12510:49;:::i;:::-;12500:59;;12590:6;12584:13;12606:54;12651:8;12647:2;12640:4;12632:6;12628:17;12606:54;:::i;:::-;-1:-1:-1;;;12682:17:1;;12708:63;;;12790:49;12835:2;12824:14;;12816:6;12790:49;:::i;:::-;12780:59;;12870:6;12864:13;12886:54;12931:8;12927:2;12920:4;12912:6;12908:17;12886:54;:::i;:::-;-1:-1:-1;;;12962:17:1;;12988:27;;;13042:1;13031:13;;11375:1675;-1:-1:-1;;;;;;;;11375:1675:1:o;13055:2010::-;-1:-1:-1;;;13999:57:1;;14079:13;;13981:3;;14101:62;14079:13;14151:2;14142:12;;14135:4;14123:17;;14101:62;:::i;:::-;-1:-1:-1;;;14222:2:1;14182:16;;;14214:11;;;14207:67;14293:46;14335:2;14327:11;;14319:6;14293:46;:::i;:::-;-1:-1:-1;;;14348:26:1;;14399:13;;14283:56;;-1:-1:-1;14421:62:1;14399:13;14470:1;14462:10;;14455:4;14443:17;;14421:62;:::i;:::-;-1:-1:-1;;;14543:1:1;14502:17;;;;14535:10;;;14528:60;14613:13;;14635:63;14613:13;14684:2;14676:11;;14669:4;14657:17;;14635:63;:::i;:::-;14763:66;14758:2;14717:17;;;;14750:11;;;14743:87;-1:-1:-1;;;14854:2:1;14846:11;;14839:37;14901:13;;14923:63;14901:13;14972:2;14964:11;;14957:4;14945:17;;14923:63;:::i;:::-;15002:57;15055:2;15044:8;15040:2;15036:17;15032:26;-1:-1:-1;;;8817:27:1;;8869:1;8860:11;;8752:125;15002:57;14995:64;13055:2010;-1:-1:-1;;;;;;;;;13055:2010:1:o;15070:448::-;15332:31;15327:3;15320:44;15302:3;15393:6;15387:13;15409:62;15464:6;15459:2;15454:3;15450:12;15443:4;15435:6;15431:17;15409:62;:::i;:::-;15491:16;;;;15509:2;15487:25;;15070:448;-1:-1:-1;;15070:448:1:o;15523:426::-;-1:-1:-1;;;15780:3:1;15773:24;15755:3;15826:6;15820:13;15842:61;15896:6;15892:1;15887:3;15883:11;15876:4;15868:6;15864:17;15842:61;:::i;:::-;15923:16;;;;15941:1;15919:24;;15523:426;-1:-1:-1;;15523:426:1:o;15954:460::-;16171:6;16166:3;16159:19;16233:26;16229:31;16220:6;16216:2;16212:15;16208:53;16203:2;16198:3;16194:12;16187:75;16141:3;16291:6;16285:13;16307:60;16360:6;16355:2;16350:3;16346:12;16341:2;16333:6;16329:15;16307:60;:::i;:::-;16387:16;;;;16405:2;16383:25;;15954:460;-1:-1:-1;;;;15954:460:1:o;16627:488::-;-1:-1:-1;;;;;16896:15:1;;;16878:34;;16948:15;;16943:2;16928:18;;16921:43;16995:2;16980:18;;16973:34;;;17043:3;17038:2;17023:18;;17016:31;;;16821:4;;17064:45;;17089:19;;17081:6;17064:45;:::i;:::-;17056:53;16627:488;-1:-1:-1;;;;;;16627:488:1:o;17312:217::-;17459:2;17448:9;17441:21;17422:4;17479:44;17519:2;17508:9;17504:18;17496:6;17479:44;:::i;19034:414::-;19236:2;19218:21;;;19275:2;19255:18;;;19248:30;19314:34;19309:2;19294:18;;19287:62;-1:-1:-1;;;19380:2:1;19365:18;;19358:48;19438:3;19423:19;;19034:414::o;26467:410::-;26669:2;26651:21;;;26708:2;26688:18;;;26681:30;26747:34;26742:2;26727:18;;26720:62;-1:-1:-1;;;26813:2:1;26798:18;;26791:44;26867:3;26852:19;;26467:410::o;27458:275::-;27529:2;27523:9;27594:2;27575:13;;-1:-1:-1;;27571:27:1;27559:40;;27629:18;27614:34;;27650:22;;;27611:62;27608:88;;;27676:18;;:::i;:::-;27712:2;27705:22;27458:275;;-1:-1:-1;27458:275:1:o;27738:186::-;27786:4;27819:18;27811:6;27808:30;27805:56;;;27841:18;;:::i;:::-;-1:-1:-1;27907:2:1;27886:15;-1:-1:-1;;27882:29:1;27913:4;27878:40;;27738:186::o;28055:128::-;28095:3;28126:1;28122:6;28119:1;28116:13;28113:39;;;28132:18;;:::i;:::-;-1:-1:-1;28168:9:1;;28055:128::o;28188:120::-;28228:1;28254;28244:35;;28259:18;;:::i;:::-;-1:-1:-1;28293:9:1;;28188:120::o;28313:168::-;28353:7;28419:1;28415;28411:6;28407:14;28404:1;28401:21;28396:1;28389:9;28382:17;28378:45;28375:71;;;28426:18;;:::i;:::-;-1:-1:-1;28466:9:1;;28313:168::o;28486:125::-;28526:4;28554:1;28551;28548:8;28545:34;;;28559:18;;:::i;:::-;-1:-1:-1;28596:9:1;;28486:125::o;28616:258::-;28688:1;28698:113;28712:6;28709:1;28706:13;28698:113;;;28788:11;;;28782:18;28769:11;;;28762:39;28734:2;28727:10;28698:113;;;28829:6;28826:1;28823:13;28820:48;;;-1:-1:-1;;28864:1:1;28846:16;;28839:27;28616:258::o;28879:380::-;28958:1;28954:12;;;;29001;;;29022:61;;29076:4;29068:6;29064:17;29054:27;;29022:61;29129:2;29121:6;29118:14;29098:18;29095:38;29092:161;;;29175:10;29170:3;29166:20;29163:1;29156:31;29210:4;29207:1;29200:15;29238:4;29235:1;29228:15;29092:161;;28879:380;;;:::o;29264:135::-;29303:3;-1:-1:-1;;29324:17:1;;29321:43;;;29344:18;;:::i;:::-;-1:-1:-1;29391:1:1;29380:13;;29264:135::o;29404:112::-;29436:1;29462;29452:35;;29467:18;;:::i;:::-;-1:-1:-1;29501:9:1;;29404:112::o;29521:127::-;29582:10;29577:3;29573:20;29570:1;29563:31;29613:4;29610:1;29603:15;29637:4;29634:1;29627:15;29653:127;29714:10;29709:3;29705:20;29702:1;29695:31;29745:4;29742:1;29735:15;29769:4;29766:1;29759:15;29785:127;29846:10;29841:3;29837:20;29834:1;29827:31;29877:4;29874:1;29867:15;29901:4;29898:1;29891:15;29917:127;29978:10;29973:3;29969:20;29966:1;29959:31;30009:4;30006:1;29999:15;30033:4;30030:1;30023:15;30049:127;30110:10;30105:3;30101:20;30098:1;30091:31;30141:4;30138:1;30131:15;30165:4;30162:1;30155:15;30181:131;-1:-1:-1;;;;;30256:31:1;;30246:42;;30236:70;;30302:1;30299;30292:12;30317:131;-1:-1:-1;;;;;;30391:32:1;;30381:43;;30371:71;;30438:1;30435;30428:12
Swarm Source
ipfs://06731cb67252eb84a25ba6c8f4dfe676857c6017b41fd69b056ad11443e6c4ac
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.